1
簡介
本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. 實物操作體驗
2
快速上手
1. 硬件準備
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 = [ "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目錄下文件改動較多,此處以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 */
左右滑動查看全部代碼
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
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. 模擬自動關門
-
設備端執行開門動作后,用手或者其他物體靠近超聲波距離傳感器
-
設備每隔10S檢測一次超聲波距離傳感器,發現在設定范圍內(模擬門已關),則控制電機轉動(模擬關門動作),同時上報關門信息到數字管家
原文標題:OpenHarmony開發樣例:智能門鎖
文章出處:【微信公眾號:HarmonyOS官方合作社區】歡迎添加關注!文章轉載請注明出處。
-
開發
+關注
關注
0文章
370瀏覽量
40842 -
智能門鎖
+關注
關注
17文章
1857瀏覽量
43165 -
OpenHarmony
+關注
關注
25文章
3722瀏覽量
16313
原文標題:OpenHarmony開發樣例:智能門鎖
文章出處:【微信號:HarmonyOS_Community,微信公眾號:電子發燒友開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論