一、簡(jiǎn)介
本 demo 是基于 Openharmony 3.1 Beta 本版開發(fā),不僅可以接收數(shù)字管家應(yīng)用下發(fā)的指令來控制門鎖開啟,而且還可以通過數(shù)字管家設(shè)置不同的開鎖密碼以及一次性密碼,實(shí)現(xiàn)給臨時(shí)用戶一個(gè)臨時(shí)密碼,保證門戶安全。當(dāng)然除了開鎖的功能,智能門鎖還可以通過檢測(cè)門與門鎖距離自動(dòng)上鎖以及如果長(zhǎng)時(shí)間未上鎖,上報(bào)告警消息到數(shù)字管家,及時(shí)提醒用戶關(guān)門關(guān)鎖等功能。
1. 交互流程:
如上圖所示,智能門鎖整體方案原理圖可以大致分成:智能門鎖設(shè)備、數(shù)字管家應(yīng)用、云平臺(tái)三部分。智能門鎖通過 MQTT 協(xié)議連接華為 IOT 物聯(lián)網(wǎng)平臺(tái),從而實(shí)現(xiàn)命令的接收和屬性上報(bào)。 關(guān)于智能設(shè)備接入華為云 IoT 平臺(tái)的詳細(xì)細(xì)節(jié)可以參考 連接 IOT 云平臺(tái)指南;智能設(shè)備與數(shù)字管家應(yīng)用之間的設(shè)備模型定義可以參考 profile .
2. 實(shí)物簡(jiǎn)介:
如上圖所示,上面是 XR806 開發(fā)板,中間的是 hcsr04 超聲波距離傳感器,下面是 E53_IA1 擴(kuò)展板。
我們是通過距離傳感器感應(yīng)門的距離,進(jìn)行自動(dòng)上鎖,也可以在一定時(shí)間內(nèi)無法上鎖而產(chǎn)生告警信息上傳到數(shù)字管家。
E53_IA1 擴(kuò)展板主要是通過控制電機(jī)模擬開關(guān)鎖的一個(gè)動(dòng)作。
接線說明:
距離傳感器有 4 根線,其中 echo 接 XR806 的 PA19,trig 接 XR806 的 PA20。
E53_IA1 擴(kuò)展板主需要接 3 根線,其中 IO 控制腳接 XR806 的 PA12。
實(shí)物操作體驗(yàn)
二、快速上手
1. 硬件準(zhǔn)備
xr806 模組
hcsr04 超聲波模塊
E53_IA1 擴(kuò)展板
預(yù)裝 HarmonyOS 手機(jī)一臺(tái)
2. 環(huán)境準(zhǔn)備
參照文檔: XR806 快速上手指導(dǎo)文檔
3. 編譯前準(zhǔn)備
設(shè)備側(cè)代碼下載
具體倉庫地址:https://gitee.com/openharmony-sig/knowledge_demo_smart_home/
下載方式:使用 git 命令下載,指令如下(用戶也可以根據(jù)需要將該倉庫 fork 到自己的目錄下后進(jìn)行下載)
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/
整合并修改完成后的目錄結(jié)構(gòu)如下圖:
SOC 代碼下載替換
當(dāng)前官方 soc 代碼由于 DHCP 暫未適配,所以暫時(shí)不支持 AP 模式,這時(shí)需要下載并替換之前 SOC 代碼。如果官方 soc 代碼已修復(fù)該問題,可忽略此步驟。
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,添加應(yīng)用依賴 (deps 字段):
module_group(module_name) { modules = [ "src", "project", "include", ] configs = [ ":SdkLdCconfig", ] deps = [ "http://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", "http://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 目錄下文件改動(dòng)較多,此處以 patch 方式做修改,patch 在路徑在 (team_x/smart_lock/iot_link_patch_xr806.patch),主要修改內(nèi)容:
1.BUILD.gn 修改 source_set.
2.fd 為 0 時(shí)通訊會(huì)異常,做了規(guī)避操作 (socket 創(chuàng)建時(shí)多創(chuàng)建一個(gè))。
3. 部分 mbedtl 接口未適配,做一些簡(jiǎn)單適配以及無法適配的接口需要注釋
4. 弱引用導(dǎo)致無法鏈接相關(guān)符號(hào),因此需要注釋相關(guān)文件中的弱引用。
5.osDelay 接口在 XR806 中未實(shí)現(xiàn),需要替換為 OS_Msleep ();
以上內(nèi)容修改的修改均在 iot_link_patch_xr806.patch 中,只需將該 patch 文件拷貝到 third_party/iot_link 目錄下,并執(zhí)行打補(bǔ)丁即可:
cp -af vendor/team_x/smart_lock/iot_link_patch_xr806.patch third_party/iot_link // 拷貝patch文件到對(duì)應(yīng)目錄 cd third_party/iot_link/ // cd 到對(duì)應(yīng)目錄 patch -p1./iot_link_patch_xr806.patch // 執(zhí)行打patch動(dòng)作
修改 GPIO 查找方式
因?yàn)?GPIO 框架修改了設(shè)備驅(qū)動(dòng)注冊(cè)的管腳號(hào),導(dǎo)致應(yīng)用無法根據(jù) HCS 的引腳操作對(duì)應(yīng)的 GPIO,此問題已經(jīng)提 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; }
將對(duì)應(yīng)的驅(qū)動(dòng)文件復(fù)制到 drvier 對(duì)應(yīng)目錄:
因?yàn)橹鱾}代碼中未將對(duì)應(yīng)的驅(qū)動(dòng)文件合并到 driver/adpater/platform 對(duì)應(yīng)的目錄下,固需要手動(dòng)將文件拷貝到對(duì)應(yīng)目錄。若主倉已合入,可忽略此步驟。
注意:(如果已用 xr806_-ap_mode 替換原來的 soc 文件,則需要將拷貝原來被替換的對(duì)應(yīng)文件,因?yàn)?xr806_-ap_mode 中的驅(qū)動(dòng)文件非最新版)
// 拷貝gpio驅(qū)動(dòng) 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 = [ "." ] }
為了節(jié)省 ram 資源,可以把無用的資源先關(guān)閉,如關(guān)閉內(nèi)部 codec,將 device/soc/allwinner/xradio/xr806/project/prj_config.h 中的 PRJCONF_INTERNAL_SOUNDCARD_EN 設(shè)置為 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根目錄執(zhí)行 pip3 uninstall ohos_build pip3 install build/lite
編譯
1.hb set 選擇demo指令,具體命令如下: hb set -root
如下圖所示,使用鍵盤上下鍵選中 smart_lock
2.hb build 全量編譯命令
hb build -f
燒錄
參照文檔: XR806 快速上手指導(dǎo)文檔
5. 設(shè)備配網(wǎng)
在設(shè)備上電前需準(zhǔn)備好安裝了數(shù)字管家應(yīng)用的 HarmonyOS 手機(jī),詳情見數(shù)字管家應(yīng)用開發(fā),并在設(shè)置中開啟手機(jī)的 NFC 功能;
寫設(shè)備 NFC 標(biāo)簽,詳細(xì)操作見設(shè)備 NFC 標(biāo)簽指導(dǎo)文檔;
燒錄完成后,上電。開發(fā)者在觀察開發(fā)板上狀態(tài) LED 燈以8Hz 的頻率閃爍時(shí),將手機(jī)上半部靠近開發(fā)板 NFC 標(biāo)簽處 (無 NFC 標(biāo)簽的可用 NFC 貼紙?zhí)娲?;
碰一碰后手機(jī)將自動(dòng)拉起數(shù)字管家應(yīng)用并進(jìn)入配網(wǎng)狀態(tài)。
配網(wǎng)過程中需要 連接設(shè)備的 AP 熱點(diǎn),然后填寫需要配置的 wifi 的密碼。
最后點(diǎn)擊配置,手機(jī)會(huì)將 ssid 以及對(duì)應(yīng)的密碼通過 AP 熱點(diǎn)發(fā)送到設(shè)備。
當(dāng)設(shè)備端藍(lán)燈每 5s 閃爍一次則代碼設(shè)備聯(lián)網(wǎng)成功。
6. 設(shè)置主密碼并通過主密碼開鎖
數(shù)字管家下發(fā)修改密碼指令以及修改后的密碼
設(shè)備端接收指令以及修改后的密碼進(jìn)行更新
數(shù)字管家下方開鎖指令以及開鎖密碼
設(shè)備端接收指令并判斷密碼是否正確,正確的話電機(jī)轉(zhuǎn)動(dòng)模擬開鎖,否則向數(shù)字管家發(fā)送密碼錯(cuò)誤信息
7. 設(shè)置臨時(shí)密碼
數(shù)字管家下發(fā)創(chuàng)建臨時(shí)密碼指令以及創(chuàng)建臨時(shí)密碼時(shí)的信息,主要包括臨時(shí)密碼標(biāo)志,臨時(shí)密碼信息,臨時(shí)密碼生效時(shí)間段。
設(shè)備端接收指令并保存信息。
臨時(shí)用戶通過數(shù)字管家下發(fā)開鎖指令以及開發(fā)密碼。
設(shè)備端接收指令并判斷密碼是否正確以及該密碼是否在當(dāng)前時(shí)間段生效,正確的話電機(jī)轉(zhuǎn)動(dòng)模擬開鎖,否則向數(shù)字管家發(fā)送密碼錯(cuò)誤信息。
8. 門未關(guān)告警
設(shè)備端執(zhí)行完開門指令后會(huì)一直通過超聲波距離傳感器來判斷門是否可以關(guān)閉,如果超過 5 分鐘發(fā)現(xiàn)門不能關(guān)閉,則主動(dòng)向數(shù)字管家發(fā)送門未關(guān)的告警信息。
數(shù)字管家通過系統(tǒng)消息查看到告警消息。
數(shù)字管家可以從設(shè)備控制頁面進(jìn)入到告警消息頁面,也可以通過點(diǎn)擊告警消息進(jìn)入到告警界面。
9. 模擬自動(dòng)關(guān)門
設(shè)備端執(zhí)行開門動(dòng)作后,用手或者其他物體靠近超聲波距離傳感器
設(shè)備每隔 10S 檢測(cè)一次超聲波距離傳感器,發(fā)現(xiàn)在設(shè)定范圍內(nèi) (模擬門已關(guān)),則控制電機(jī)轉(zhuǎn)動(dòng) (模擬關(guān)門動(dòng)作), 同時(shí)上報(bào)關(guān)門信息到數(shù)字管家
審核編輯 黃宇
-
智能門鎖
+關(guān)注
關(guān)注
17文章
1850瀏覽量
43039 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3665瀏覽量
16161
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論