孫健



關鍵詞:HarmonyOS;智能家居;云平臺
0 引言
HarmonyOS 是華為基于OpenHarmony 開源項目開發的面向多場景智能設備的商用版本,在遵循AOSP(Android Open Source Project) 的開源許可上實現的新一代智能終端操作系統[1]。在我國信創產業蓬勃發展的背景下,HarmonyOS比Android在物聯網領域具有先天優勢[2]。在物聯網諸多應用場景中,智能家居是物聯網技術融入生活的典型案例,開發一款基于HarmonyOS的智能家居App既能夠使人們享受到科技發展帶來的便捷,又能夠發展壯大國產自主可控的鴻蒙生態。
1 需求分析
本文采用移動端App+云的技術方案[3],基于Har?monyOS的智能家居App以智能控制家居環境中的空調設備為例,通過溫度傳感器獲取室內溫度信息,并將溫度的數據上報給物聯網云平臺[4]。智能家居App從物聯網云平臺獲取訪問認證后,可查看當前各房間的溫度信息,當需要時可以通過智能家居App遠程控制家中的空調設備進行溫度調節,具體功能的需求描述如下:
1) 進行頁面的設計與開發;
2) 完成App與物聯網云平臺的交互認證;
3) 在頁面上綁定設備;
4) 數據展示界面能展示臥室、客廳溫度傳感器的實時數據;
5) 設備控制界面能實現自動控制、手動控制兩種模式對臥室空調和客廳空調控制工作;
6) 能實時監測設備狀態(在線、離線、運轉情況),有異常時能實現告警提示;
7) 能充分利用了組件的拉伸、占比、延伸和均分能力,配合媒體查詢以及多態組件Swiper,實現在不同的終端設備上有不同的顯示方式,適配不同的設備屏幕形態,從而實現應用的“一次開發,多端部署”。
2 系統總體設計
基于HarmonyOS的智能家居App連接在華為云上用Docker容器技術部署的ThingsBoard物聯網云平臺,通過MQTTBox軟件模擬物聯網設備的數據上報給ThingsBoard,智能家居App成功獲取到ThingsBoard云平臺的安全訪問認證后,從ThingsBoard云平臺獲取設備數據并展示數據,當需要時進行設備監控和遠程控制設備。
3 系統詳細設計
3.1 云平臺搭建
ThingsBoard是一種開源物聯網云平臺[5],智能家居設備數據要上報到ThingsBoard 平臺,需要在ThingsBoard 平臺上有對應的設備信息,因此需要在ThingsBoard平臺上添加并配置設備相關的設備配置、設備之間的關聯關系等信息。
1) 添加設備配置
設備配置主要用于確定設備類型,可通過設備配置信息對設備進行分類過濾,查找到合適的設備進行頁面渲染。智能家居App需要添加2個設備配置,如表1所示。
2) 添加設備
在設備配置添加完成后,需要添加設備。Things?Board平臺中的設備主要作為真實設備的映射,所有真實設備需要在ThingsBoard平臺中創建對應的設備。通過側邊欄單擊設備切換主頁,找到主頁右上角“+”號,選擇添加新設備,輸入設備名稱、設備標簽、選擇添加的設備配置、輸入設備說明、單擊添加,添加后可在設備列表查看到添加的設備信息。智能家居App需要添加4個設備,如表2所示。
3) 添加關聯關系
創建好設備后,傳感器設備和空調設備需相互關聯產生聯系,根據溫度傳感器獲得的溫度控制空調設備。在ThingsBoard平臺中,單擊側邊欄設備,選擇并單擊空調設備,選擇關聯,方向選擇“從”,單擊彈框的右上角“+”號,類型選擇設備。找到相關傳感器設備,單擊添加,即可在關聯列表查看到關聯設備信息,如表3所示。
4) 使用MQTTBox發送遙測數據
MQTT是一種輕量級的基于客戶端-服務器的消息發布/訂閱傳輸協議,實現MQTT協議的通信需要有客戶端和服務器。MQTT協議的通信過程中有三種身份:發布者(Publish) 、消息代理(MQTT Broker) 、訂閱者(Subscribe) 。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器。消息發布者可以同時是消息的訂閱者。MQTT會自動構建底層網絡傳輸,建立客戶端到服務器的連接,提供兩者之間的一個有序的、無損的、基于字節流的雙向傳輸。ThingsBoard物聯網平臺當接入MQTT協議的設備時,此時的ThingsBoard充當MQTT 服務器(MQTT Broker) ,再使用MQTTBox軟件充當客戶端,客戶端模擬真實設備通過MQTT協議連接到ThingsBoard。
在搭建好ThingsBoard后,通過MQTTBox測試連接到該平臺實現設備遙測的測試,按照如下步驟實現。
第一步:雙擊打開MQTTBox 軟件,單擊CreateMQTT Client(創建MQTT客戶端),輸入MQTT ClientName(客戶端名稱),選擇傳輸協議:mqtt/tcp,輸入用戶名:設備的訪問令牌值,輸入遠程服務器的IP 和PORT(Host) ,選擇服務質量(QoS) 選擇1-Atleast Once,單擊Save,頁面跳轉后,出現Connected則證明MQTT?Box客戶端已經連接ThingsBoard平臺。
第二步:MQTTBox連接成功后,輸入遙測主題,選擇服務質量(QoS) 為1-Atleast Once,輸入載荷(Pay?load) :“{"temp":25}”,單擊publish。
第三步:打開ThingsBoard平臺,通過側邊欄單擊設備,找到并單擊連接MQTTBox復制Token的設備,選擇最新遙測值,可查看到MQTTBox 提交的遙測信息。
通過以上方式,按下列參數,將4個設備的模擬遙測數據發送到ThingsBoard對應的設備中,智能家居App設備的主題和負載測試數據如表4所示。
3.2 數據展示
1) 設備數據展示頁面的UI設計
設備數據展示頁面主要用來展示傳感器的狀態信息和設備數據,根據智能家居App的功能需求,需要展示溫度傳感器數據以及空調設備的狀態信息。在view目錄下創建Device.ets文件。
2) 創建數據實體類
根據智能家居App的設備情況,需創建出溫度傳感器和空調兩類設備對應的數據實體類,用來保存從云平臺獲取到的設備信息。
3) 封裝從云平臺獲取數據的方法
頁面設計好后,智能家居App需要從ThingsBoard平臺獲取溫度傳感器設備和空調設備的信息。在Tb?Cloud類中添加獲取溫度傳感器數據的方法、獲取空調設備的方法、獲取空調設備訪問令牌TOKEN的方法、獲取遙測數據的方法以及獲取空調設備關聯的溫度傳感器設備ID的方法。
4) 從云平臺獲取數據并展示在設備頁上
在TbCloud編寫好相應的方法后,則需在Device頁面初始化的時候去獲取設備的各種信息,所以需要在Device.ets文件中的aboutToAppear()方法中編寫代碼。首先需要判斷是否登錄過,接下來創建線程每7秒獲取一次設備信息以及設備遙測信息。
5) 將設備頁放到Tabs中
打開Index.ets頁面,導入設備頁,并修改TabCon?tent中的設備頁為Device。
3.3 設備控制
1) 手動控制設備
通過單擊空調設備的開關圖標,達到控制空調設備的開關效果,所以需在TbCloud中創建修改設備遙測信息的方法。
2) 聯動控制設備
在手動控制完成后,須實現聯動控制設備,也就是設置相應溫度傳感器一個閾值,當前溫度超過閾值時,啟動空調設備,實現手動和自動的聯動控制。因此需先創建彈框,通過單擊設備的編輯按鈕,彈出彈框對自動控制的溫度閾值與自動化/手動化進行切換。故在view 文件夾下創建AirDeviceEditDialog.ets文件。彈框頁面最外層是通過Column組合而成,里面自上而下分別由文本框、橫線、輸入框、選擇器以及確定和取消按鈕組合而成,其中選擇器以及確定和取消按鈕分別用彈性布局進行包裹渲染。
至此,單擊彈框后可將數據進行保存,并再次展示,但若是退出App至后臺,則無法進行聯動控制,故需要在Device.ets的初始化線程中添加一個業務,將持久化的數據讀取并保存到空調設備集合的全局狀態變量中,而當自動化數據可保存后,該數據需在獲取到溫度數據時判斷是否需要開啟空調設備,以達到真實的自動化效果。在Device.ets的初始化線程中,添加一個業務,判斷當前溫度是否超過自動化數據中設定的閾值,如果溫度超過閾值,空調設備未打開并且已經開啟自動化,則打開空調設備
3.4 智能告警
1) 創建告警實體類
告警頁的開發首先需通過面向對象進行考慮,所以需在model文件夾中創建AlarmInfo.ets文件,創建出告警實體類,代碼如下。
2) 持久化告警數據
在common>database文件夾創建AlarmInfoDao.ets用于持久化存儲告警內容。所謂數據管理的存儲方式,底層主要采用SQLite來實現,故首先需初始化數據庫文件名、建表語句、表名稱以及RDB數據庫訪問對象作為全局變量;在構造函數中通過傳入上下文環境對象,獲取RDB數據庫訪問對象,并將該對象設置到全局變量中并執行建表語句;通過RDB數據庫訪問對象即可執行SQL實現數據的增刪改查。
3) 將告警對象設置成全局變量
在設備初始化時,須先初始化告警對象并保存至全局變量中。在EntryAbility 的onCreate()方法中,初始化告警對象,并設置成全局變量。
4) 查詢告警的數據
從數據庫中查詢出來的數據,放在對應的集合中。在viewmodel 文件夾中創建AlarmViewModel.ets文件,用來保存告警信息的數組。
5) 告警信息頁面設計
在view目錄下創建告警展示頁面Alarm.ets,用來展示告警信息列表。其中對告警項的布局進行封裝,在view目錄下創建AlarmItem.ets文件,通過Flex自左向右設置告警圖標、室內溫度和空調設備啟動提示以及創建時間,其中室內溫度和空調設備啟動提醒通過Flex布局再次包裹,并在告警頁的ListItem中進行引入,以便降低代碼冗余,如圖1所示。
4 系統部署
HarmonyOS的組件提供了不同的能力,用來實現一次開發,多端部署。智能家居App在開發過程中使用拉伸、占比、延伸、均分、多態等組件能力,實現一次開發,多端部署。
4.1 組件的拉伸能力
組件的拉伸能力無論在平板或手機屏幕中,當前UI組件都能夠以相同的寬度或高度展示在屏幕中,也就是在設置width、height、margin和padding等屬性的過程中,通過設置百分比,讓該組件可以在不同的屏幕上都保持該寬高和間距,在智能家居App的開發過程中,以告警頁面為例應用組件的拉伸能力,如圖2所示。
4.2 設置組件占比能力
組件的占比能力即通過設置組件的權重屬性lay?outWeight,將頁面中留白的位置在高度或寬度上全部占滿,通過此方式的配置不論在任意分辨率的顯示屏上,都是占滿的效果,以告警頁為例應用組件的占比能力。
4.3 組件的延伸能力
組件延伸能力即當頁面高度不足以支持頁面數據時,能夠自動添加滾動條功能以達到在不同分辨率的顯示屏上進行滑動來展示數據效果,通過List控件自帶的效果即可展示出效果無須添加屬性,此功能以告警頁為例應用組件的延伸能力,如圖3所示。
4.4 組件的均分能力
組件均分能力即通過Flex布局將組件水平或垂直方向地形成合適的擺放效果,以達到在不同的屏幕分辨率下都能夠達到組件均分的效果。在智能家居App中的告警項就是通過Flex的水平均分達到效果,如圖4所示。
4.5 多態組件
多態組件指的是Swiper組件即輪播圖組件,通過該組件的displayCount函數,傳入屏幕中需展示的頁數數量,達到不同的展示效果。在該功能下,只需計算出當前屏幕的分辨率即可根據不同分辨率展示頁數數量,而此功能即媒體查詢功能,即通過媒體查詢出當前的屏幕分辨率,根據分辨率設置Swiper組件的displayCount參數,即可實現一次開發多端部署的能力,如圖5所示。
5 結論
本文主要完成了基于HarmonyOS 的智能家居App的設計與實現,結合ThingsBoard云平臺實現了智能家居數據展示、設備控制、智能告警等工作,并通過多種部署能力達到一次開發,多端部署的效果。