鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件7.3 鴻蒙設(shè)備端開發(fā)_第1頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件7.3 鴻蒙設(shè)備端開發(fā)_第2頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件7.3 鴻蒙設(shè)備端開發(fā)_第3頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件7.3 鴻蒙設(shè)備端開發(fā)_第4頁
鴻蒙南北向開發(fā)基礎(chǔ)及項目實戰(zhàn)教程 課件7.3 鴻蒙設(shè)備端開發(fā)_第5頁
已閱讀5頁,還剩30頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

7.3鴻蒙設(shè)備端開發(fā)

本章主要講述分布式倉庫環(huán)境監(jiān)測項目設(shè)備端開發(fā)過程。通過學習本節(jié)將能夠了解分布式倉庫環(huán)境監(jiān)測項目設(shè)備端開發(fā)過程。通過本節(jié)學習可以熟悉:項目源碼工程配置AHT20溫濕度模塊編程TCP服務(wù)器端模塊編程設(shè)備端主程序編程項目源碼工程配置AHT20溫濕度模塊編程TCP服務(wù)器端模塊編程設(shè)備端主程序編程項目源碼工程配置(1/5)

源碼工程的app目錄下創(chuàng)建IoTWareHouse文件夾,用于存放當前項目的所有源文件及文件夾。接著,將第5章中的IoTWiFi、IoTUdp、IoTRelay、IoTAdcSensor、IoTHumanSensor等功能模塊的整個源碼目錄復(fù)制到IoTWareHouse目錄下。然后,在該目錄下分別創(chuàng)建IoTAht20目錄、IoTTcpServer目錄、以及IoTMain目錄。項目源碼工程配置(2/5)

先將項目實現(xiàn)Wi-Fi的連接與支持UDP廣播查詢設(shè)備的功能,修改app目錄下的BUILD.gn文件,改成編譯IoTWareHouse項目:import("http://build/lite/config/component/lite_component.gni")

lite_component("app"){

features=[#

"IoTFactory:app",

"IoTWareHouse:app"

]}項目源碼工程配置(3/5)然后修改IoTWareHouse目錄下BUILD.gn文件內(nèi)容,將各個功能模塊編入程序:import("http://build/lite/config/component/lite_component.gni")lite_component("app"){features=["IoTMain:IoTMain","IoTAdcSensor:IoTAdcSensor","IoTWiFi:IoTWiFi","IoTHumanSensor:IoTHumanSensor","IoTUdp:IoTUdp","IoTRelay:IoTRelay",]}項目源碼工程配置(4/5)在IoTMain模塊目錄下創(chuàng)建IoTMain.c源文件,并在源文件中通過調(diào)用IoTWiFi與IoTUdp功能模塊實現(xiàn)支持UDP廣播查詢設(shè)備的功能。IoTMain.c關(guān)鍵代碼:voidudpRcvCallback(char*data,intlen,char*ip,intport){//當接收到"scanningDev"時回復(fù)"iamDev"}voidIoTMainInit(){

IoTWiFiConnect(WIFI_SSID,WIFI_PASSWD);//WiFi連接

//等待連接成功,并輸出IP地址

//設(shè)置UDP接收回調(diào)函數(shù)

IoTUdpRcvFunc(udpRcvCallback);}APP_FEATURE_INIT(IoTMainInit);項目源碼工程配置(5/5)在IoTMain目錄下創(chuàng)建BUILD.gn編譯配置文件,并在BUILD.gn文件增加引用功能模塊頭文件所在路徑:static_library("IoTMain"){sources=["IoTMain.c"]include_dirs=["../IoTAdcSensor","../IoTWiFi","../IoTUdp","../IoTHumanSensor","../IoTRelay",...項目源碼工程配置AHT20溫濕度模塊編程TCP服務(wù)器端模塊編程設(shè)備端主程序編程AHT20溫濕度模塊編程(1/8)AHT20本質(zhì)上就是一個I2C設(shè)備,但在I2C的電路中,每個設(shè)備都會有一個設(shè)備地址。參考AHT20產(chǎn)品手冊,我們可以確定AHT20的設(shè)備地址為0x38。在AHT20產(chǎn)品手冊中具體介紹了AHT20的驅(qū)動步驟過程如下1.

上電后要等待40ms,讀取溫濕度值之前,首先要看狀態(tài)字的校準使能位Bit[3]是否為1(通過發(fā)送0x71可以獲取一個字節(jié)的狀態(tài)字),如果不為1,要發(fā)送0xBE命令(初始化),此命令參數(shù)有兩個字節(jié)數(shù)據(jù),第一個字節(jié)為0x08,第二個字節(jié)為0x00,然后等待10ms。2.

直接發(fā)送0xAC命令(觸發(fā)測量),此命令參數(shù)有兩個字節(jié)數(shù)據(jù),第一個字節(jié)為0x33,第二個字節(jié)為0x00。3.

等待80ms待測量完成,如果讀取狀態(tài)字Bit[7]為0,表示測量完成,然后可以連續(xù)讀取六個字節(jié);否則繼續(xù)等待。4.

當接收完六個字節(jié)后,緊接著下一個字節(jié)是校驗和數(shù)據(jù),用戶可以根據(jù)需要讀出。根據(jù)轉(zhuǎn)換公式計算出具體的溫濕度值。AHT20溫濕度模塊編程(2/8)AHT20模塊的I2C通信過程的時序:AHT20溫濕度模塊編程(3/8)轉(zhuǎn)換公式:AHT20溫濕度模塊編程(4/8)在IoTAht20目錄下創(chuàng)建IoTAht20.h頭文件,在此頭文件聲明功能模塊的函數(shù):#ifndef__IOT_AHT20_H#define__IOT_AHT20_H

//調(diào)用此函數(shù)獲取濕度與溫度數(shù)據(jù)intIoTAht20GetData(float*humidity,float*temperature);#endifAHT20溫濕度模塊編程(5/8)創(chuàng)建IoTAht20.c源文件,并在源文件中實現(xiàn)AHT20獲取溫濕度數(shù)據(jù)的功能創(chuàng)建IoTAht20.c源文件,并在源文件中實現(xiàn)AHT20獲取溫濕度數(shù)據(jù)的功能。關(guān)鍵代碼:/*通過發(fā)送0x71可以獲取一個字節(jié)的狀態(tài)字),狀態(tài)字的校準使能位Bit[3]是否為1,如果不為1,要發(fā)送0xBE命令(初始化),此命令參數(shù)有兩個字節(jié),第一個字節(jié)為0x08,第二個字節(jié)為0x00,然后等待10ms。*/intIoTAht20Check();intIoTAht20GetData(float*humidity,float*temperature){/*直接發(fā)送0xAC命令(觸發(fā)測量),此命令參數(shù)有兩個字節(jié),第一個字節(jié)為0x33,第二個字節(jié)為0x00。*///等待80ms待測量完成,讀取7字節(jié)數(shù)據(jù)//如果讀取狀態(tài)字Bit[7]為0,表示測量完成

//獲取AHT20輸出的溫濕度數(shù)據(jù),根據(jù)公式轉(zhuǎn)換成真實的溫濕度值}AHT20溫濕度模塊編程(6/8)voidIoTAht20Init()//初始化{//配置IO口由I2C控制器使用//配置上拉

//初始化第0個I2C控制器,I2C傳輸率400KHzIoTAht20Check();//檢查AHT20}SYS_RUN(IoTAht20Init);AHT20溫濕度模塊編程(7/8)然后創(chuàng)建BUILD.gn編譯配置文件,實現(xiàn)AHT20功能模塊的編譯:static_library("IoTAht20"){sources=["IoTAht20.c",]include_dirs=["./","http://utils/native/lite/include","http://kernel/liteos_m/kal/cmsis","http://base/iot_hardware/peripheral/interfaces/kits",]}AHT20溫濕度模塊編程(8/8)

完成后,修改IoTWareHouse目錄下的BUILD.gn文件,實現(xiàn)將IoTAht20功能模塊編進項目中:lite_component("app"){features=[..."IoTAht20:IoTAht20",]}在IoTMain主程序模塊下測試AHT20傳感器的應(yīng)用。先修改IoTMain目錄下的BUILD.gn文件,增加IoTAht20.h頭文件的所在路徑

include_dirs=[...

"../IoTAht20",

]項目源碼工程配置AHT20溫濕度模塊編程TCP服務(wù)器端模塊編程設(shè)備端主程序編程TCP服務(wù)器端模塊編程(1/8)TCP服務(wù)器端Socket編程步驟:1.通過socket函數(shù)與網(wǎng)絡(luò)協(xié)議棧建立聯(lián)系,指定IPV4版本的TCP協(xié)議。intsd=socket(AF_INET,SOCK_STREAM,0)函數(shù)成功得到sd文件描述符,后續(xù)操作通過此sd與網(wǎng)絡(luò)協(xié)議棧進行交互操作。2.通過bind函數(shù)綁定使用的IP地址對應(yīng)的網(wǎng)絡(luò)設(shè)備,

與指定使用端口號。intret=bind(sd,(structsockaddr*)&addr,sizeof(addr));綁定失敗返回負數(shù),成功返回0。3.通過listen函數(shù)向網(wǎng)絡(luò)協(xié)議棧申請客戶端等待連接處理的隊列大小,即進入監(jiān)聽工作狀態(tài)。listen(sd,100);//最多可以有100個客戶端等待服務(wù)器端連接處理4.通過accept函數(shù)等待并處理客戶端連接。每個客戶端連接成功后,得到一個文件描述符。intclientFd=accept(sd,&saddr,&addr_len);5.通過clientFd文件描述符的read/write函數(shù)操作與客戶端進行一對一的通信。6.網(wǎng)絡(luò)通信完畢后,通過close函數(shù)斷開與網(wǎng)絡(luò)協(xié)議棧的聯(lián)系。close(clientFd);TCP服務(wù)器端模塊編程(2/8)在IoTTcpServer目錄創(chuàng)建IoTTcpServer.h頭文件用于聲明TCP網(wǎng)絡(luò)通信的回調(diào)函數(shù):#ifndef__IOTTCPServer_H#define__IOTTCPServer_H//聲明回調(diào)函數(shù)的類型typedefvoid(*JTCP_HANDLER)(intclientFd,char*data,intdataLen);//TCP接收處理回調(diào)函數(shù)的設(shè)置,tcpRcvFunc為當接收到客戶端的tcp數(shù)據(jù)時自動調(diào)用的回調(diào)函數(shù),data為接收緩沖區(qū)地址,dataLen為緩沖區(qū)數(shù)據(jù)大小intIoTTcpRcvFunc(JTCP_HANDLERtcpRcvFunc);#endifTCP服務(wù)器端模塊編程(3/8)創(chuàng)建IoTTcpServer.c源文件中實現(xiàn)TCP服務(wù)器端的網(wǎng)絡(luò)通信具體功能,IoTTcpServer.c源文件關(guān)鍵函數(shù):staticvoid*tcpRcvThread(void*arg);//接收線程函數(shù),處理每個客戶端的通信staticvoid*tcpAcceptThread(void*arg);//專門處理客戶端的線程函數(shù),并每個連接的客戶端創(chuàng)建專門接收數(shù)據(jù)的線程intIoTTcpRcvFunc(JTCP_HANDLERfunc);//記錄接收時需要調(diào)用的回調(diào)函數(shù)的地址staticvoidIoTTcpServerInit(void){//1.模塊初始化時,與網(wǎng)絡(luò)協(xié)議棧建立聯(lián)系,指定使用TCP協(xié)議//2.綁定使用10086端口號//3.設(shè)置客戶端等待連接的隊列大小,并進入監(jiān)聽狀態(tài)//創(chuàng)建處理客戶端連接的線程}SYS_RUN(IoTTcpServerInit)TCP服務(wù)器端模塊編程(4/8)IoTTcpServer模塊目錄下的BUILD.gn編譯配置文件:static_library("IoTTcpServer"){sources=["IoTTcpServer.c",]include_dirs=["./","http://utils/native/lite/include","http://kernel/liteos_m/kal/cmsis","http://base/iot_hardware/peripheral/interfaces/kits","http://foundation/communication/wifi_lite/interfaces/wifiservice","http://vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include",]}TCP服務(wù)器端模塊編程(5/8)

然后修改項目IoTWareHouse目錄下的BUILD.gn文件,讓IoTTcpServer功能模塊編譯加入項目程序:lite_component("app"){features=[..."IoTTcpServer:IoTTcpServer",]}在IoTMain目錄下BUILD.gn增加IoTTcpServer模塊的IoTTcpServer.h頭文件所在路徑include_dirs=[..."../IoTTcpServer",]TCP服務(wù)器端模塊編程(6/8)修改IoTMain目錄下的IoTMain.c源文件。在程序中待Wi-Fi連接成功后,設(shè)置TCP通信的回調(diào)函數(shù),并在該函數(shù)中實現(xiàn)將接收到的數(shù)據(jù)回傳到客戶端的功能:#include"IoTTcpServer.h"http://TCP通信的回調(diào)函數(shù)voidtcpRcvCallback(intclientFd,char*data,intlen){//通過文件描述符獲取客戶端的IP地址及端口號//向客戶端回傳數(shù)據(jù),即將客戶端傳輸?shù)臄?shù)據(jù)轉(zhuǎn)傳回去。}voidIoTMainInit(){...//設(shè)置TCP接收回調(diào)函數(shù)IoTTcpRcvFunc(tcpRcvCallback);}TCP服務(wù)器端模塊編程(7/8)代碼編輯完成后,編譯并燒錄程序。通過Socket調(diào)試工具對PC端與設(shè)備端的TCP通信進行測試,設(shè)備端的終端輸出:TCP服務(wù)器端模塊編程(8/8)Socket調(diào)試工具測試頁面:項目源碼工程配置AHT20溫濕度模塊編程TCP服務(wù)器端模塊編程設(shè)備端主程序編程設(shè)備端主程序編程(1/4)通過調(diào)用功能模塊的功能,來完成整個項目程序的開發(fā)工作。與第5章的項目功能一樣,支持App端通過UDP廣播查詢設(shè)備功能,UDP通信協(xié)議如下:

手機端發(fā):"scanningDev",設(shè)備端回復(fù)"iamDev"同時通過TCP通信,支持App端向設(shè)備端更新傳感器數(shù)據(jù)及布防功能,通信協(xié)議如下:手機端發(fā):"cmdDev:updateSensor",設(shè)備端回復(fù)"dataDev:溫度數(shù)據(jù):濕度數(shù)據(jù):煙霧數(shù)據(jù):人體感應(yīng)數(shù)據(jù)"

手機端發(fā):"cmdDev:guardOn",設(shè)備端回復(fù)"dataDev:guardOn"http://設(shè)備端進入布防狀態(tài),當感應(yīng)人體活動或煙霧傳感器數(shù)據(jù)異常時則拉響警報手機端發(fā):"cmdDev:guardOff",設(shè)備端回復(fù)"dataDev:guardOff"http://設(shè)備端退出布防狀

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論