Harmony软总线的简单使用

软总线是什么? 
分布式软总线是手机、平板、智能穿戴、智慧屏、车机等分布式设备的通信基座,为设备之间的互联互通提供了统一的分布式通信能力。
本篇讲到的知识点: 
启动远程fa(feature ability)连接远程pa(particle ability),发送控制命令&远端处理数据(场景1:传递加法数据,远端计算后返回给客户端。场景2:传递数据,远端service接收后更新远端的ui。)fa跨设备迁移(可回迁)混合打包其他奇怪的知识 技术要求和环境要求:基本组件熟练使用,serviceability,commoneventmanager(公共事件开发)两台harmonyos 2.0的真机  或   deveco studio 2.2 beta1(分布式模拟器的自动开启,可同时模拟运行两台设备,且自动组网)。获取deveco studio 2.2 beta1(huawei deveco studio - harmonyos应用开发官网)
service ability(开发-连接service (harmonyos.com))
公共事件开发指导(开发-公共事件开发指导 (harmonyos.com)))
 其他 
真机分布式通信要求:同一局域网内,登录相同华为账号,开启蓝牙 (可行方案),这样在 设定-超级终端 中 附近我的设备  即可查看到另外一台设备。分布式模拟器 会自动组网,不需要手动做其他操作。(设定的超级终端中看不出来已经组网成功)运行到真机上需要进行签名,模拟器则不需要。 代码下载 
gitee harmonysoftbus(harmonysoftbus: harmony软总线的第一次尝试,入门使用。 (gitee.com))
github harmonysoftbus(github - cl18652469346/harmonysoftbus: softbus demo)
 先看下效果 
 代码结构
adapter:deviceslistadapter,用于向listcontainer控件中填充设备数据。component:selectdevicedialog封装了设备选择弹框proxy:定义了连接远程和调用远程service(pa)的接口、实现类以及代理。service:remoteservice为被控制端service,供手机端远程调用。 申请权限 
在entry\src\main\config.json中申请以下4个权限:
ohos.permission.distributed_device_state_change:用于允许监听分布式组网内的设备状态变化。ohos.permission.get_distributed_device_info:用于允许获取分布式组网内的设备列表和设备信息。ohos.permission.get_bundle_info:用于查询其他应用的信息。ohos.permission.distributed_datasync:用于允许不同设备间的数据交换。此外,还需要在实现ability的代码中显式声明需要使用多设备协同访问的权限,示例代码如下:
获取组网内在线的其他设备deviceinfo(id&name) 
 获取自身设备的id 
 启动远程fa
和普通画面的启动类似,withdeviceid() 为本地画面跳转。
跨设备启动需要携带 远程设备的deviceid,以及设置 支持分布式调度系统中的多设备启动flag。
 连接远程pa,发送控制命令&远端处理数据 
第一步: 客户端创建远程连接代理类 
public class myremoteproxy implements iremotebroker { /** * 远端响应成功的标识 */ public static final int err_ok = 0; private static final string tag = myremoteproxy.class.getsimplename(); private final iremoteobject remote; public myremoteproxy(iremoteobject remote) { this.remote = remote; } @override public iremoteobject asobject() { return remote; } // 携带数据向远端sevice发送请求 public int sendatatoremote(int requesttype, map parammap) { messageparcel data = messageparcel.obtain(); messageparcel reply = messageparcel.obtain(); messageoption option = new messageoption(messageoption.tf_sync); int ec = 1; int result = -1; try { if (parammap.get(inputstring) instanceof string) { string inputstring = (string) parammap.get(inputstring); data.writeint(requesttype); data.writestring(inputstring); remote.sendrequest(requesttype, data, reply, option); } ec = reply.readint(); if (ec != err_ok) { logutils.error(tag, remoteexception:); } else { if (requesttype == connectmanageriml.request_plus) { result = reply.readint(); // 返回成功后拿到远端计算的结果。 } } } catch (remoteexception e) { logutils.error(tag, remoteexception:); } finally { ec = err_ok; if (result != -1) { ec = result; } data.reclaim(); reply.reclaim(); } return ec; }} 
实现iremotebroker接口, asobject返回远程remoteobject对象创建构造方法(参数为connectability成功时回调方法onabilityconnectdone中的远程操作对象)封装向远端发送请求的方法,便于后续进行控制  (本例中是简单的加法请求)
messageoption.tf_sync代表同步,意味着会在sendrequest时阻塞等待来自远端service的返回。
远端service返回值是 reply,reply.readint() 默认会返回0,代表请求成功。若是想携带其他返回值,需要在远端service中进行处理,下一步会讲到。
 第二步: 远端service中,创建remoteobject并处理请求 
public class myremote extends remoteobject implements iremotebroker { private myremote() { super(===myservice_remote); } @override public iremoteobject asobject() { return this; } @override public boolean onremoterequest(int code, messageparcel data, messageparcel reply, messageoption option) { logutils.info(tag, ===onremoterequest......); int requesttype = data.readint(); string inputstring = ; if (code == request_send_data) { inputstring = data.readstring(); publishinput(requesttype, inputstring); } else if (code == request_plus) { int a = data.readint(); int b = data.readint(); reply.writeint(err_ok); reply.writeint(a + b); publishplusresult(requesttype, string.valueof(a + b)); } return true; }}@overrideprotected iremoteobject onconnect(intent intent) { super.onconnect(intent); return remote.asobject();} 
onremoterequest 接收来自 sendrequest(requesttype, data, reply, option);  传递过来的请求类型,数据,返回值,请求类型。
一般不需要处理reply,客户端reply.readint() 也会拿到0(表示请求成功),若是需要在远端接收到请求后,需要额外返回数据给客户端,则需要进行write操作。
第三步: 连接远端service
重点都标记了下,这块没啥好讲的,serviceability的基本连接操作。
第四步: 发送命令,远端service处理数据(返回数据、更新ui) 
场景1:传递加法数据,远端计算后返回给客户端
场景2:传递数据,远端service接收后更新远端的ui
远端service在onremoterequest中处理更新ui的请求,远端利用公共事件,进行ui的更新。(意味着也就可以 控制音乐的播放,暂停 等等)
fa跨设备迁移(可回迁) 
跨端迁移开发指导(专题-跨端迁移开发指导 (harmonyos.com))    目的: 实现正在编辑的页面,流转的另外一台设备,利用分布式的能力提高用户的体验。
 步骤一 
想要迁移的ability以及其下所有的abilityslice都必须需要实现一个接口: iabilitycontinuation
坑点1:哪怕你知识想将ability其中一个slice进行迁移,也必须将ability的所有的slice都要实现该接口
onstartcontinuation  fa请求迁移后,系统首先回调此方法,开发者可以在此回调中决策当前是否可以执行迁移,比如,弹框让用户确认是否开始迁移。
onsavedata(intentparams savedata) 如果onstartcontinuation()返回true,则系统回调此方法,开发者在此回调中保存必须传递到目标端设备上,用于恢复fa状态的数据。
onrestoredata(intentparams restoredata)  发起端设备上fa完成保存数据后,系统在目标端设备上回调此方法,开发者在此回调中接受用于恢复fa状态的数据。
oncompletecontinuation(int result)  目标端设备上恢复数据一旦完成,系统就会在发起端设备上回调fa的此方法,以便通知应用迁移流程已结束。
坑点2:  不要忘记 return true;  ability中也要。
坑点3:  onrestoredata进行ui的恢复时,需要切换到ui线程,否则...(没报错log)
 步骤二 
可回迁的迁移
回迁(若是已经回迁了,再进行回迁,会报错。 先try-catch了)
混合打包 
目前openharmony上的应用有以下三种
直接运行的 安卓应用使用deveco studio编写的openharmony应用已有开发好的 安卓应用,想拥有 openharmony的一些特性,从而进行混合打包。apk逻辑无需变化,即可拥有openharmony特性,例如 服务卡片(专题-java卡片开发指导 (harmonyos.com)))。如何进行混合打包?
    篇幅原因,将会在另外一篇中详细介绍。  请移步:  安卓应用如何混合打包拥有openharmony的卡片服务?(安卓应用如何混合打包拥有openharmony特性? (huawei.com)))
 奇怪的知识 
针对:分布式数据服务开发指导   (开发-分布式数据服务开发指导 (harmonyos.com))
 设计字段: 
单版本分布式数据库的介绍比较简单。存储key-value, value若是复杂点没介绍。若想value中存储很多其他数据,可进行以下操作。
以上时创建单版本分布式数据库时,设置schema对象,从而设计了数据库中的字段。
 数据存储:
存入的时候,需要以json的格式进行写入。
 查询:
坑点: 下次查询时,需要 query.reset();

华快科技造出超快光纤激光器
陷入商业困境的5G时代
100G以太网光模块解决方案
MIMO-OFDMA无线基站的DSP-FPGA系统划分
数字式超声波测距仪的工作原理和电路设计
Harmony软总线的简单使用
工程师解读Cicret投影手环,这就是个忽悠!
如何使直流稳定化电源更加稳定的运作呢?
中芯国际待遇怎么样_中芯国际企业性质是什么
图解PCB布板与EMC的关系
国产芯片为什么人才不够?芯恩董事长:国内人才被国外挖走了
百立德全圆角模切设备的规模应用介绍
Aiven使企业能够更轻松地访问Apache Kafka生态系统
苏姿丰:下一个五年全球VR用户将突破一个亿
GaN器件在电动汽车逆变器中的应用
电流传感器在开关电源中的应用
谷歌退出中国,谷歌退出中国的原因?
Aigtek的ATA-8000射频功率放大器对比进口品牌T&C
用于高效体外mRNA转录的具有微纤维通道的微流控生物反应器
全球前25大半导体供应商排名,台积电位居第三