OpenHarmony南向开发案例:【智能门锁】

一. 简介

本demo是基于Openharmony 3.1 Beta本版开发,不仅可以接收数字管家应用下发的指令来控制门锁开启,而且还可以通过数字管家设置不同的开锁密码以及一次性密码,实现给临时用户一个临时密码,保证门户安全。当然除了开锁的功能,智能门锁还可以通过检测门与门锁距离自动上锁以及如果长时间未上锁,上报告警消息到数字管家,及时提醒用户关门关锁等功能。

1. 交互流程:

如上图所示,智能门锁整体方案原理图可以大致分成:智能门锁设备、数字管家应用、云平台三部分。智能门锁通过MQTT协议连接华为IOT物联网平台,从而实现命令的接收和属性上报。 关于智能设备接入华为云IoT平台的详细细节;智能设备与数字管家应用之间的设备模型定义可以参考;鸿蒙开发文档:qr23.cn/AKFP8k点击或者复制转到即可。

2. 实物简介:

如上图所示,上面是XR806开发板,中间的是hcsr04超声波距离传感器,下面是E53_IA1扩展板。

搜狗高速浏览器截图20240326151547.png

我们是通过距离传感器感应门的距离,进行自动上锁,也可以在一定时间内无法上锁而产生告警信息上传到数字管家。

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到自己的目录下后进行下载)

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			

  • 修改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

如下图所示,使用键盘上下键选中smart_lock

  1. hb build 全量编译命令

hb build -f

烧录

参照文档: XR806快速上手指导文档

5. 设备配网
  • 在设备上电前需准备好安装了数字管家应用的HarmonyOS手机, 并在设置中开启手机的NFC功能;
  • 写设备NFC标签;
  • 烧录完成后,上电。开发者在观察开发板上状态LED灯以8Hz的频率闪烁时,将手机上半部靠近开发板NFC标签处(无NFC标签的可用NFC贴纸替代);
  • 碰一碰后手机将自动拉起数字管家应用并进入配网状态。
  • 配网过程中需要 连接设备的AP热点,然后填写需要配置的wifi的密码。
  • 最后点击配置,手机会将ssid以及对应的密码通过AP热点发送到设备。
  • 当设备端蓝灯每5s闪烁一次则代码设备联网成功。

6. 设置主密码并通过主密码开锁
  • 数字管家下发修改密码指令以及修改后的密码
  • 设备端接收指令以及修改后的密码进行更新
  • 数字管家下方开锁指令以及开锁密码
  • 设备端接收指令并判断密码是否正确,正确的话电机转动模拟开锁,否则向数字管家发送密码错误信息

7. 设置临时密码
  • 数字管家下发创建临时密码指令以及创建临时密码时的信息,主要包括临时密码标志,临时密码信息,临时密码生效时间段。
  • 设备端接收指令并保存信息。
  • 临时用户通过数字管家下发开锁指令以及开发密码。
  • 设备端接收指令并判断密码是否正确以及该密码是否在当前时间段生效,正确的话电机转动模拟开锁,否则向数字管家发送密码错误信息。

8. 门未关告警
  • 设备端执行完开门指令后会一直通过超声波距离传感器来判断门是否可以关闭,如果超过5分钟发现门不能关闭,则主动向数字管家发送门未关的告警信息。
  • 数字管家通过系统消息查看到告警消息。
  • 数字管家可以从设备控制页面进入到告警消息页面,也可以通过点击告警消息进入到告警界面。

9. 模拟自动关门
  • 设备端执行开门动作后,用手或者其他物体靠近超声波距离传感器
  • 设备每隔10S检测一次超声波距离传感器,发现在设定范围内(模拟门已关),则控制电机转动(模拟关门动作),同时上报关门信息到数字管家

鸿蒙语言有TS、ArkTS等语法,那么除了这些基础知识之外,其核心技术点有那些呢?下面就用一张整理出的鸿蒙学习路线图表示:

从上面的OpenHarmony技术梳理来看,鸿蒙的学习内容也是很多的。现在全网的鸿蒙学习文档也是非常的少,下面推荐一些:完整内容可在头像页保存,或这qr23.cn/AKFP8k甲助力

内容包含:《鸿蒙NEXT星河版开发学习文档》

  • ArkTS
  • 声明式ArkUI
  • 多媒体
  • 通信问题
  • 系统移植
  • 系统裁剪
  • FW层的原理
  • 各种开发调试工具
  • 智能设备开发
  • 分布式开发等等。

这些就是对往后开发者的分享,希望大家多多点赞关注喔!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/813841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

遍历列举俄罗斯方块的所有形状

以前玩俄罗斯方块的时候&#xff0c;就想过一个问题&#xff0c;为什么俄罗斯方块就这7种形状&#xff0c;还有没有别的形状&#xff1f;自己也在纸上画过&#xff0c;比划来比划去&#xff0c;确实就这几种形状。 继续思考一下&#xff0c;那假如是3个块组合的形状&#xff0…

网页input框自动填充问题

autocomplete 大部分查询解决办法是设置&#xff0c;autocompleteoff&#xff0c;关于autocomplete的含义&#xff0c;官网参考如下: HTML attribute: autocomplete - HTML: HyperText Markup Language | MDN 在 autocomplete 的文档中说明了 value 为 off 时&#xff0c;浏览…

双子座 Gemini1.5和谷歌的本质

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【STL】list

目录 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1.3 list capacity 1.4 list element access 1.5 list modifiers 1.6 list的迭代器失效 2. list的模拟实现 3. list与vector的对比 1. list的使用 1.1 list的构造 1.2 list iterator的使用 1. begin与end为…

KVM + GFS 分布式存储

目录 一、案例分析 1.1、案例概述 1.2、案例前置知识点 1&#xff09;Glusterfs 简介 2&#xff09;Glusterfs 特点 1.3、案例环境 1&#xff09;案例环境 2&#xff09;案例需求 3&#xff09;案例实现思路 二、案例实施 2.1、安装部署 KVM 虚拟化平台 1&…

Mac的终端配置

Mac的终端配置 参考教程包管理工具 - Homebrew出现的问题用虚拟环境解决方案&#xff1a;直接将解释器的路径放过去错误方法&#xff1a;用find查找到虚拟环境安装的路径&#xff0c;其链接的是brew安装的python路径 编辑器没有报错&#xff0c;但是运行过程中仍然找不到pandas…

JavaEE初阶Day 7:多线程(5)

目录 Day 7&#xff1a;多线程&#xff08;5&#xff09;1. 死锁2. 死锁场景3. 场景二&#xff1a;两个线程&#xff0c;两把锁4. 场景三&#xff1a;N个线程&#xff0c;M把锁5. 避免死锁问题6. 内存可见性问题 Day 7&#xff1a;多线程&#xff08;5&#xff09; 回顾synchr…

Windows下使用SDKMAN对JDK(Java)进行多版本管理

Windows下使用SDKMAN对JDK&#xff08;Java&#xff09;进行多版本管理 1.背景2.基于msys2工具2.1. msys2简介2.2. 安装与配置2.2. Windows环境变量配置参考2.3 结果确认 3. 基于WSL 1.背景 前端有nvm,python有miniconda,miniforge等&#xff0c;java呢&#xff1f;java在Linu…

前端css笔记(pink老师)

css css书写顺序 自适应屏幕 html { width: 100%; height: 100%; display: table; } body { display: table-cell; } 用了这个方法以后&#xff0c;如果希望页面内的盒子也适应屏幕大小&#xff0c;则使用以下方法&#xff0c;会根据父亲的宽高计算出该盒子的宽高 width:xx%; …

java进阶---反射

获取class对象 Testvoid reflect() throws Exception {Class userClass User.class;System.out.println(userClass.getName()); // 全类名 com.zyw.proxydemo.pojo.UserSystem.out.println(userClass.getSimpleName()); // 简名 UserClass userClass1 Class.forName("co…

SpringBoot通过UUid实现文件上传接口及问题解决

在controller中&#xff0c;添加对应的方法体&#xff1a; PostMapping("/upload")ResponseBodypublic ApiRestResponse upload(HttpServletRequest httpServletRequest, RequestParam("file")MultipartFile file) throws IOException {String fileName f…

工业项目中你连PLM系统都没见过?

什么是 PLM 软件&#xff1f; PLM 软件是用于管理全球供应链中产品或服务全生命周期环节的解决方案。它包括从物料、零部件、产品、文档、规定、工程变更单到质量工作流的数据管理。 PLM 的发展历史 从最初的产品设计管理到如今的数字化转型和智能化生产&#xff0c;PLM 在不断…

tkinter窗口组件Entry

from tkinter import * 创建主窗口 app Tk() 设置窗口大小为1040x2048(手机) app.geometry(“1040x2048”) 设置窗口背景为灰色 app.configure(bg“gray”) 定义一个函数text()&#xff0c;用于处理输入框内容的变化 def text(): # 获取输入框e1的内容 if e1.get() “…

2024年阿里云优惠券领取和使用方法

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

基于ssm的大学生租房平台的设计与实现(java源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的大学生租房平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 大学生租房平台的设计与实现的主…

架构设计参考项目系列主题:新零售SaaS架构:客户管理系统架构设计

什么是客户管理系统? 客户管理系统,也称为CRM(Customer Relationship Management),主要目标是建立、发展和维护好客户关系。 CRM系统围绕客户全生命周期的管理,吸引和留存客户,实现缩短销售周期、降低销售成本、增加销售收入的目的,从而提高企业的盈利能力和竞争力。 …

linux——Bash特性

bash是一个命令解释器&#xff0c;其支持命令行展开&#xff5b;&#xff5d;写法 alias是命令别称&#xff0c;即为命令等同于&#xff0c;使用unalias对应命令可以取消该别称 alias可以对命令进行更改

紫光展锐T610平台_4G安卓核心板方案定制开发

紫光展锐T610核心板配备Android 11操作系统&#xff0c;采用12nm制程工艺。该处理器CPU由2颗基于Cortex-A75架构的大核心和6颗基于Cortex-A55架构的小核心组成&#xff0c;最高主频为1.8GHz。GPU采用的是614.4MHz的Mali G52&#xff0c;可以流畅播放2400*1080分辨率视频&#x…

淘宝批量采集商品详情数据(属性丨详情图丨sku丨价格等)

淘宝批量采集商品详情数据&#xff08;包括属性、详情图、SKU、价格等&#xff09;可以通过以下几种方式实现&#xff1a; 使用淘宝数据抓取工具&#xff1a;这类工具&#xff0c;如某鱼等&#xff0c;能够自动化采集淘宝商品数据&#xff0c;并将其转换成CSV、Excel等格式&am…

【C++ 学习】 priority_queue 优先队列的学习!!

1 queue****的介绍** 队列是一种容器适配器&#xff0c;专门用于在FIFO上下文(先进先出)中操作&#xff0c;其中从容器一端插入元素&#xff0c;另一端提取元素。 队列作为容器适配器实现&#xff0c;容器适配器即将特定容器类封装作为其底层容器类&#xff0c;queue提供一组特…