#星光计划2.0# 碰一碰实现 原创 精华

丨张明亮丨
发布于 2021-12-9 11:59
浏览
4收藏

【本文正在参与51CTO HarmonyOS技术社区创作者激励计划-星光计划2.0】

@toc

概述

碰一碰简单来说就是,使用NFC拉起配网FA,入网之后,使用控制FA进行设备控制。总结下来开发碰一碰能力需要3部分。

设备端:安装碰一碰固件程序。

手机端:可以使用原子化服务配网模板、控制模板。

NFC标签:存放设备端信息。用原子化服务的包名 => 生成 Product ID,用于拉起FA。
#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

接下来参考官方demo和OneHop模板来体验下碰一碰的流程。

设备端

源码下载

硬件需要Hi3861,OpenHarmony版本需要1.1.0,可以repo拉取,关于Ubuntu编译环境搭建可以参考 软通动力大佬的帖子,写的特别详细。

repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony_release_v1.1.0 --no-repo-verify
repo sync -c

首先要完成官方镜像的拉取和编译,成功之后在尝试安装OneHop设备端代码,设备端代码获取链接:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/tree/master/dev/team_x/demo_winder

OneHop设备端固件代码,只需要hals和winder两个文件夹,为了方便大家下载,我在文末上传了这两个文件夹。这两个文件夹需要拷贝到applications/sample/wifi-iot/app/目录下。

源码修改

修改device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_device.c文件

static void HiWifiWpaEventCb(const hi_wifi_event *hisiEvent)
{
    if (hisiEvent == NULL) {
        return;
    }
    /*注释此处
    if (LockWifiEventLock() != WIFI_SUCCESS) {
        return;
    }
    */
    for (int i = 0; i < WIFI_MAX_EVENT_SIZE; i++) {
        if (g_wifiEvents[i] == NULL) {
            continue;
        }
        DispatchEvent(hisiEvent, g_wifiEvents[i]);
    }
    /*注释此处
    if (UnlockWifiEventLock() != WIFI_SUCCESS) {
        return;
    }
    */
}

设备端使用到了I2C的屏幕,所以需要在make的config文件中开启I2C的支持,具体操作如下,打开device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk文件,注意取消前面的#号

- # CONFIG_I2C_SUPPORT is not set
+ CONFIG_I2C_SUPPORT=y

为了方便调试需要关闭test子系统,在vendor\hisilicon\hispark_pegasus\config.json文件中,删除下面代码,注意逗号。

,
      {
       "subsystem": "test",
       "components": [
         { "component": "xts_acts", "features":[] },
         { "component": "xts_tools", "features":[] }
        ]
      }

最后将app添加到编译框架,在applications/sample/wifi-iot/app/BUILD.gn文件,将features字段中的startup修改为winder,并添加winder模块的索引deps

 import("//build/lite/config/component/lite_component.gni")
    
   lite_component("app") {
   #将startup修改为winder
   features = [
       "winder",
   ] 
   #添加winder模块的索引deps
   deps = [ "//applications/sample/wifi-iot/app/hals:hi3861_hals" ] 
 }

构建编译

1.1.0的构建使用的是hb命令,方式如下

hb set				# 设置编译路径
.					# 选择当前路径
# hisilicon			# 选择编译的目标类型
	> wifiiot_hispark_pegasus
	  ipcamera_hispark_aries
	  ipcamera_hispark_taurus

hb build -b debug	# 执行编译

烧录推荐使用HiBurn,简单高效,一张图就明白了。#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

最后烧录完成提示:

Execution Successful

手机端

编辑模板

手机端就简单了,安装DevEco Studio 3.0 Beta1及以上版本,然后IDE自带OneHop的模板。

#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

获取证书

源码不怎么需要修改,但是在真机上运行程序,需要在线获取签名证书。基本流程就是在AppGallery Connect注册项目和应用,然后用IDE软件自动获取。需要注意的是网站注册时的包名要和src/main/config.json中"bundleName"保持一致不然是获取不到的。这部分出问题参考官方文档吧,文档很详细。

再就是为了方便调试可以先关闭免安装功能(在src/main/config.json中,将"installationFree"设置为false)这样桌面会生成应用图标,无需NFC贴纸,打开图标一样可以实现设备配网、控制。

"installationFree": false

测试APP

到这里可以先打开桌面的app测试下配网功能,这里有坑,目前示例的稳定性很差,配网大概率会失败。先关闭手机wifi再打开,然后Hi3861上电,再然后开启配网app可以提高成功率。

正常情况下配网成功就会自动拉起控制FA,控制FA需要在DevEco Studio菜单栏Run > Edit Configurations, 勾选entry模块下的“Deploy Multi Hap Packages”选项,这样项目中的多个模块都能添加到手机端。

如果这样配网完成还是不能自动拉起控制FA,那么检查下default/pages/netconfig/netconfig.js,检查下这个函数参数是否正确。

let target = {
    bundleName: 'com.liangzili.myonehop.hmservice',
    abilityName: 'com.liangzili.myonehop.ControlMainAbility',
    deviceType: 1,
    data: {

        session_id: getApp(this).ConfigParams.deviceInfo.sessionId,
        product_id: getApp(this).Product.productId,
        product_name: getApp(this).Product.productName
    }
}
FeatureAbility.startAbility(target);

NFC标签

标签的作用类似新建一个快捷方式,然后把快捷方式贴到设备上,手机碰一下打开这个快捷方式就可以自动下载配网FA和控制FA,只要app体积在10M以内,这些操作用户是感受不到的。接下来就说说这个标签的制作方法。

制作贴纸

首先当然是需要购买一些NFC贴纸,我使用的是下图这一种。

#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

给NFC贴纸写内容需要一个APP,在华为应用市场,搜索“应用调测助手”安装即可。写入贴纸的信息一共2条Product ID和设备SN,或者一些自定义信息。

只有Product ID是必填的,这个在APP拿包名申请即可。

设置意图

当手机碰触NFC贴纸的时候,手机需要通过Product ID去云端获取用户意图。所以需要登录华为开发者门户设置下,当检测到设置的Product ID是要执行的操作。

#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

#星光计划2.0# 碰一碰实现-鸿蒙开发者社区

主要的设置就在这里,可以看到配网FA是通过NFC贴纸拉起的,而控制FA是配网FA拉起的。

  • “App包名”填写为config.json文件中的bundleName字段取值。
  • “模块名”填写为入口原子化服务(即设备配网模块)config.json文件中的moduleName字段取值。
  • “服务名”填写为入口原子化服务(即设备配网模块)config.json文件中的mainAbility字段取值。

这样碰一碰的功能基本就实现了。

reference

大部分的内容官方文档都有详细说明,我只写了不一样的地方,和我踩过的雷,希望能给大家避避坑。详细流程还是要结合官方文档看。

HarmonyOS设备开发-专题-碰一碰(个人体验版)-碰一碰概述

华为分享碰一碰(Java)

智Hi3861设备端代码:能风扇设备端代码介绍

配网遇到问题可以参考

常见问题-设备配网原子化服务开发指导

候鹏飞/碰一碰

玩转碰一碰开发丨侯鹏飞-51CTO.COM

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
app.zip 387.61K 39次下载
已于2021-12-9 14:25:11修改
4
收藏 4
回复
举报
2条回复
按时间正序
/
按时间倒序
红叶亦知秋
红叶亦知秋

标题简单,内容不简单,感谢亮哥总结。

回复
2021-12-9 13:53:59
杀手来过
杀手来过

请问,小熊派mircro是跑L1系统的,也能够通过这种方式实现手机控制开发板吗?

这样好像就可以绕过设备认证。

话说这个控制是走软总线吗

回复
2022-3-21 19:35:06
回复
    相关推荐