尝试轻量系统上的软总线应用

项目概述
可能有些同学已经接触过了标准系统上的软总线应用开发,但是你玩过轻量系统上的软总线应用吗?现在它来了。我们利用openatom openharmony 3.1 release(以下简称“openharmony”)版本的轻量系统软总线能力,将智能燃气检测设备和智能窗户通风设备组成一个轻量级分布式网络,实现设备之间的相互控制。 原理图如下:
以下是实际操作效果: 当家中的燃气告警时,无需任何操作,直接控制窗户通风系统中的电机工作。  
开发说明
从上面的视频中可以看到,相关案例设备的应用界面都可以分成外设交互页面和软总线操作页面两大块。在下面的系统框图中可以看到相关页面和其依赖的相关轻量系统能力。例如外设交互界面通过自定义jsi接口与设备硬件打交道,软总线操作界面则通过轻量系统的设备管理能力、软总线能力来实现设备间的发现、认证、传输等软总线操作。
在下面的内容中我们将以智能燃气告警器设备为例,将相关开发过程分成js应用端开发、自定义jsi实现、开发板端代码三部分来说明:
js应用开发
燃气告警器js应用是基于3.1 release版本,并结合方舟开发框架(arkui)、分布式组网等特性,使用js语言开发的一款分布式安全厨房应用。为了体现了 openharmony轻量级分布式特性,不仅需要考虑页面该如何设计、应用怎样同外设交互,还需要考虑两个轻量级设备间如何进行设备认证,设备间如何进行通讯等问题。
所以在相关应用中设计了操作页面,报警页面以及设备认证页面。其中首页是设置燃气浓度阈值,以及显示当前燃气浓度;报警页面是当首页检测到当前燃气浓度达到或高于我们设置的阈值时,会从首页跳转到报警界面;设备认证页面则是对两台设备进行分布式组网。
代码结构如下图:
外设交互页面开发
相关界面如上图所示,我们将首页页面分成三个部分:顶部标签、燃气浓度显示、设置告警阈值。接下来是具体的解析内容:
1)顶部标签解析
顶部标签中除了相关文本界面,主要是顶部两个按钮,分别用来显示当前wi-fi连接状态以及跳转到设备认证页面。
getkey() { com.get({ // 获取wifi状态 key: 'storage_key', success: (data)=> { let res = json.parse(data) if (res.wifi) { if(res.wifi == 'connected') { this.iswifi = true; } else { this.iswifi = false; } } ..... }, }); }, changepage(operation) { router.replace({ uri:pages/dm/dm // 跳转到设备认证页面 });    }
2)燃气浓度显示
主要是获取当前燃气浓度,并实时刷新到相关界面上。
oninit() { settimeout(()=>{ setinterval(()=>this.getkey(),500) // 每500ms 获取一次 },3000); }, getkey() { com.get({ key: 'storage_key', success: (data)=> { let res = json.parse(data) if (res.currentgasconc) { this.currentvalue = res.currentgasconc; this.progresspercent = ((this.currentvalue ) /300) * 100 if(this.currentvalue >this.presetvalue && !this.ischange){ this.ischange = true; router.replace({ uri:pages/warn/warn // 燃气数值超标后自动跳转告警页面 }); } } }, ...... });    },
3)设置报警阈值
首页界面中对于报警阈值的处理,主要包含减小预设阈值和增大预设阈值,都是通过调用相关setkey操作完成的。
reduceprogress(){ //减小预设阈值 if (this.presetvalue = 300) { this.presetvalue = 300 }else{ this.presetvalue = parseint(this.presetvalue) + 20 } this.ischange = false; this.setprogress = ((this.presetvalue ) /300) * 100 this.setkey( 'gasthreshold', this.presetvalue ); }, setkey(key1, value1) { com.set({ key: key1 + '', value: value1 + '', // success or failed 状态打印 });    }, 设备认证页面开发
相关界面如上图所示,我们将设备认证步骤分成四个步骤:发现设备、发起认证、允许认证、输入pin码。接下来是具体的解析内容:
1)发现设备解析
设备认证因设备状态不同显示对应的ui,上图显示的ui对应设备状态”status = start“。
startdevice(){ this.subscribeid = math.floor(math.random() * 10000 + 1000) var info = { subscribeid: this.subscribeid, // 特定随机的 mode: 0xaa, // 设置主动发现模式,除此之外还有被动模式discover_mode_passive medium: 0, // 自动选择发现介质,目前用的是coap freq: 2, // 发送发现消息的频率,目前用的是high 还有low/mid/super_high issameaccount: false, // 取消同一账号下才能发现的限制 iswakeremote: false, // 目前轻量系统没有睡眠模式,所以不用睡眠唤醒功能 capability: 0 // 目前使用ddmp devicemanager.startdevicediscovery(info); // 开始设备发现    },  2)发起认证解析
authenticatedevice(){ // 发起认证 let extrainfo = { targetpkgname: 'test', appname: newname, appdescription: testapp, business: '0', displayowner: 0 }; let authparam = { authtype: 1, // 以pin 码方式进行认证校验 appicon:null, appthumbnail:null, extrainfo: extrainfo }; let _this = this; devicemanager.authenticatedevice(this.statusinfo, authparam, { // 省略了相关success 和fail 回调处理,完整代码见参考链接        },
3)允许认证解析 
当设备状态”status = join-pin“,允许相关认证动作并且显示相关pin码。
joinauthok() { this.joinpin() //切换显示pin码界面 this.initstatue() //获取pin码并显示 devicemanager.setuseroperation(0) }, initstatue() { this.log('initstatue') const data = devicemanager.getauthenticationparam() // 参数值转换为 json 字符串写入data this.log('getauthenticationparam:' + json.stringify(data)) // authentication type, 1 for pin code. // ode ==1,pin码 if (data && data.authtype == 1) { // 完整代码见参考链接 }    },
4)输入pin码解析
当设备状态status = main-pin,进到相关pin码输入、校验界面。
maininputpin(s) { // 输入六位数字 if (this.pinnumb == 6) return if (this.pinnumb registerservice((service *)&g_miniservice); samgr_getinstance()->registerdefaultfeatureapi(mini_service, get_iunknown(g_miniservice));
设备管理服务注册
如果没注册设备管理服务,那么相关软总线能力也就无从谈起。在轻量系统启动时,执行相关设备管理服务初始化动作,具体内容如下:
1)创建相关的静态服务对象;
static devicemanagersamgrservice service = { .getname = getname, // 相关服务名为dev_mgr_svc .initialize = initialize, .messagehandle = messagehandle, .gettaskconfig = gettaskconfig,    };  2)注册相关的服务和缺省对象;
samgr_getinstance()->registerservice((service *)&service)) ;samgr_getinstance()->registerdefaultfeatureapi(device_manager_service_name, get_iunknown(service));  3)执行相关初始化动作。devicemanager服务的初始化函数将完成相关状态回调注册和传输通道初始化,然后执行相关publish动作,做好接收发现消息的准备。
设备间rpc通信
在标准系统应用开发中,我们可以通过分布式数据库和启动远程ability的方式实现设备之间的通信,而在轻量系统中则通过rpc的方法来实现。在前面的内容中我们讲了服务的概念,下面是拓展的相关原理图:
consumer:服务的消费者,调用服务提供的功能(对外接口)。
在完成软总线组网后,如果检测到燃气度数超标后,按如下步骤即可实现对智能通风设备的控制:
1.获取软总线网络中的相关节点信息;
getallnodedeviceinfo(com.ohos.devicemanagerui, &nodeinfo, &infonum);  2.获取远程节点发布的mini_sa_rpc服务中对应的iunknown方法;
iunknown *minidefapi = samgr_getinstance()->getremotedefaultfeatureapi(nodeinfo[0]->networkid, mini_sa_rpc);  3.查询服务所发布的相关能力,获取指向具体api接口的指针miniinterface;
minidefapi->queryinterface(minidefapi, 0, (void **) &miniinterface);  4.调用相关mini_sa_rpc对外提供的invoke能力;
miniinterface->invoke(miniinterface, 1, &reply, null, null);
操作体验
1. 提前准备好安全厨房场景中的智能窗户通风设备和智能燃气告警设备,并完成相关的编译和应用安装动作;
2. 提前准备好正常工作的无线路由设备(请保证预设热点名称:test_wifi 密码:12345678;是否能连接互联网均可)
3. 将燃气检测设备和窗户通风设备上电,确认两个设备应用启动正常和操作正常;
4. 按如下步骤将通风设备、燃气检测设备组成一个软总线网络:
● 分别点击两个设备应用界面右上角的软总线配置图标,进入软总线配置界面;
● 点击智能燃气检测设备应用发现图标,间隔3s后点击发起认证图标;
● 点击智能通风设备软总线配置界面下的允许认证图标,正常情况下会显示一个6位数的pin码;
● 点击智能燃气检测设备应用输入pin码按钮,进入数字键盘输入pin码;
● 分别点击两个应用软总线配置图标左上角的返回按键,进入设备控制界面。
5. 设置燃气检测设备的阈值低于实际读取的燃气数值,燃气检测应用进入警报界面的同时会控制电机工作,自动通风换气,保证家居的安全。待到实际燃气数值低于设置的阈值时,则关闭电机。
参考链接
本项目中涉及到的参考资料和相关文档路径如下:
欧智通bes2600wm开发板快速上手学习路径:
https://growing.openharmony.cn/mainplay/learnpathmaps?id=17
轻量系统应用开发软总线视频课程:
https://www.bilibili.com/video/bv1bs4y1a7ry/?vd_source=fa133082ba4f0aaa5d2dae4f0a981ab3
设备管理模块文档:
https://gitee.com/openharmony/device_manager/blob/master/readme_zh.md
智能燃气检测系统样例:
https://growing.openharmony.cn/mainplay/detail?sampleid=3935
智能窗户通风系统样例:
https://growing.openharmony.cn/mainplay/detail?sampleid=3936
总结
从本文中可以看到与标准系统一样应用都是调用设备管理模块提供的相关接口来实现的软总线发现、认证等功能,但是不同的地方在于标准系统使用了预制的devicemanager_ui.hap来显示pin码、输入pin码。而轻量系统软总线应用中,相关pin码显示、pin码输入需要自己调用相关接口。
与标准系统软总线应用相比,目前轻量系统软总线应用只实现了轻量系统设备之前数据流转功能,轻量系统分布式拉起、分布式数据库等功能待后续更新迭代。下一步还将研究如何利用软总线来连接轻量系统和标准系统,敬请大家期待。
丰富多样的openharmony开发样例离不开广大合作伙伴和开发者的贡献,如果你也想把自己开发的样例分享出来,欢迎提交到openharmony知识体系sig仓库。


Spectrum仪器推出GHz速度数字化仪系统,最高可提供16通道
天翼云DPU技术研究和实践
三维激光扫描仪对电子产品塑胶件手办件精密塑料件的快速扫描
看一下多片FPGA原型验证系统的时钟同步
伺服电机安装步骤、安装注意事项、轴承更换
尝试轻量系统上的软总线应用
丝印机保养
电源测试大全(一):极限测试
单片机晶振电路原理及作用 51单片机晶振怎么接
无线充电发射器及无线充电装置说明和原理
电容电介质故障的处理办法
华为云大数据赋能北港集团发展创新,数字化转型成效显著!
店招新品之创意LED显示屏之LED魔方屏的特点
随着气温升高 空调清洗维修需求增约两成
苹果iOS 15.6.1验证通道关闭 仍可进行降级
揭开光纤“面纱探索线与线的不同
为什么说区块链技术不适合大宗商品交易
关于英特尔助翼创客大赛的详细内容介绍
矩形脉冲信号的分解和合成
电池储能4大核心子系统:看恩智浦微处理器如何全面赋能!