碰碰特性是HarmonyOS多终端业务协作技术。手机可以通过触摸交互连接到整个场景设备。然后,通过移动终端的原子服务能力,快速完成网络配置和远程控制。解决了应用与设备连续缓慢、网络配置复杂、传输困难的问题,为用户带来了流畅的无缝切换体验。
本篇Codelab将指导您如何开发模拟的远程台灯案例。在这种情况下,通过手机触摸NFC标签,可以从HAG获取相关意图信息。相应的原子化服务可以通过获得的相关意图信息拉起。原子化服务通过调用hilink接口,结合设备侧代码,可完成开发板与手机之间的配网,建立通信通道。完成此步骤后,可以通过手机控制Hi3861开发版中LED灯的开关。
通过这个案例,我们将学习:
通过碰一碰能力,拉起手机端原子化服务。
快速完成手机和设备的配网。
通过手机控制设备。
说明: 本指导仅用于个人开发者体验HarmonyOS触摸特性不能作为商业方案开发和上架。
华为手机的系统版本是HarmonyOS 2.0.0.168及以上手机具体型号Mate 40 Pro。将手机上的智能生活基础服务升级到12.0.0.306及以上版本。具体操作步骤如下:
查看智能生活基础服务版本,打开手机设置>应用服务>搜索智能生活基础服务进行应用管理。 升级智能生活基础服务App,点击“我的 > 设置 > 检查应用更新,更新智能生活基础服务。 Hi3861开发板 本样例基于Hi请准备开发3861开发板Hi3861开发板(HiSpark Wi-Fi IoT智能家居套件)。包括开发板主板、底板和OLED板。
设备配网原子化服务(entry) 原子化服务控制设备(control) 本案例将实现触摸-拉原子服务-设备网络-设备控制的完整过程,整个过程将基于移动终端的原子服务。开发原子服务的工具是DevEco Studio 3.0 Beta2.关于工具配置,请查看官方指导文档构建开发环境流程。
打开创建项目导向界面,选择Empty Ability设备配网用模板创建原子化服务。
在工程配置中,Project type选择“Atomic Service并打开Show in Service Center点击选项Finish按钮可以创建设备配网原子化服务。
已创entry右击目录,选择Empty Ability新建一个模板Module,用于设备控制。 在模块配置界面,Module typeFeature”,点击“Next”。 配置Module的“Page ability name”,点击“Finish完成创建。 设备配网原子化服务(entry) 需要依网过程hilink因此,接口首先需要entry\build.gradle中加入对hilink的依赖。
dependencies { ... ohosTestImplementation 'com.huawei.ohos.testkit:runner:2.0.0.200' }
手机碰一碰nfc标签将拉起用于配网的原子化服务(entry模块)。服务入口。MainAbility中,完成对nfc读取产品信息和abilityContext以及从意图中获得的nanSessionId为配网注册NetConfigAbility中。
// 读取产品信息 Object productInfo = Objects.requireNonNull(intent.getParams()).getParam("productInfo"); if (productInfo != null) { productId = (String) productInfo; } // 从intent中读取的nanSessionId用于配网,同时需要将abilityContext和sessionId注册到NetConfigAbility中 String sessionId = intent.getStringParam("nanSessionId"); if ("null".equals(sessionId) || "".equals(sessionId)) { NetConfigAbility.register(this, null); } else { NetConfigAbility.register(this, sessionId); }
entry当模块的主界面初始化时,产品信息和nanSessionId在应用中保存传递。
onInit() { this.deviceName = this.$t('strings.device-name'); this.deviceImg = '/common/images/LED.png'; getApp(this).Product.productName = this.productName; getApp(this).Product.productId = this.productId; getApp(this).ConfigParams.sessionId = this.sessionId; }
点击主界面的配网按钮,默认进行配网操作。主要分为五个步骤,都依赖于hilink实现接口,可以查看具体代码netconfig.js。
通过NAN广播服务搜索设备。
getApp(this).NetConfig.discoveryByNAN(scanInfo, (result) => { if (result.code == 0) { // 设备的成功发现 } else { ... } });
连接设备。
getApp(this).NetConfig.connectDevice(connectInfo, (result) => { if (result.code === 0) { // 成功连接设备 } else { ... } });
获取wifi信息。
getApp(this).NetConfig.getWifiList((result) => { if (result.code == 0 && result.data && result.data.length > 0) { // 获取wifi信息成功 } else { ... } });
网络配置设备。
getApp(this).NetConfig.configDeviceNet('deviceInfo', 'accountInfo', netConfigInfo, (result) => { if (result.code == 0) { // 设备网络配置成功 } else { ... } });
配网成功,跳转到设备控制模块
原子化服务控制设备(control) 通过control模块控制开发版led依赖灯的开关hilink因此,需要在接口处发送指令control\build.gradle添加相应的依赖。
dependencies { ... implementation(group: 'com.huawei.hilink', name: 'ailifeability', version: '1.0.0.1', ext: 'har')}
设备配网成功完成后,手机将自动拉起设备控制原子化服务(control)。点击开关按钮控制服务界面时,会使用FeatureAbility模块(JS端SDK调用接口)的能力PA向开发板发出指令,NetConfigApi由引入的hilink模块提供。
private void sendMessage(String message, HashMap<String, Object> tmpMap) { CommonInfo commonInfo = new CommonInfo(); commonInfo.setSessionId(sessionId); HiLog.error(LABEL_LOG, "sessionId " sessionId); NetConfigApi.getInstance().sendMessage(commonInfo, message, (code, controlMessage, str) -> { ... });}
Hi3861开发环境准备 Hi3861支持建设各种开发环境:
搭建Windows开发环境
搭建Windows Ubuntu环境的混合开发
搭建Ubuntu开发环境
开发者可以根据自己的情况建立适当的开发环境。
本案将使用Ubuntu发环境,基于OpenHarmony-3.0-LTS源码进行开发。
通过repo工具下载OpenHarmony-3.0-LTS的源码:
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
编译前,需要调整OpenHarmony源码,并添加设备侧代码,以实现设备配网与设备控制的功能。
修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk文件,开启对I2C的支持。
CONFIG_I2C_SUPPORT=y
修改device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_hotspot.c文件,在EnableHotspot函数中注释如下代码。
//if (SetHotspotIpConfig() != WIFI_SUCCESS) {
// return ERROR_WIFI_UNKNOWN;
//}
修改device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_device.c文件,在DispatchConnectEvent函数中注释StaSetWifiNetConfig相关代码。
//StaSetWifiNetConfig(HI_WIFI_EVT_CONNECTED);
//StaSetWifiNetConfig(HI_WIFI_EVT_DISCONNECTED);
修改base/security/huks/interfaces/innerkits/huks_lite/BUILD.gn文件,注释如下代码。
#sources += [ “hks_tmp_client.c” ] 在OpenHarmony源码的third_party目录下,添加IoTDA平台SDK。
在vendor目录下,添加设备侧代码team_x。目录结构如下图所示。 “common”中主要包含本样例依赖的头文件和类库文件。“smart_lamp”中则包含了本样例中设备侧的核心代码。“smart_lamp”目录结构如下图所示。 样例入口文件iot_main.c位于demo_smartlamp/src目录下,当启动开发板时,会启动入口线程任务。在该任务中,开发板会完成I2C初始化、OLED初始化,进入配网状态并注册网络监听事件。
static void *LampTask(const char *arg)
{
(void)arg;
WINDBG("LampTask Enter! \n");
LampInit();
(void)memset_s(&g_lamp, sizeof(g_lamp), 0x00, sizeof(g_lamp));
NetCfgRegister(LampNetEventHandler); // 进入配网状态并注册网络监听事件
LampShowInfo(); // 显示LED初始状态
}
配网成功,并成功注册网络监听事件后,手机端每次发送指令,都会触发监听事件,从而对开发板设备上LED灯进行开关控制。
static int LampNetEventHandler(NET_EVENT_TYPE event, void *data)
{
switch (event) {
case NET_EVENT_RECV_DATA: // 接收到网络信息(FA发送的消息)
LampProcessAppMessage((const char *)data, strlen(data)); // 处理对应的信息
break;
default:
break;
}
return 0;
}
进入源码根目录,首次编译,输入编译命令“hb set”。随后在Input code path命令行中键入“.”,指定OpenHarmony工程编译根目录后回车。
选择智能台灯“smart_lamp”并回车,输入“hb build”命令进行编译,屏幕出现:BUILD SUCCESS字样,说明编译成功。
将编译生成文件下载至本地Windows环境。
将Hi3861通过TypeC数据线与电脑连接。
点击“Refresh”按钮,更新com端口信息。在“COM”处选择Hi3861开发板对应的COM口。选择编译生成的二进制文件,勾选“Auto burn”,随后点击“connect”按钮。此时点击Hi3861开发板上的“RST”键,进行烧录。
查看烧录进度,等待进度跑完,则烧录完成。可点击“Disconnect”断开连接。
本案例将使用Ubuntu开发环境,基于OpenHarmony-3.0-LTS源码进行开发。
通过repo工具下载OpenHarmony-3.0-LTS的源码:
repo init -u https://gitee.com/openharmony/manifest.git -b OpenHarmony-3.0-LTS --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
编译前,需要调整OpenHarmony源码,并添加设备侧代码,以实现设备配网与设备控制的功能。
修改device/hisilicon/hispark_pegasus/sdk_liteos/build/config/usr_config.mk文件,开启对I2C的支持。
CONFIG_I2C_SUPPORT=y
修改device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_hotspot.c文件,在EnableHotspot函数中注释如下代码。
//if (SetHotspotIpConfig() != WIFI_SUCCESS) {
// return ERROR_WIFI_UNKNOWN;
//}
修改device/hisilicon/hispark_pegasus/hi3861_adapter/hals/communication/wifi_lite/wifiservice/source/wifi_device.c文件,在DispatchConnectEvent函数中注释StaSetWifiNetConfig相关代码。
//StaSetWifiNetConfig(HI_WIFI_EVT_CONNECTED);
//StaSetWifiNetConfig(HI_WIFI_EVT_DISCONNECTED);
修改device/hisilicon/hispark_pegasus/sdk_liteos/BUILD.gn文件,在deps中添加如下代码。
deps = [
...
"//build/lite:product",
]
修改base/security/huks/interfaces/innerkits/huks_lite/BUILD.gn文件,注释如下代码。
#sources += [ "hks_tmp_client.c" ]
在OpenHarmony源码的third_party目录下,添加IoTDA平台SDK。
在vendor目录下,添加设备侧代码team_x。目录结构如下图所示。
“common”中主要包含本样例依赖的头文件和类库文件。“smart_lamp”中则包含了本样例中设备侧的核心代码。“smart_lamp”目录结构如下图所示。
static void *LampTask(const char *arg)
{
(void)arg;
WINDBG("LampTask Enter! \n");
LampInit();
(void)memset_s(&g_lamp, sizeof(g_lamp), 0x00, sizeof(g_lamp));
NetCfgRegister(LampNetEventHandler); // 进入配网状态并注册网络监听事件
LampShowInfo(); // 显示LED初始状态
}
配网成功,并成功注册网络监听事件后,手机端每次发送指令,都会触发监听事件,从而对开发板设备上LED灯进行开关控制。
static int LampNetEventHandler(NET_EVENT_TYPE event, void *data)
{
switch (event) {
case NET_EVENT_RECV_DATA: // 接收到网络信息(FA发送的消息)
LampProcessAppMessage((const char *)data, strlen(data)); // 处理对应的信息
break;
default:
break;
}
return 0;
}
进入源码根目录,首次编译,输入编译命令“hb set”。随后在Input code path命令行中键入“.”,指定OpenHarmony工程编译根目录后回车。
选择智能台灯“smart_lamp”并回车,输入“hb build”命令进行编译,屏幕出现:BUILD SUCCESS字样,说明编译成功。
将编译生成文件下载至本地Windows环境。
将Hi3861通过TypeC数据线与电脑连接。
使用Hiburn工具进行烧录:
点击“Refresh”按钮,更新com端口信息。在“COM”处选择Hi3861开发板对应的COM口。选择编译生成的二进制文件,勾选“Auto burn”,随后点击“connect”按钮。此时点击Hi3861开发板上的“RST”键,进行烧录。
查看烧录进度,等待进度跑完,则烧录完成。可点击“Disconnect”断开连接。
使用应用调测助手App,在NFC标签中写入对应的标签信息,具体请参考写入NFC标签信息。
通过在HAG上配置原子化关联意图,在手机碰一碰NFC标签后,即可获取需要拉取的原子化服务信息,具体请参考配置服务关联意图。
在手机上安装开发好的原子化服务。注意该项目包含两个模块,签名需要使用项目级签名。
打开Run > Edit Configurations, 勾选entry模块下的“Deploy Multi Hap Packages”选项,表示在运行entry模块(设备配网原子化服务)时,同时会在手机中安装control模块(设备控制原子化服务)。
打开手机NFC功能,确认手机已经接入WLAN无线网络。使用手机背部接触NFC标签,手机会弹出以下页面。
点击Hi3861开发板的RST复位按键,点击手机上的配网按钮,即开始手机与开发板的配网过程。配网成功后,手机应用将自动跳转至控制界面,如下图。
配网成功后,即可通过手机对Hi3861开发板LED灯进行开关操作。