潘炳征PAN Bing-zheng
(廣西師范大學(xué)計算機(jī)科學(xué)與工程學(xué)院/軟件學(xué)院,桂林 541004)
鴻蒙是基于微內(nèi)核的全場景分布式操作系統(tǒng)[1]。物聯(lián)網(wǎng)設(shè)備的多樣性與現(xiàn)有操作系統(tǒng)特異性阻礙著設(shè)備間的有效協(xié)同,而鴻蒙從操作系統(tǒng)、設(shè)備通信及應(yīng)用程序等方面進(jìn)行了相應(yīng)的統(tǒng)一,有效解決了物聯(lián)網(wǎng)設(shè)備之間互聯(lián)的問題。
鴻蒙響應(yīng)物聯(lián)網(wǎng)時代的召喚,并非對標(biāo)安卓與IOS[2],借助微內(nèi)核、分布式等技術(shù)實(shí)現(xiàn)設(shè)備的全場景化,為用戶帶來一致、高效的體驗(yàn)。
鴻蒙應(yīng)用程序包由一個或若干個HAP 與pack.info 構(gòu)成,pack.info 用來描述每一HAP 的屬性。HAP 分為主HAP(簡稱Entry)與特征HAP(簡稱Feature),Entry 即針對特定設(shè)備的應(yīng)用程序入口,F(xiàn)eature 即應(yīng)用程序的動態(tài)特征模塊[3]。不同設(shè)備可根據(jù)不同的需求下載安裝不同的HAP,如此不必下載安裝整個應(yīng)用程序包,節(jié)省設(shè)備的存儲空間。程序包結(jié)構(gòu)如圖1 所示,該圖來源于鴻蒙開發(fā)者官網(wǎng)[3]。
圖1 鴻蒙應(yīng)用程序包結(jié)構(gòu)
Ability 是應(yīng)用能力的抽象,類型分為FA 與PA 兩種。FA 即Page Ability,PA 包括Service Ability 與Data Ability。一個PageAbility 由一個或若干個AbilitySlice 構(gòu)成,AbilitySlice 包含應(yīng)用程序單個頁面及其所有控制邏輯[4]。
Intent 用于對象之間傳遞信息,可通過其指定啟動目標(biāo)同時攜帶數(shù)據(jù),由Operation 以及Parameters 構(gòu)成[5]。常用于啟動與導(dǎo)航到Ability。
鴻蒙提供Java UI 框架與方舟開發(fā)框架。Java UI 提供細(xì)粒度的UI 編程接口,采用命令式編程規(guī)范,擁有最為豐富的API,使開發(fā)者更加靈活地進(jìn)行鴻蒙應(yīng)用開發(fā)。方舟開發(fā)框架提供高層UI 描述,采用聲明式編程規(guī)范,使開發(fā)更簡單,但其API 較為有限。鴻蒙生態(tài)尚屬于發(fā)展初期,組件相對缺乏,筆者認(rèn)為一些簡單功能的實(shí)現(xiàn)較目前主流的框架更繁瑣。
分布式數(shù)據(jù)庫是一種NoSQL 數(shù)據(jù)庫,采用鍵值對的形式組織、索引與存儲數(shù)據(jù)。
單版本分布式數(shù)據(jù)庫,以單個鍵值對為單位的形式將數(shù)據(jù)保存在本地,有且僅有一個鍵,當(dāng)一條數(shù)據(jù)在本地被修改時則會直接進(jìn)行修改,同時將最新的數(shù)據(jù)同步至遠(yuǎn)端設(shè)備。[6]
KvManagerConfig:用于配置KvManager 相關(guān)信息,包括應(yīng)用與網(wǎng)絡(luò)狀態(tài)等。
KvManagerFactory:根據(jù)KvManagerConfig 創(chuàng)建分布式數(shù)據(jù)庫的KvManager。
Options:用于配置KvStore 相關(guān)信息,包括數(shù)據(jù)庫備份、加密與自動同步選項(xiàng)等。
KvManager:負(fù)責(zé)管理分布式數(shù)據(jù)庫,根據(jù)Options 對分布式數(shù)據(jù)庫KvStore 進(jìn)行創(chuàng)建、打開、關(guān)閉與刪除操作。
KvStore:某一具體分布式數(shù)據(jù)庫,可對數(shù)據(jù)進(jìn)行增加、刪除、查詢與修改。
五者之間關(guān)系如圖2。
圖2 分布式數(shù)據(jù)庫對象之間關(guān)系
分布式數(shù)據(jù)服務(wù)包括服務(wù)接口、服務(wù)組件、存儲組件、同步組件以及通信適配層。應(yīng)用調(diào)用分布式數(shù)據(jù)服務(wù)接口進(jìn)行數(shù)據(jù)庫操作,數(shù)據(jù)服務(wù)接口基于數(shù)據(jù)服務(wù)組件所提供的能力將數(shù)據(jù)保存至存儲組件,存儲組件通過調(diào)用同步組件進(jìn)行同步數(shù)據(jù),同步組件將數(shù)據(jù)發(fā)送至通信適配層以此實(shí)現(xiàn)遠(yuǎn)端設(shè)備的數(shù)據(jù)同步;遠(yuǎn)端設(shè)備利用同步組件從通信適配層接受數(shù)據(jù),并同步至本端存儲組件,通過數(shù)據(jù)服務(wù)接口獲取數(shù)據(jù)并提供給本端應(yīng)用使用[7]。數(shù)據(jù)分布式運(yùn)作機(jī)制如圖3 所示,該圖來源于鴻蒙開發(fā)者官網(wǎng)[7]。
圖3 分布式運(yùn)作機(jī)制
應(yīng)用基于Codelabs 中的分布式手寫板以及AI 能力的語音播報系統(tǒng)案例進(jìn)行開發(fā)[7]。
主界面如圖4 所示,點(diǎn)擊不同的按鈕跳轉(zhuǎn)到不同的PageAbility。
圖4 主界面
PageAbility 之間的跳轉(zhuǎn)實(shí)現(xiàn)步驟如下:
①為組件設(shè)置點(diǎn)擊事件,后續(xù)操作在事件中編寫。②創(chuàng)建Intent 對象。③創(chuàng)建Operation 對象,設(shè)置與Intent對象相關(guān)的設(shè)備Id、包名以及Ability 名稱參數(shù),調(diào)用build()方法完成創(chuàng)建。④將Operation 對象設(shè)置到步驟②所創(chuàng)建的Intent 對象。⑤MainAbilitySlice 調(diào)用startAbility()方法,參數(shù)為Intent 對象。
實(shí)現(xiàn)分布式畫板需要在config.json 文件中配置多設(shè)備協(xié)同所要求的的四個權(quán)限。后續(xù)實(shí)現(xiàn)步驟如下。
2.2.1 初始化分布式數(shù)據(jù)庫
①創(chuàng)建分布式數(shù)據(jù)庫管理對象。首先在當(dāng)前頁面上下文創(chuàng)建KvManagerConfig 對象,最后根據(jù)該對象創(chuàng)建KvManager 分布式數(shù)據(jù)庫管理器實(shí)例。②創(chuàng)建單版本分布式數(shù)據(jù)庫。首先創(chuàng)建Options 對象,其次將Options 對象設(shè)置相關(guān)的信息,最后基于Options 對象以及數(shù)據(jù)庫Id 標(biāo)識符,KvManager 實(shí)例調(diào)用getKvStore()方法獲得與打開單版本分布式數(shù)據(jù)庫實(shí)例。③訂閱分布式數(shù)據(jù)變化。首先在客戶端實(shí)現(xiàn)KvStoreObserver 接口, 本例中即在WriteAbilitySlice 類中定義內(nèi)部類及實(shí)現(xiàn)該接口;其次利用上述內(nèi)部類創(chuàng)建KvStoreObserver 對象;最后基于KvStoreObserver 對象,單版本分布式數(shù)據(jù)庫實(shí)例調(diào)用subscribe()方法完成單版本分布式數(shù)據(jù)庫的數(shù)據(jù)變化訂閱。
2.2.2 初始化畫布
封裝好的DrawPoint 類,存放所有繪制點(diǎn)的基本信息與繪圖[8];drawPoints()方法將數(shù)據(jù)庫中的點(diǎn)數(shù)據(jù)在畫布上繪制。①初始畫布。首先獲取一種畫筆顏色,其次生成DrawPoint 類對象,將該對象添加到布局當(dāng)中,最后調(diào)用drawPoints()方法進(jìn)行繪圖。②設(shè)置DrawPoint 類對象的繪制圖形回調(diào)函數(shù)。首先將點(diǎn)數(shù)據(jù)利用GsonUtil 工具類轉(zhuǎn)換成Json 格式字符串,最后利用單版本分布式數(shù)據(jù)庫實(shí)例調(diào)用putString()方法將Json 字符串寫入數(shù)據(jù)庫。③設(shè)置同步撤回按鈕的點(diǎn)擊事件。首先獲取DrawPoint 類對象中的點(diǎn)數(shù)據(jù);其次先移除點(diǎn)數(shù)據(jù)中的最后一個點(diǎn),再從后往前遍歷所有點(diǎn),將不屬于筆畫中的最后一個點(diǎn)進(jìn)行移除,直到遇到筆畫中的最后一個點(diǎn)結(jié)束循環(huán);最后將點(diǎn)數(shù)據(jù)重新設(shè)置到DrawPoint 類對象,更新單版本分布式數(shù)據(jù)庫實(shí)例。
2.2.3 設(shè)備連接
①在協(xié)同按鈕組件點(diǎn)擊事件中新建在線可同步設(shè)備選擇對話框。②在對話框的點(diǎn)擊事件中,根據(jù)所選設(shè)備Id啟動遠(yuǎn)程界面。首先根據(jù)設(shè)備的數(shù)量生成Intent 對象數(shù)組;其次為每個Intent 對象設(shè)置是否是遠(yuǎn)程、顏色以及數(shù)據(jù)庫標(biāo)識符參數(shù),再創(chuàng)建Operation 對象,同時將設(shè)備Id、包名、Ability 名稱以及多設(shè)備遠(yuǎn)程啟動標(biāo)識與Intent 對象相關(guān)聯(lián);最后啟動遠(yuǎn)程Ability。③在啟動遠(yuǎn)程界面后,單版本數(shù)據(jù)庫實(shí)例調(diào)用sync()方法同步遠(yuǎn)程數(shù)據(jù)庫。
TTS 語音播報引擎由華為官方提供,該引擎基于華為智慧引擎,提供將文本進(jìn)行語音播報的能力[9]。實(shí)現(xiàn)文字播報步驟如下。①創(chuàng)建TTS 客戶端。創(chuàng)建TtsListener 監(jiān)聽器,重寫創(chuàng)建TTS 客戶端成功的回調(diào)函數(shù)。重寫方法如下,首先設(shè)置TtsParams 對象的設(shè)備Id,最后利用TtsParams 對象初始化TTS 客戶端。②轉(zhuǎn)換音頻并播報。在成功創(chuàng)建TTS 客戶端之后,調(diào)用speakText()方法將文本轉(zhuǎn)換成音頻并播放。
在本地端點(diǎn)擊設(shè)備按鈕彈出設(shè)備選擇對話框,選擇設(shè)備之后將拉起遠(yuǎn)程端。每一設(shè)備的筆跡都將同步,不同設(shè)備的筆跡顏色不盡相同,每一設(shè)備都可撤回筆跡。該功能可應(yīng)用于如下場景。親子之間、伙伴之間協(xié)同學(xué)習(xí)娛樂;學(xué)校課堂上師生教學(xué)互動;公司會議上分享交流等等。
聽一聽界面如圖5 所示。
圖5 聽一聽
在文本框輸入文本內(nèi)容后,點(diǎn)擊語音播報按鈕即可進(jìn)行文字播報。該功能可應(yīng)用如下場景。想聽某一段從其他應(yīng)用復(fù)制的文本;知識點(diǎn)的溫故復(fù)習(xí);啞人與他人之間的交流;未受過教育者學(xué)習(xí)漢語;視頻制作的簡易配音等等。
本文僅從鴻蒙分布式以及AI 能力的簡單應(yīng)用進(jìn)行研究,而鴻蒙有眾多的能力與特性,其應(yīng)用的場景廣泛,這需要廣大開發(fā)者積極探索。鴻蒙作為國產(chǎn)操作系統(tǒng)的希望,其誕生是突破國外科技封鎖的重要里程碑,其生態(tài)建設(shè)需要每一開發(fā)者的積極努力。