一. 简介 本demo是基于Openharmony 3.1 Beta本版开发,不仅可以接收数字管家应用下发的指令来控制门锁开启,而且还可以通过数字管家设置不同的开锁密码以及一次性密码,实现给临时用户一个临时密码,保证门户安全。当然除了开锁的功能,智能门锁还可以通过检测门与门锁距离自动上锁以及如果长时间未上锁,上报告警消息到数字管家,及时提醒用户关门关锁等功能。
1. 交互流程:
如上图所示,智能门锁整体方案原理图可以大致分成:智能门锁设备、数字管家应用、云平台三部分。智能门锁通过MQTT协议连接华为IOT物联网平台,从而实现命令的接收和属性上报。 关于智能设备接入华为云IoT平台的详细细节可以参考 连接IOT云平台指南;智能设备与数字管家应用之间的设备模型定义可以参考profile .
2. 实物简介:
如上图所示,上面是XR806 开发板,中间的是hcsr04超声波距离传感器,下面是E53_IA1扩展板。
我们是通过距离传感器感应门的距离,进行自动上锁,也可以在一定时间内无法上锁而产生告警信息上传到数字管家。
E53_IA1扩展板主要是通过控制电机模拟开关锁的一个动作。 接线说明:
距离传感器有4根线,其中echo接XR806的PA19,trig接XR806的PA20。 E53_IA1扩展板主需要接3根线,其中IO控制脚接XR806的PA12。
3. 实物操作体验
二. 快速上手
1. 硬件准备
- xr806模组。
- hcsr04超声波模块。
- E53_IA1扩展板。
- 预装HarmonyOS手机一台。
2. 环境准备
参照文档: XR806快速上手指导文档
3. 编译前准备设备侧代码下载下载方式:使用git 命令下载,指令如下(用户也可以根据需要将该仓库fork到自己的目录下后进行下载)
- <font size="4">cd ~/
- git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git</font>
复制代码
代码拷贝
- <font size="4">cp -rfa ~/knowledge_demo_smart_home/dev/team_x ~/openharmony/vendor/
- cp -rfa ~/knowledge_demo_smart_home/dev/third_party/iot_link ~/openharmony/third_party/</font>
复制代码
整合并修改完成后的目录结构如下图:
SOC代码下载替换当前官方soc代码由于DHCP暂未适配,所以暂时不支持AP模式,这时需要下载并替换之前SOC代码。如果官方soc代码已修复该问题,可忽略此步骤。
- <font size="4">git clone https://gitee.com/moldy-potato-chips/xr806_-ap_mode.git
- mv ~/openharmony/device/soc/allwinner ~/allwinner.org // 不建议直接删除,
- cp -raf xr806_-ap_mode ~/openharmony/device/soc/allwinner</font>
复制代码
修改文件- 修改编译依赖
打开 device/soc/allwinner/xradio/xr806/BUILD.gn,添加应用依赖(deps字段):
- <font size="4">module_group(module_name) {
- modules = [
- "src",
- "project",
- "include",
- ]
- configs = [
- ":SdkLdCconfig",
- ]
- deps = [ "//vendor/team_x/smart_lock/demo_smart_lock:app_smart_lock" ]
- }</font>
复制代码
- 修改编译方式
将demo依赖的库编译方式(static_library)修改为(source_set):
具体依赖查看demo_smart_lock目录下的BUILD.gn:
- <font size="4">deps = [
- "../../common/iot_wifi_xradio:iot_wifi",
- "../../common/iot_cloud:iot_cloud",
- "../../common/iot_boardbutton_xradio:iot_boardbutton",
- "../../common/iot_list:iot_list",
- "../../common/iot_sntp:iot_sntp",
- "../../common/iot_boardled_xradio",
- "//third_party/cJSON:cJSON"
- ]</font>
复制代码
其中//third_party/cJSON目录下的BUILD.gn建议参照下面的修改:
- <font size="4">source_set("cJSON") {
- sources = [
- "cJSON.c",
- "cJSON_Utils.c",
- ]
- ldflags = [ "-lm" ]
- }</font>
复制代码
- 修改iot_link中的部分文件
third_party/iot_link目录下文件改动较多,此处以patch方式做修改,patch在路径在(team_x/smart_lock/iot_link_patch_xr806.patch),主要修改内容:
- BUILD.gn修改source_set.
- fd为0时通讯会异常,做了规避操作(socket创建时多创建一个)。
- 部分mbedtl接口未适配,做一些简单适配以及无法适配的接口需要注释
- 弱引用导致无法链接相关符号,因此需要注释相关文件中的弱引用。
- osDelay接口在XR806中未实现,需要替换为OS_Msleep();
以上内容修改的修改均在iot_link_patch_xr806.patch中,只需将该patch文件拷贝到third_party/iot_link目录下,并执行打补丁即可:
- <font size="4">cp -af vendor/team_x/smart_lock/iot_link_patch_xr806.patch third_party/iot_link // 拷贝patch文件到对应目录
- cd third_party/iot_link/ // cd 到对应目录
- patch -p1<./iot_link_patch_xr806.patch </font> // 执行打patch动作
复制代码
- 修改GPIO查找方式
因为GPIO框架修改了设备驱动注册的管脚号,导致应用无法根据HCS的引脚操作对应的GPIO,此问题已经提issue,如果该问题已解决,可以忽略此步骤。
打开drivers/framework/support/platform/src/gpio/gpio_manager.c,将cntlr->start = start;注释即可。
- <font size="4">static int32_t GpioManagerAdd(struct PlatformManager *manager, struct PlatformDevice *device)
- {
- uint16_t start;
- struct GpioCntlr *cntlr = CONTAINER_OF(device, struct GpioCntlr, device);
- if ((start = GpioCntlrQueryStart(cntlr, &manager->devices)) >= GPIO_NUM_MAX) {
- PLAT_LOGE("GpioCntlrAdd: query range for start:%d fail:%d", cntlr->start, start);
- return HDF_ERR_INVALID_PARAM;
- }
- // cntlr->start = start;
- DListInsertTail(&device->node, &manager->devices);
- PLAT_LOGI("%s: start:%u count:%u", __func__, cntlr->start, cntlr->count);
- return HDF_SUCCESS;
- }</font>
复制代码
- 将对应的驱动文件复制到drvier对应目录:
因为主仓代码中未将对应的驱动文件合并到driver/adpater/platform对应的目录下,固需要手动将文件拷贝到对应目录。若主仓已合入,可忽略此步骤。
注意:(如果已用xr806_-ap_mode替换原来的soc文件,则需要将拷贝原来被替换的对应文件,因为xr806_-ap_mode中的驱动文件非最新版)
- <font size="4">// 拷贝gpio驱动
- cp -af device/soc/allwinner/xradio/drivers/gpio/gpio_xradio.* driver/adpater/platform/gpio
- // 修改driver/adpater/platform/gpio/BUILD.gn文件,加上gpio_xradio的编译
- hdf_driver(module_name) {
- sources = []
- if (defined(LOSCFG_SOC_COMPANY_BESTECHNIC)) {
- sources += [ "gpio_bes.c" ]
- }
- if (defined(LOSCFG_SOC_COMPANY_ALLWINNER)) {
- sources += [ "gpio_xradio.c" ]
- }
- include_dirs = [ "." ]
- }</font>
复制代码
- 为了节省ram资源,可以把无用的资源先关闭,如关闭内部codec,将 device/soc/allwinner/xradio/xr806/project/prj_config.h中的PRJCONF_INTERNAL_SOUNDCARD_EN设置为0,如下:
- <font size="4">/* Xradio internal codec sound card enable/disable */
- #define PRJCONF_INTERNAL_SOUNDCARD_EN 0</font>
复制代码
4. 编译&烧录更新hb首先可以查看一下hb的版本,如果hb版本为0.4.4就不需要更新。
- <font size="4">## 查看hb版本
- hb --version
- ## 更新hb, 以下指令需要在openharmony SDK根目录执行
- pip3 uninstall ohos_build
- pip3 install build/lite</font>
复制代码
编译
- <font size="4">hb set -root</font>
复制代码
如下图所示,使用键盘上下键选中smart_lock
hb build 全量编译命令
- <font size="4">hb build -f</font>
复制代码
|