|
轉(zhuǎn)發(fā):【碼上評(píng)選】在潤和HiSpark的WiFIIoT開發(fā)板通過MQTT實(shí)現(xiàn)簡易IoT智能網(wǎng)關(guān), 一、 總體介紹
1.1 視頻展示及源碼
最新更新:
視頻展示已上傳到Bilibili,鏈接為https://www.bilibili.com/video/BV1HK4y177XL?from=search&seid=5136887023363432633
源碼已上傳到Gitee,鏈接為https://gitee.com/Weijunchok/hARMony_mqtt_-io-t ,其中包括新增連接到華為云和Onenet的mqtt_test.c文件,只需修改個(gè)人連接信息即可使用。
歡迎評(píng)委老師和開發(fā)者們批評(píng)指正,讓我可以繼續(xù)完善作品
1.2 系統(tǒng)組成
本作品硬件組成包括HiSpark的WIFIIoT開發(fā)套件的核心板,0.96尺寸的OLED,Dht11溫濕度傳感器,如圖所示。
1.3 系統(tǒng)所需包
硬件系統(tǒng)實(shí)現(xiàn)需要WIFI驅(qū)動(dòng)包,Paho-MQTT,OLED驅(qū)動(dòng)包,以及DHT11驅(qū)動(dòng)采集包。
其中,需要用到潤和HiHope社區(qū)的
HarmonyOS-IoT-Application-Development 儲(chǔ)存庫代碼,地址為https://gitee.com/hihopeorg/HarmonyOS-IoT-Application-Development。具體用到的是04_Wifi,實(shí)現(xiàn)聯(lián)網(wǎng)功能,以及03_sensing的oled部分。
其次,還需用到MQTT功能,是通過Paho-MQTT進(jìn)行移植,CSDN社區(qū)已有博主移植成功,我是沿用其代碼,地址為 https://blog.csdn.net/qq_33259323/article/details/109530970
在該代碼的基礎(chǔ)上我重新封裝Publish和訂閱信息到達(dá)的On_message函數(shù)分別用于上傳傳感器數(shù)據(jù)和即時(shí)訂閱APP發(fā)來的控制命令,另外還添加心跳函數(shù)保持連接。
DHT11移植是借鑒CSDN博主小Caicai以及程序員小哈的文章,在開發(fā)板中進(jìn)行移植,地址為 https://blog.csdn.net/qq_41838541/article/details/106634984 和https://blog.csdn.net/rsd102/article/details/106084826 其中根據(jù)手冊(cè)和Harmony系統(tǒng)源碼移植了其中幾個(gè)重要函數(shù),在下面會(huì)給出展示。
實(shí)現(xiàn)遠(yuǎn)程控制所需APP我是在Android Studio通過Paho-MQTT包進(jìn)行實(shí)現(xiàn)MQTT通信,其他功能自行設(shè)計(jì)搭建。在我個(gè)人阿里云服務(wù)器上搭載了Mosquitto服務(wù)器以及數(shù)據(jù)庫,用于儲(chǔ)存通過MQTT上傳的溫濕度數(shù)據(jù)。
1.4 系統(tǒng)功能
系統(tǒng)目前能實(shí)現(xiàn)的功能:
1. 開發(fā)板定時(shí)與DHT11通信,采集溫濕度數(shù)據(jù)。
2. 開發(fā)板通過OLED顯示采集到的溫濕度數(shù)據(jù)。
3. 開發(fā)板聯(lián)網(wǎng),并連接云服務(wù)器的MQTT服務(wù)器,能與手機(jī)APP雙向通信。
4. 開發(fā)板在采集到溫濕度數(shù)據(jù)將其通過MQTT發(fā)布,云服務(wù)器監(jiān)測過溫,通過郵件提醒。
5. 開發(fā)板可訂閱手機(jī)APP發(fā)布的控制信息,并根據(jù)信息實(shí)現(xiàn)板載LED燈亮滅。
6. 云服務(wù)器上數(shù)據(jù)庫可存儲(chǔ)開發(fā)板上傳的溫濕度數(shù)據(jù),并可通過瀏覽網(wǎng)頁查看歷史數(shù)據(jù)。
二、 硬件及其功能實(shí)現(xiàn)
2.1 DhT11溫濕度傳感器
系統(tǒng)接線:
DHT11————WiFIIoT
VCC————3.3V/5V
GND————GND
DATA————GPIO0
注意事項(xiàng),根據(jù)DHT11手冊(cè),GPIO先設(shè)置成輸出模式,先給出起始信號(hào),其中要保持高/低電平若干us或者ms,這里的實(shí)現(xiàn)需要導(dǎo)入hi_time.h頭文件,調(diào)用hi_udelay()實(shí)現(xiàn)而不能用usleep()函數(shù)。其后,GPIO設(shè)置成輸入模式,接收DHT11響應(yīng)信號(hào),并根據(jù)高電平持續(xù)時(shí)間判斷該位是1還是0,寫入數(shù)據(jù)位。其中幾個(gè)主要函數(shù)如下圖。
2.2 MQTT主要函數(shù)
MQTT我在Paho_MQTT移植基礎(chǔ)上,根據(jù)實(shí)際需要與傳感器數(shù)據(jù)交互,封裝了如下幾個(gè)函數(shù),以約定的協(xié)議格式(此處沒有用JSON格式,但隨時(shí)可以稍微修改Sprintf的內(nèi)容便可實(shí)現(xiàn)JSON的TYPE3格式上傳數(shù)據(jù))封裝傳感器數(shù)據(jù)成MQTT包,并發(fā)送出去。同時(shí)每隔1s調(diào)用on_message()函數(shù)查看是否有遠(yuǎn)程控制命令到達(dá),并響應(yīng)。 此處在MQTT移植基礎(chǔ)上,第一個(gè)完善了訂閱信息處理,源碼是在Publish完再檢查是否有訂閱信息到達(dá),這會(huì)導(dǎo)致無法及時(shí)響應(yīng)訂閱數(shù)據(jù),所以我采取是新建一個(gè)線程每隔1s就查看是否有命令到達(dá)并響應(yīng)。 第二個(gè)是自定義了Publish函數(shù),更靈活地上傳數(shù)據(jù)。
雖然這里是連接我自己搭建的MQTT服務(wù)器,但根據(jù)這些源碼,只需根據(jù)華為云或Onenet注冊(cè)的信息,對(duì)應(yīng)修改MQTT連接的參數(shù)ip、port、Clientid、Username和Password即可搭建通信。再修改Publish函數(shù)為JSON格式的Type3符合云服務(wù)器的格式便可在發(fā)送后在服務(wù)器查看到對(duì)應(yīng)數(shù)據(jù)流,如:
memset(text, 0, sizeof(text));
strcpy(payload, “{“);
memset(text, 0, sizeof(text));
sprintf(text, “\“Temp\“:%.2f,“, Temp); //這里的f后面有逗號(hào),
strcat(payload, text);
memset(text, 0, sizeof(text));
sprintf(text, “\“Hum\“:%.2f“, Hum); //注意這里的f后面沒逗號(hào),
strcat(payload, text);
strcat(payload, “}“);
memset(text, 0, sizeof(text));
但需要注意每個(gè)數(shù)據(jù)流之間有逗號(hào)分隔,而最后一個(gè)數(shù)據(jù)流是沒有逗號(hào)的。
華為云或者Onenet云具體的注冊(cè)步驟就在此不細(xì)說了。
2.3 OLED主要函數(shù)
OLED————WiFIIoT
VCC————3.3V
GND————GND
SCL————SCL
SDA————SDA
Oledshowdata主要實(shí)現(xiàn)與傳感器數(shù)據(jù)交互,可視化顯示采集數(shù)據(jù)。其他函數(shù)可以根據(jù)oleddemo,無需太大修改。
三、 實(shí)物效果 3.1 開發(fā)板串口數(shù)據(jù)
3.2 OLED顯示效果
3.3 云服務(wù)器MQTT日志
3.4 云服務(wù)器查看歷史數(shù)據(jù)
3.5 手機(jī)APP顯示效果
3.6 手機(jī)APP遠(yuǎn)程控制效果
3.7 手機(jī)APP設(shè)置MQTT參數(shù)
3.8 溫濕度過限郵件提醒
四、 作品未來展望
4.1 MQTT
手機(jī)APP在設(shè)計(jì)上面已經(jīng)考慮到連接公有云和私有云的問題,具體區(qū)別在于,例如在連接Onenet,華為云時(shí),MQTT連接時(shí)的ClientID應(yīng)改為對(duì)應(yīng)的產(chǎn)品ID,而用戶名和密碼則按照各自規(guī)則修改,修改實(shí)現(xiàn)可通過APP上MQTT參數(shù)設(shè)置修改。
4.2 更多功能
4.2.1 語音模塊或紅外模塊接入
我手頭上有語音模塊,尚未完成移植,我在其他平臺(tái)上已有實(shí)現(xiàn)初步效果,理論可行,具體實(shí)現(xiàn)開發(fā)板作為網(wǎng)關(guān),用戶可通過語音模塊發(fā)出指令控制開發(fā)板下發(fā)命令控制家居終端。
4.2.2 通信技術(shù)
未來我計(jì)劃是用華為海思的HPLC高速電力線載波通信技術(shù)連接家居終端,所以目前我先用這款開發(fā)板進(jìn)行鴻蒙系統(tǒng)的學(xué)習(xí),效果十分好。另外還可以使用諸如Zigbee,NB-IOT等技術(shù),目前我還在移植階段,初有成效。
4.3 外設(shè)功能移植
目前正在進(jìn)行SPI通信以及UARST串口接收信息處理移植,可用于后續(xù)連接更多外設(shè)完善功能。
4.4 美中不足
作品還存在一定的缺陷,例如,目前僅有網(wǎng)關(guān),還缺少終端節(jié)點(diǎn)。終端節(jié)點(diǎn)理論上可以選用Arduino,STM32平臺(tái)進(jìn)行開發(fā),也已經(jīng)調(diào)好。我預(yù)計(jì)是使用LoRa通信技術(shù)作為網(wǎng)關(guān)和節(jié)點(diǎn)之間的通信橋梁,但個(gè)人能力有限,SPI通信的LoRa驅(qū)動(dòng)庫在開發(fā)板的移植尚未完成,盡管我的節(jié)點(diǎn)已經(jīng)調(diào)好。網(wǎng)關(guān)僅完成到與LoRa模塊通信成功,尚未設(shè)置其他參數(shù),在今后將爭取早日完成LoRa移植,使得網(wǎng)關(guān)能夠與節(jié)點(diǎn)成功通信,實(shí)現(xiàn)智能家居。
五、 總結(jié),分享開發(fā)經(jīng)驗(yàn) 本次作品是我購買潤和HiSpark開發(fā)板后學(xué)習(xí)了幾個(gè)星期后制作出來的,初步實(shí)現(xiàn)預(yù)想功能,還有很多進(jìn)一步開發(fā)的空間;叵肫痖_始板子到手時(shí),我第一時(shí)間是想嘗試燒錄程序,所以進(jìn)行開發(fā)環(huán)境搭建,這個(gè)過程比較痛苦,我折騰了幾個(gè)小時(shí)都沒辦法順利完成,感謝連老師放出的Ubuntu鏡像,解決了我開發(fā)第一步難題。
我學(xué)習(xí)的第二步就是嘗試對(duì)LED示例進(jìn)行小修改,探索代碼組成和工作原理,在這過程里,我學(xué)習(xí)了GPIO基本操作,接入我自己的LED燈模塊實(shí)現(xiàn)了流水燈功能。
我學(xué)習(xí)的第三步就是開拓思路,計(jì)劃我需要實(shí)現(xiàn)的功能,第一個(gè)是WIFI聯(lián)網(wǎng),第二個(gè)是MQTT通信接入MQTT服務(wù)器,第三個(gè)是傳感器數(shù)據(jù)采集,第四個(gè)是OLED顯示及手機(jī)APP遠(yuǎn)程控制。
根據(jù)我第三步的計(jì)劃,WIFI功能可以根據(jù)潤和社區(qū)的Demo實(shí)現(xiàn)聯(lián)網(wǎng),緊接著是MQTT通過移植別人做好的基礎(chǔ),然后再根據(jù)自己的想法封裝Publish函數(shù),實(shí)現(xiàn)與傳感器數(shù)據(jù)交互。封裝On_message函數(shù),實(shí)現(xiàn)遠(yuǎn)程控制交互,OLED也同樣道理,在看懂代碼后,封裝OLEDshowdata函數(shù),實(shí)現(xiàn)與傳感器數(shù)據(jù)交互。
上面是我目前實(shí)現(xiàn)功能的思路,當(dāng)前學(xué)習(xí)我遇到了新的問題,新的想法,比如,在前人沒有給出經(jīng)驗(yàn)和Demo的時(shí)候,遇到一個(gè)陌生的問題如何解決?我目前嘗試是SPI通信,在代碼包里面有Hi3861的app_demo,有wifiiot_spi.c,我該如何利用,調(diào)用它們實(shí)現(xiàn)我的功能。
簡單的調(diào)用是無法實(shí)現(xiàn)的,比如,我單純調(diào)用wifiiot_spi.c的spiinit(),spihostwrite(),是無法實(shí)現(xiàn)與SPI設(shè)備通信的,其原因可以在app_demo_spi.c中查看。就是因?yàn)閟piinit()前還需要設(shè)置GPIO的功能,所以我封裝了基于wifiiot的頂層函數(shù),用于設(shè)置SPI0,SPI1的引腳功能,再根據(jù)app_demo_spi.c內(nèi)容進(jìn)行函數(shù)移植,去完成SPI通信,目前我已成功與SPI設(shè)備握手并讀取到我需要的數(shù)據(jù)。
六、 鳴謝 鳴謝HarmonyOS & 潤和HiSpark實(shí)戰(zhàn)開發(fā),“碼”上評(píng)選活動(dòng)舉辦方,提供一個(gè)學(xué)習(xí)和實(shí)戰(zhàn)機(jī)會(huì)給我,用于實(shí)現(xiàn)心中的想法和更深入掌握鴻蒙系統(tǒng)代碼的編寫。鳴謝潤和HiSpark開發(fā)出一款這么好的開發(fā)板,讓我可以近距離學(xué)習(xí)鴻蒙系統(tǒng)。鳴謝潤和鴻蒙技術(shù)交流群的成員,幫助初學(xué)者入門這款開發(fā)板,對(duì)我們遇到的問題給予幫助。鳴謝Gitee的潤和開發(fā)社區(qū)的代碼分享,鳴謝CSDN社區(qū)的多位博主的經(jīng)驗(yàn)。
最后,希望評(píng)委老師和各位開發(fā)者不吝賜教,指出作品存在問題,幫助我一起完善作品,十分感謝。
七、源碼
我的源碼上傳到了Gitee,地址是https://gitee.com/Weijunchok/harmony_mqtt_-io-t 有興趣的開發(fā)者可以將app目錄的文件放置在個(gè)人的code-1.0\applications\sample\wifi-iot\app下,將domain里面的各個(gè)lib文件夾放在個(gè)人的code-1.0\domains\iot\link下。下面評(píng)論區(qū)我也會(huì)簡單介紹一下基本的開發(fā)過程和注意事項(xiàng),希望大家多多交流和討論。
作者:Aaron |
|