OpenHarmony项目实战:基于全志XR806实现的上下位机双OpenHarmony智能门锁样例
本文整理自:https://bbs.aw-ol.com/topic/1108/
作者 @budbool
一. 简介
本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。
二. 快速上手
1. 硬件准备
- xr806模组
- hcsr04超声波模块
- E53_IA1扩展板
- 预装HarmonyOS手机一台
2. 环境准备
参照文档: XR806快速上手指导文档
3. 编译前准备
设备侧代码下载
具体仓库地址:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/
下载方式:使用git 命令下载,指令如下(用户也可以根据需要将该仓库fork到自己的目录下后进行下载)
cd ~/ git clone git@gitee.com:openharmony-sig/knowledge_demo_smart_home.git
代码拷贝
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/
SOC代码下载替换
当前官方soc代码由于DHCP暂未适配,所以暂时不支持AP模式,这时需要下载并替换之前SOC代码。如果官方soc代码已修复该问题,可忽略此步骤。
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
修改文件
- 修改编译依赖
打开 device/soc/allwinner/xradio/xr806/BUILD.gn,添加应用依赖(deps字段):
module_group(module_name) { modules = [ "src", "project", "include", ] configs = [ ":SdkLdCconfig", ] deps = [ "//vendor/team_x/smart_lock/demo_smart_lock:app_smart_lock" ] }
- 修改编译方式
将demo依赖的库编译方式(static_library)修改为(source_set):
具体依赖查看demo_smart_lock目录下的BUILD.gn:
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" ]
其中//third_party/cJSON目录下的BUILD.gn建议参照下面的修改:
source_set("cJSON") { sources = [ "cJSON.c", "cJSON_Utils.c", ] ldflags = [ "-lm" ] }
- 修改iot_link中的部分文件
third_party/iot_link目录下文件改动较多,此处以patch方式做修改,patch在路径在(team_x/smart_lock/iot_link_patch_xr806.patch),主要修改内容:
1.BUILD.gn修改source_set.
2.fd为0时通讯会异常,做了规避操作(socket创建时多创建一个)。
3.部分mbedtl接口未适配,做一些简单适配以及无法适配的接口需要注释
4.弱引用导致无法链接相关符号,因此需要注释相关文件中的弱引用。
5.osDelay接口在XR806中未实现,需要替换为OS_Msleep();
以上内容修改的修改均在iot_link_patch_xr806.patch中,只需将该patch文件拷贝到third_party/iot_link目录下,并执行打补丁即可:
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 // 执行打patch动作
- 修改GPIO查找方式
因为GPIO框架修改了设备驱动注册的管脚号,导致应用无法根据HCS的引脚操作对应的GPIO,此问题已经提issue,如果该问题已解决,可以忽略此步骤。
打开drivers/framework/support/platform/src/gpio/gpio_manager.c,将cntlr->start = start;注释即可。
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; }
- 将对应的驱动文件复制到drvier对应目录:
因为主仓代码中未将对应的驱动文件合并到driver/adpater/platform对应的目录下,固需要手动将文件拷贝到对应目录。若主仓已合入,可忽略此步骤。
注意:(如果已用xr806_-ap_mode替换原来的soc文件,则需要将拷贝原来被替换的对应文件,因为xr806_-ap_mode中的驱动文件非最新版)
// 拷贝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 = [ "." ] }
- 为了节省ram资源,可以把无用的资源先关闭,如关闭内部codec,将 device/soc/allwinner/xradio/xr806/project/prj_config.h中的PRJCONF_INTERNAL_SOUNDCARD_EN设置为0,如下:
/* Xradio internal codec sound card enable/disable */ #define PRJCONF_INTERNAL_SOUNDCARD_EN 0
4. 编译&烧录
更新hb
首先可以查看一下hb的版本,如果hb版本为0.4.4就不需要更新。
## 查看hb版本 hb --version ## 更新hb, 以下指令需要在openharmony SDK根目录执行 pip3 uninstall ohos_build pip3 install build/lite
编译
1.hb set 选择demo指令,具体命令如下: hb set -root
2.hb build 全量编译命令
hb build -f
烧录
参照文档: XR806快速上手指导文档
5. 设备配网
- 在设备上电前需准备好安装了数字管家应用的HarmonyOS手机,详情见数字管家应用开发, 并在设置中开启手机的NFC功能;
- 写设备NFC标签,详细操作见设备NFC标签指导文档;
- 烧录完成后,上电。开发者在观察开发板上状态LED灯以8Hz的频率闪烁时,将手机上半部靠近开发板NFC标签处(无NFC标签的可用NFC贴纸替代);
- 碰一碰后手机将自动拉起数字管家应用并进入配网状态。
- 配网过程中需要 连接设备的AP热点,然后填写需要配置的wifi的密码。
- 最后点击配置,手机会将ssid以及对应的密码通过AP热点发送到设备。
- 当设备端蓝灯每5s闪烁一次则代码设备联网成功。
6. 设置主密码并通过主密码开锁
- 数字管家下发修改密码指令以及修改后的密码
- 设备端接收指令以及修改后的密码进行更新
- 数字管家下方开锁指令以及开锁密码
- 设备端接收指令并判断密码是否正确,正确的话电机转动模拟开锁,否则向数字管家发送密码错误信息
7. 设置临时密码
- 数字管家下发创建临时密码指令以及创建临时密码时的信息,主要包括临时密码标志,临时密码信息,临时密码生效时间段。
- 设备端接收指令并保存信息。
- 临时用户通过数字管家下发开锁指令以及开发密码。
- 设备端接收指令并判断密码是否正确以及该密码是否在当前时间段生效,正确的话电机转动模拟开锁,否则向数字管家发送密码错误信息。
8. 门未关告警
- 设备端执行完开门指令后会一直通过超声波距离传感器来判断门是否可以关闭,如果超过5分钟发现门不能关闭,则主动向数字管家发送门未关的告警信息。
- 数字管家通过系统消息查看到告警消息。
- 数字管家可以从设备控制页面进入到告警消息页面,也可以通过点击告警消息进入到告警界面。
9. 模拟自动关门

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何基于Security框架兼容多套用户密码加密方式
一、说明 当已上线的系统存在使用其他的加密方式加密的密码数据,并且密码 不可逆 时,而新的数据采用了其他的加密方式,则需要同时兼容多种加密方式的密码校验。 例如下列几种情况: 旧系统用户的密码采用了 MD5 的加密方式,而升级框架后的新系统则采用 BCrypt 的加密方式; 当割接历史数据后会存在用户表中密码的 加密方式不统一 的问题,历史数据为 MD5 新数据为 BCrypt; 所以需要系统支持同时兼容多种加密方式的密码校验。 本文分享基于Security的PasswordEncoder来实现兼容多套用户密码加密方式。 二、DelegatingPasswordEncoder 在 spring Security 5.0之后,默认的密码加密方案其实是 DelegatingPasswordEncoder 它是一个代理类,而并非一种全新的密码加密方案,可以用来代理多种不同的密码加密方案。 代码参考: Map<String, PasswordEncoder> encoders = new HashMap<>(); encoders.put("bcrypt", new...
- 下一篇
数据采集&流批一体化工具 bboss v6.8.7 发布
bboss-datatran由bboss开源的数据采集 & 流批一体化工具,提供数据采集、数据清洗转换处理和数据入库以及数据指标统计计算流批一体化处理功能。 v6.8.7 功能改进 扩展http输入插件:增加http并行查询功能,可以根据需要划分多个参数组,实现http服务数据的并行查询功能,从而获得更好的数据采集同步性能 扩展文件采集插件:增加一次性扫描导入本地文件/FTP文件功能,通过属性disableScanNewFiles进行控制:true 一次性扫描导入本地/FTP目录下的文件,false 持续监听本地/FTP目录下的新文件(默认值false) http输入插件改进:增加对http get请求的支持,http post、http put请求增加对request参数模式的支持(非请求体dsl报文模式) http输入插件、Elasticsearch输入插件、数据库输入插件改进:分别在httpproxy访问异常、在Elasticsearch客户端访问异常、数据库客户端访问异常信息中包含http dsl、Elasticsearch dsl、db sql信息,以便快速发现和定位...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器