潘炳征PAN Bing-zheng
(广西师范大学计算机科学与工程学院/软件学院,桂林 541004)
鸿蒙是基于微内核的全场景分布式操作系统[1]。物联网设备的多样性与现有操作系统特异性阻碍着设备间的有效协同,而鸿蒙从操作系统、设备通信及应用程序等方面进行了相应的统一,有效解决了物联网设备之间互联的问题。
鸿蒙响应物联网时代的召唤,并非对标安卓与IOS[2],借助微内核、分布式等技术实现设备的全场景化,为用户带来一致、高效的体验。
鸿蒙应用程序包由一个或若干个HAP 与pack.info 构成,pack.info 用来描述每一HAP 的属性。HAP 分为主HAP(简称Entry)与特征HAP(简称Feature),Entry 即针对特定设备的应用程序入口,Feature 即应用程序的动态特征模块[3]。不同设备可根据不同的需求下载安装不同的HAP,如此不必下载安装整个应用程序包,节省设备的存储空间。程序包结构如图1 所示,该图来源于鸿蒙开发者官网[3]。
图1 鸿蒙应用程序包结构
Ability 是应用能力的抽象,类型分为FA 与PA 两种。FA 即Page Ability,PA 包括Service Ability 与Data Ability。一个PageAbility 由一个或若干个AbilitySlice 构成,AbilitySlice 包含应用程序单个页面及其所有控制逻辑[4]。
Intent 用于对象之间传递信息,可通过其指定启动目标同时携带数据,由Operation 以及Parameters 构成[5]。常用于启动与导航到Ability。
鸿蒙提供Java UI 框架与方舟开发框架。Java UI 提供细粒度的UI 编程接口,采用命令式编程规范,拥有最为丰富的API,使开发者更加灵活地进行鸿蒙应用开发。方舟开发框架提供高层UI 描述,采用声明式编程规范,使开发更简单,但其API 较为有限。鸿蒙生态尚属于发展初期,组件相对缺乏,笔者认为一些简单功能的实现较目前主流的框架更繁琐。
分布式数据库是一种NoSQL 数据库,采用键值对的形式组织、索引与存储数据。
单版本分布式数据库,以单个键值对为单位的形式将数据保存在本地,有且仅有一个键,当一条数据在本地被修改时则会直接进行修改,同时将最新的数据同步至远端设备。[6]
KvManagerConfig:用于配置KvManager 相关信息,包括应用与网络状态等。
KvManagerFactory:根据KvManagerConfig 创建分布式数据库的KvManager。
Options:用于配置KvStore 相关信息,包括数据库备份、加密与自动同步选项等。
KvManager:负责管理分布式数据库,根据Options 对分布式数据库KvStore 进行创建、打开、关闭与删除操作。
KvStore:某一具体分布式数据库,可对数据进行增加、删除、查询与修改。
五者之间关系如图2。
图2 分布式数据库对象之间关系
分布式数据服务包括服务接口、服务组件、存储组件、同步组件以及通信适配层。应用调用分布式数据服务接口进行数据库操作,数据服务接口基于数据服务组件所提供的能力将数据保存至存储组件,存储组件通过调用同步组件进行同步数据,同步组件将数据发送至通信适配层以此实现远端设备的数据同步;远端设备利用同步组件从通信适配层接受数据,并同步至本端存储组件,通过数据服务接口获取数据并提供给本端应用使用[7]。数据分布式运作机制如图3 所示,该图来源于鸿蒙开发者官网[7]。
图3 分布式运作机制
应用基于Codelabs 中的分布式手写板以及AI 能力的语音播报系统案例进行开发[7]。
主界面如图4 所示,点击不同的按钮跳转到不同的PageAbility。
图4 主界面
PageAbility 之间的跳转实现步骤如下:
①为组件设置点击事件,后续操作在事件中编写。②创建Intent 对象。③创建Operation 对象,设置与Intent对象相关的设备Id、包名以及Ability 名称参数,调用build()方法完成创建。④将Operation 对象设置到步骤②所创建的Intent 对象。⑤MainAbilitySlice 调用startAbility()方法,参数为Intent 对象。
实现分布式画板需要在config.json 文件中配置多设备协同所要求的的四个权限。后续实现步骤如下。
2.2.1 初始化分布式数据库
①创建分布式数据库管理对象。首先在当前页面上下文创建KvManagerConfig 对象,最后根据该对象创建KvManager 分布式数据库管理器实例。②创建单版本分布式数据库。首先创建Options 对象,其次将Options 对象设置相关的信息,最后基于Options 对象以及数据库Id 标识符,KvManager 实例调用getKvStore()方法获得与打开单版本分布式数据库实例。③订阅分布式数据变化。首先在客户端实现KvStoreObserver 接口, 本例中即在WriteAbilitySlice 类中定义内部类及实现该接口;其次利用上述内部类创建KvStoreObserver 对象;最后基于KvStoreObserver 对象,单版本分布式数据库实例调用subscribe()方法完成单版本分布式数据库的数据变化订阅。
2.2.2 初始化画布
封装好的DrawPoint 类,存放所有绘制点的基本信息与绘图[8];drawPoints()方法将数据库中的点数据在画布上绘制。①初始画布。首先获取一种画笔颜色,其次生成DrawPoint 类对象,将该对象添加到布局当中,最后调用drawPoints()方法进行绘图。②设置DrawPoint 类对象的绘制图形回调函数。首先将点数据利用GsonUtil 工具类转换成Json 格式字符串,最后利用单版本分布式数据库实例调用putString()方法将Json 字符串写入数据库。③设置同步撤回按钮的点击事件。首先获取DrawPoint 类对象中的点数据;其次先移除点数据中的最后一个点,再从后往前遍历所有点,将不属于笔画中的最后一个点进行移除,直到遇到笔画中的最后一个点结束循环;最后将点数据重新设置到DrawPoint 类对象,更新单版本分布式数据库实例。
2.2.3 设备连接
①在协同按钮组件点击事件中新建在线可同步设备选择对话框。②在对话框的点击事件中,根据所选设备Id启动远程界面。首先根据设备的数量生成Intent 对象数组;其次为每个Intent 对象设置是否是远程、颜色以及数据库标识符参数,再创建Operation 对象,同时将设备Id、包名、Ability 名称以及多设备远程启动标识与Intent 对象相关联;最后启动远程Ability。③在启动远程界面后,单版本数据库实例调用sync()方法同步远程数据库。
TTS 语音播报引擎由华为官方提供,该引擎基于华为智慧引擎,提供将文本进行语音播报的能力[9]。实现文字播报步骤如下。①创建TTS 客户端。创建TtsListener 监听器,重写创建TTS 客户端成功的回调函数。重写方法如下,首先设置TtsParams 对象的设备Id,最后利用TtsParams 对象初始化TTS 客户端。②转换音频并播报。在成功创建TTS 客户端之后,调用speakText()方法将文本转换成音频并播放。
在本地端点击设备按钮弹出设备选择对话框,选择设备之后将拉起远程端。每一设备的笔迹都将同步,不同设备的笔迹颜色不尽相同,每一设备都可撤回笔迹。该功能可应用于如下场景。亲子之间、伙伴之间协同学习娱乐;学校课堂上师生教学互动;公司会议上分享交流等等。
听一听界面如图5 所示。
图5 听一听
在文本框输入文本内容后,点击语音播报按钮即可进行文字播报。该功能可应用如下场景。想听某一段从其他应用复制的文本;知识点的温故复习;哑人与他人之间的交流;未受过教育者学习汉语;视频制作的简易配音等等。
本文仅从鸿蒙分布式以及AI 能力的简单应用进行研究,而鸿蒙有众多的能力与特性,其应用的场景广泛,这需要广大开发者积极探索。鸿蒙作为国产操作系统的希望,其诞生是突破国外科技封锁的重要里程碑,其生态建设需要每一开发者的积极努力。