浅析HarmonyOS碰一碰

浅析HarmonyOS碰一碰

本人主要是做软件端设计和开发的,提出的问题和解决办法也是经过个人实践得来,思路主要是从软件端来设计,嵌入式大佬勿喷。

概念

基于HarmonyOS的碰一碰配网主要用于对已经初始化完毕但是为接入互联网的设备进行配网工作,或者是当家用WIFI信息改变后需要让终端设备从新入网。
配网成功后可调用系统能力启动对应的控制程序,这里控制程序一共有两种设计方法:

  1. 借助终端设备和控制终端设备(手机)之间建立的点对点通信信道进行数据的传输,但是改方法有弊端只能用于设备的控制不能用于数据的上报。
  2. 设备上云接入华为云物联网平台,可以通过云平台下发命令和上报数据。

主要的问题

在设计中最先需要解决的一个问题是控制程序如何知道终端设备所属的配网程序是哪一个?
我们事先将产品编号(在调试助手端申请)和设备编号(如果上云的话需要写入云端定义的设备编号)写入NFC标签中,并在华为云开发中联盟中定义标签所属的配网信息,包括包名,所调用的模块等。
写入NFC标签信息:如果设备要上云请将设备编号定义在设备SN处
写入NFC标签信息
写入NFC标签信息
华为开发者联盟云端配置
配网程序信息
标签信息
其次当我们的手机触碰标签后发生了什么?
当我们使用手机触碰标签后最先启动的不是配网程序,而是智慧生活服务助手。这里智慧生活服务助手主要负责获取NFC标签中的ProductID和设备SN信息,或者ProductID后前往开发者联盟服务查询该标签对应的配网信息和检查手机是否连接了WIFI,并且连接的WIFI是否可用。完成这两步后智慧生活服务助手根据bundleName启动对应的配网程序,并将获取的信息传递到配网程序中。

为什么我们的设备明明在线,启动配网程序后直接是100%失败而且智慧生活服务助手传递过来的sessionId是DEVICE_NOT_DOFUND而不是HASH值?

  1. 终端设备已经启动并且正常工作:需要检查手机端WIFI是否已经连接并且WIFI能够正常上网,对WIFI热点有要求最好是路由器2.4GHZ的,WIFI不要设置成隐藏热点,不要使用电脑热点可以使用手机热点,手机端和设备端距离不要太远。
  2. 在官方案例中还提供了AP配网,这个AP配网的话可以理解为是手动登录华为云账户然后输入WIFI信息,然后手机端将WIFI信息发送到终端设备中。

如果配网程序和控制程序是使用JavaJavaScript开发的那么Java端从智慧生活服务助手获取到的deviceId或者是其他信息是如何提交给JavaScript端的?
这个问题在HarmonyOS开发者文档里面给出了解释,在Java端将需要传递的信息封装到IntentParams中,然后直接传递intent便可,在FA端使用onNewRequest端接收数据。但是阅读文档发现onNewRequest生命周期函数并不能接收数据,只告诉了我们如何发送数据并没有说如何接收数据,官网案例代码如下:

public void onNewIntent(Intent intent) {
    String startParams = intent.getStringParam("__startParams");
    if(startParams != null) {
        ZSONObject zson = ZSONObject.stringToZSON(startParams);
        IntentParams params = new IntentParams();
        for (Map.Entry<String , Object> entry :zson.entrySet()) {
            params.setParam(entry.getKey(), entry.getValue());
        }
        pushPage("pages/control/control", params);
    }
    super.onNewIntent(intent);
}

其实FA端并不用在onNewRequest端显示的定义函数去接收参数,只需要在intent所对应的页面的data数据绑定模型中定义和Java端一致的变量便可,系统会自动将改参数从PA端注入到FA端中(是很方便😂)
PA端分封装并传递数据:

public void onStart(Intent intent) {
        IntentParams intentParams = intent.getParams();
        if (intent.getParams().keySet().contains(START_PARAMS)) {
            ZSONObject zsonObject = ZSONObject.stringToZSON((String) intent.getParams().getParam(START_PARAMS));
            //获取设备编号
            deviceId = zsonObject.getString("deviceId");
        }
        if (intentParams != null) {
            intentParams.setParam("deviceId",deviceId);
            HiLog.info(TAG,"deviceId"+deviceId);
            setPageParams(null, intentParams);
        }
        super.onStart(intent);
        // 开发者显示声明需要使用的权限
        //requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
    }

FA端定义数据模型等待参数注入:

 data: {
        title: "",
        templateService:{
            templateValue:0,
            templateThreshold:20
        },
        lightService:{
            lightValue:0,
            lightThreshold:0
        },
        threshold:{
            template:0,
            light:0
        },
        templateThreshold:0,
        lightThreshold:0,
        templateTimer:null,
        lightTimer:null,
        sendTemplateLoading:false,
        sendLightLoading:false,
        time:5000,
        //deviceId:'62032a61c7fb24029b10ee14_TemplateDevice001',
        device_type:'template',
        isTemplate:true,
        productId:'',
        productName:'',
        //等待PA端将参数注入
        deviceId:''
    },

简要说明一下系统工作流程系统工作流程图
配网程序和控制程序的解析和设计在后面的文章中讲述,如有不对错误之处请各位大佬多多指教。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值