孫健



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