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层的原理
  • 各种开发调试工具
  • 智能设备开发
  • 分布式开发等等。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Shopee虾皮批量上传全球产品指南

当shopee虾皮需要大量上架新产品时&#xff0c;批量工具可以更好的提升效率。通过本指南&#xff0c;你将了解如何批量上传全球商品&#xff0c;本指南适用于所有站点。 一、什么是批量上传&#xff1f; 您可以通过【中国卖家中心>>全球商品>>批量上传】功能&…

部署ssm项目时遇到的一些错误

问题一&#xff1a;项目使用maven&#xff0c;打包完之后在idea启动不了 打包完之后在idea里面运行报错&#xff0c;提示找不到springmvc.xml配置文件。 再次clean后又可以运行了。 这是因为maven打包只会打包java文件&#xff0c;配置文件不进行打包&#xff0c;导致target-…

P1157 组合的输出 (dfs深搜)

题目连接&#xff1a;P1157 组合的输出 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff1a; AC代码&#xff1a; #include<iostream> #include<cstring>using namespace std;const int N 30; int st[N];//用来存这个数用没用过&#xff08;1~n个…

redmibook 14 2020 安装 ubuntu

1. 参考博客 # Ubuntu20.10系统安装 -- 小米redmibook pro14 https://zhuanlan.zhihu.com/p/616543561# ubuntu18.04 wifi 问题 https://blog.csdn.net/u012748494/article/details/105421656/# 笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠 https://blog.csdn.net/…

智慧公厕:打造城市品质生活的必备设施

公共厕所一直是城市管理中不可忽视的一环&#xff0c;而随着智慧科技的发展&#xff0c;智慧公厕逐渐成为改善城市品质生活的利器。智慧公厕作为一种创新的公共卫生设施&#xff0c;其带来的好处不仅体现在对公共厕所的全面监测和高效智慧化管理&#xff0c;更是为市民提供了更…

蓝桥杯第十五届javab组个人总结

javab组 额今天早上打完了得对自己此次比赛做总结&#xff0c;无论是明年还参赛还是研究生蓝桥杯&#xff0c;体验感有点差&#xff0c;第一题其实一开始想手算但怕进位导致不准确还是让代码跑了&#xff0c;但跑第202420242024个数&#xff08;被20和24整除&#xff09;一直把…

算法练习第18天|111.二叉树的最小深度

111.二叉树的最小深度 111. 二叉树的最小深度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/ 题目描述&#xff1a; 给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最…

bootstrap-select 搜索过滤输入中文问题,前2个字母输入转成空格

bootstrap是v3.3.7的 v1.6.3版本的bootstrap-select,注释以下2行 //that.$menu.find(li).filter(:visible:not(.divider)).eq(0).addClass(active).find(a).focus(); // $(this).focus();

Dryad Girl Fawnia

一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色,幻想或装扮游戏。 🔥 Dryad Girl | Fawnia 一个可爱的Dryad Girl Fawnia的三维模型。她有ARKit混合形状,人形装备,多种颜色可供选择。她将是一个完美的角色…

工业控制(ICS)---COTP协议

COTP 可以理解为基于TCP的工控TCP&#xff0c;主要有五种类型&#xff1a; CR Connect Request (0x0e)——握手&#xff0c;发送方发送 CC Connect Confirm (0x0d)——握手&#xff0c;接收方发送 DT Data (0x0f)——传正常数据 UD User Data (0x04)——少见&#xff0c;传…

mysql多表查询时与子表的关系

力扣题目链接 如果最后一句代码不把a与两个表都进行连接的话会出现结果重复的问题

全网短剧搜索源码+短剧API接口 短剧下载 热门短剧 全开源可二开

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 pc端h5手机端全网短剧搜索前端源码分享 内含7000短剧资源(不支持在线播放&#xff09; 搜索API接口&#xff1a;文件内查看 全部短剧API接口&#xff1a;文件内查看 每日更新API接…

《黑神话:悟空》现已正式上架PS商城,今晚或有大动作

关于《黑神话&#xff1a;悟空》的消息可谓是喜闻乐见&#xff01;今天晚上19:10可能会有相关游戏内容放出&#xff0c;让人非常期待。而海信电视推出的《黑神话&#xff1a;悟空》专属画质模式&#xff0c;让玩家可以享受到更加细腻的游戏画面。 此外&#xff0c;海信和《黑神…

Spring Boot - 利用MDC(Mapped Diagnostic Context)实现轻量级同步/异步日志追踪

文章目录 Pre什么是MDC&#xff08;Mapped Diagnostic Context&#xff09;Slf4j 和 MDC基础工程工程结构POMlogback-spring.xmlapplication.yml同步方式方式一&#xff1a; 拦截器自定义日志拦截器添加拦截器 方式二&#xff1a; 自定义注解 AOP自定义注解 TraceLog切面 测试…

Oracle 数据库全表扫描的4种优化方法(DB)

全表扫描的工作是扫描高水位一下所有的数据块。 这里就有一个问题&#xff0c;什么是高水位线。高水位的标志存在表头。 该数据块以后都是崭新未格式化的数据块&#xff0c;高水位的目的有二。它是全表扫描的 终点&#xff0c;并行插入的起点&#xff01; 优化全表扫描的办法有…

1688官方API商品数据采集接口|阿里巴巴中国站获得1688商品详情 API 返回值说明

随着全球经济一体化和电子商务的快速发展&#xff0c;网络购物的需求日益增加。不断涌现的电商企业使得行业的竞争情况愈演愈烈。在这种情况下&#xff0c;企业不仅要加大经营力度&#xff0c;还要在自己的基础设施和技术上持续投入&#xff0c;才能更好的适应市场和消费习惯。…

李沐-19 卷积层【动手学深度学习v2】

记录下关于权重下标变换的理解&#xff1a; 从原来的Wi,j到Wi,j,k,l是从二维到四维的过程&#xff0c;如下图所示 对全连接层使用平移不变性(如&#xff1a;卷积核在移动过程是不变的)和局部性&#xff08;如&#xff1a;卷积核有一定大小&#xff09;得到卷积层&#xff0c;这…

JetBrains2024来袭

JetBrains2024来袭&#xff0c;激活包含在内的编程IDE&#xff0c;其中AppCode已下架&#xff0c;Aqua&#xff0c;RustRover不支持本地激活需要关联帐号。 Tap&#xff1a;激活稳定可靠&#xff0c;支持Windows&#xff0c;macOS&#xff0c;Linux客户端。

Linux知识

基础 Linux系统的组成 Linux内核、Linux⽂件系统、Linux shell、Linux应⽤程序。 Linux的开机启动过程 u-boot是⼀款常⽤的开源Bootloader&#xff0c;它的启动顺序如下&#xff1a; CPU上电后&#xff0c;⾸先执⾏boot ROM&#xff08;引导ROM&#xff09;代码。boot ROM…

历史上9个不可思议的巧合

历史是神奇的&#xff0c;在历史上&#xff0c;有些明明没道理的事情&#xff0c;却偏偏就这样发生了&#xff0c;明明不相关的事情&#xff0c;也偏偏就有那么一个巧合对应了。 1、国际通用的公元元年正好对应着西汉刘衎的元始元年。而这个年号正是王莽所定&#xff0c;而王莽…