一、前言
1.1 項(xiàng)目開(kāi)發(fā)背景
隨著科技的迅速發(fā)展,物聯(lián)網(wǎng)(IoT)技術(shù)在各個(gè)領(lǐng)域的應(yīng)用日益廣泛,尤其是在智慧場(chǎng)館管理中表現(xiàn)出強(qiáng)大的潛力。陳列館作為重要的文化遺產(chǎn)和文物展示空間,其環(huán)境的精細(xì)化管理至關(guān)重要。文物的保存對(duì)溫度、濕度、光照等環(huán)境參數(shù)有著嚴(yán)格要求,同時(shí)也需要高度重視安全防范工作,防止火災(zāi)和盜竊等突發(fā)事件對(duì)文物造成損害。因此,設(shè)計(jì)一套基于物聯(lián)網(wǎng)技術(shù)的智能監(jiān)控系統(tǒng),可以有效提升陳列館的管理效率和文物保護(hù)水平。
傳統(tǒng)的陳列館監(jiān)控方式通常依賴人工定時(shí)巡查和簡(jiǎn)單的環(huán)境監(jiān)測(cè)設(shè)備,缺乏自動(dòng)化與智能化手段。這種方式不僅效率低下,而且在緊急情況下響應(yīng)能力有限。通過(guò)物聯(lián)網(wǎng)技術(shù)與智能化手段的結(jié)合,可以實(shí)現(xiàn)對(duì)陳列館內(nèi)環(huán)境參數(shù)和安全狀況的全面感知和實(shí)時(shí)管理,大幅提高運(yùn)行效率和風(fēng)險(xiǎn)防范能力。
該項(xiàng)目構(gòu)建一個(gè)功能全面、實(shí)時(shí)監(jiān)控的陳列館智能監(jiān)控系統(tǒng)。通過(guò)引入高精度的溫濕度傳感器(SHT30)、光照強(qiáng)度檢測(cè)模(BH1750)、煙霧和火焰傳感器(MQ2和火焰?zhèn)鞲衅鳎瑢?shí)時(shí)采集館內(nèi)環(huán)境數(shù)據(jù),并利用10寸LCD顯示屏進(jìn)行本地展示,同時(shí)通過(guò)WIFI模塊(ESP8266)和MQTT協(xié)議將數(shù)據(jù)上傳至華為云IoT平臺(tái),實(shí)現(xiàn)云端存儲(chǔ)與分析。結(jié)合Qt開(kāi)發(fā)的Windows可視化大屏,工作人員可以在辦公室內(nèi)直觀查看環(huán)境參數(shù)、預(yù)警信息及陳列館實(shí)時(shí)監(jiān)控畫面,進(jìn)一步提升管理便捷性。
此外,系統(tǒng)還結(jié)合了視頻監(jiān)控功能,采用支持RTMP推流的獨(dú)立攝像頭,將實(shí)時(shí)視頻畫面通過(guò)NGINX服務(wù)器推流至華為云ECS服務(wù)器,并在可視化大屏上呈現(xiàn)。同時(shí),通過(guò)深度學(xué)習(xí)算法對(duì)視頻畫面進(jìn)行人體識(shí)別,實(shí)時(shí)統(tǒng)計(jì)陳列館內(nèi)人流量并生成每日統(tǒng)計(jì)數(shù)據(jù),為場(chǎng)館運(yùn)營(yíng)提供決策依據(jù)。
本系統(tǒng)的開(kāi)發(fā)不僅滿足了陳列館日常環(huán)境監(jiān)控與安全管理的需求,還通過(guò)引入先進(jìn)的IoT技術(shù)和視頻分析能力,為文物保護(hù)和場(chǎng)館管理提供了一種高效、智能的解決方案,具有廣泛的推廣價(jià)值和應(yīng)用前景。
大屏調(diào)試
下面是陳列館
的內(nèi)部實(shí)景一角。
1.2 設(shè)計(jì)實(shí)現(xiàn)的功能
(1)溫濕度檢測(cè)
使用SHT30傳感器實(shí)時(shí)檢測(cè)陳列館內(nèi)的環(huán)境溫度和濕度,確保文物保存的適宜條件。
(2)光照強(qiáng)度檢測(cè)
使用BH1750傳感器實(shí)時(shí)檢測(cè)光照強(qiáng)度,避免強(qiáng)光對(duì)文物造成損害。
(3)煙霧與火焰檢測(cè)
通過(guò)MQ2傳感器檢測(cè)煙霧濃度和火焰?zhèn)鞲衅鳈z測(cè)火光,及時(shí)發(fā)現(xiàn)火災(zāi)隱患。一旦檢測(cè)到火情,系統(tǒng)將立即拉響警報(bào)并觸發(fā)報(bào)警機(jī)制。
(4)本地?cái)?shù)據(jù)顯示
配備10寸LCD顯示屏,實(shí)時(shí)展示采集的溫濕度、光照強(qiáng)度等環(huán)境參數(shù)。顯示屏安裝在陳列館大門口,方便工作人員查看。
(5)數(shù)據(jù)上傳與云端存儲(chǔ)
使用ESP8266模塊,通過(guò)WIFI和MQTT協(xié)議,將采集到的環(huán)境數(shù)據(jù)上傳至華為云IoT物聯(lián)網(wǎng)平臺(tái)進(jìn)行存儲(chǔ)和管理。
(6)可視化大屏顯示
在辦公室內(nèi)的Windows電腦上,通過(guò)Qt開(kāi)發(fā)的可視化大屏展示環(huán)境參數(shù)、實(shí)時(shí)監(jiān)控畫面及預(yù)警信息,方便工作人員遠(yuǎn)程管理。
(7)環(huán)境參數(shù)預(yù)警
當(dāng)溫濕度、光照強(qiáng)度超出預(yù)設(shè)閾值時(shí),系統(tǒng)會(huì)在可視化大屏上發(fā)出警示,提醒工作人員及時(shí)采取措施。
(8)視頻監(jiān)控與實(shí)時(shí)推流
使用支持RTMP協(xié)議的獨(dú)立攝像頭,通過(guò)NGINX服務(wù)器推流,將實(shí)時(shí)監(jiān)控畫面上傳至華為云ECS服務(wù)器。可視化大屏上可以實(shí)時(shí)查看視頻監(jiān)控畫面,便于隨時(shí)了解館內(nèi)情況。
(9)人流量監(jiān)控與統(tǒng)計(jì)
基于深度學(xué)習(xí)算法進(jìn)行人體識(shí)別,實(shí)時(shí)統(tǒng)計(jì)陳列館內(nèi)的人流量。在可視化大屏上顯示當(dāng)前人流量,并生成每日統(tǒng)計(jì)數(shù)據(jù),為運(yùn)營(yíng)分析提供支持。
(10)火災(zāi)警報(bào)與應(yīng)急響應(yīng)
在檢測(cè)到火災(zāi)時(shí),系統(tǒng)會(huì)自動(dòng)觸發(fā)警報(bào),同時(shí)上傳報(bào)警信息到云端,提醒工作人員采取應(yīng)急措施。
(11)穩(wěn)定供電支持
系統(tǒng)通過(guò)220V市電供電,保證設(shè)備長(zhǎng)期穩(wěn)定運(yùn)行,滿足陳列館全天候監(jiān)控需求。
1.3 項(xiàng)目硬件模塊組成
(1)主控芯片(STM32F103RCT6)
作為系統(tǒng)的核心控制單元,負(fù)責(zé)接收和處理各類傳感器的數(shù)據(jù),控制顯示屏顯示內(nèi)容,管理與云端的通信等功能。
(2)溫濕度傳感器(SHT30)
用于實(shí)時(shí)檢測(cè)陳列館內(nèi)的環(huán)境溫度和濕度,數(shù)據(jù)將被傳輸?shù)街骺匦酒M(jìn)行處理和顯示。
(3)光照強(qiáng)度傳感器(BH1750)
用于測(cè)量陳列館內(nèi)的光照強(qiáng)度,確保館內(nèi)光照水平符合文物保護(hù)的需求。
(4)煙霧傳感器(MQ2)
用于檢測(cè)館內(nèi)是否有煙霧存在,及時(shí)發(fā)現(xiàn)火災(zāi)隱患,防止火災(zāi)的發(fā)生。
(5)火焰?zhèn)鞲衅?/strong>
用于檢測(cè)火焰的存在,一旦檢測(cè)到火焰,立即觸發(fā)報(bào)警系統(tǒng)進(jìn)行應(yīng)急處理。
(6)WIFI模塊(ESP8266)
負(fù)責(zé)通過(guò)WIFI將傳感器采集的數(shù)據(jù)上傳至華為云IoT平臺(tái),支持與云端的通信和數(shù)據(jù)傳輸。
(7)顯示屏(10寸LCD顯示屏)
用于實(shí)時(shí)顯示陳列館內(nèi)的環(huán)境參數(shù),如溫濕度、光照強(qiáng)度等,便于工作人員進(jìn)行現(xiàn)場(chǎng)監(jiān)控。
(8)220V市電供電模塊
為整個(gè)系統(tǒng)提供穩(wěn)定的電源支持,確保硬件設(shè)備持續(xù)運(yùn)行。
(9)監(jiān)控?cái)z像頭(支持RTMP協(xié)議)
用于實(shí)時(shí)采集陳列館內(nèi)的畫面,并通過(guò)RTMP協(xié)議將視頻推送至云端,支持視頻監(jiān)控和人流量統(tǒng)計(jì)功能。
(10)視頻推流服務(wù)器(NGINX服務(wù)器)
用于接收來(lái)自監(jiān)控?cái)z像頭的RTMP視頻流,并將其轉(zhuǎn)發(fā)至華為云ECS服務(wù)器,實(shí)現(xiàn)實(shí)時(shí)視頻監(jiān)控功能。
(11)環(huán)境參數(shù)報(bào)警模塊
當(dāng)檢測(cè)到溫濕度或光照強(qiáng)度超出預(yù)設(shè)閾值時(shí),系統(tǒng)將通過(guò)警報(bào)裝置(如蜂鳴器、LED指示燈等)向工作人員發(fā)出預(yù)警信號(hào)。
1.4 設(shè)計(jì)思路
本項(xiàng)目的設(shè)計(jì)思路是通過(guò)物聯(lián)網(wǎng)技術(shù)將傳感器數(shù)據(jù)采集、視頻監(jiān)控和云端管理相結(jié)合,構(gòu)建一個(gè)智能化、自動(dòng)化的陳列館環(huán)境監(jiān)控系統(tǒng)。其核心目標(biāo)是實(shí)時(shí)監(jiān)測(cè)環(huán)境參數(shù)、確保文物安全,并通過(guò)智能化管理提升陳列館的運(yùn)營(yíng)效率。
系統(tǒng)通過(guò)多種傳感器模塊實(shí)現(xiàn)環(huán)境參數(shù)的實(shí)時(shí)監(jiān)測(cè)。溫濕度傳感器(SHT30)和光照強(qiáng)度傳感器(BH1750)負(fù)責(zé)監(jiān)測(cè)陳列館內(nèi)部的溫度、濕度和光照強(qiáng)度,確保環(huán)境條件適宜文物的保存。煙霧傳感器(MQ2)和火焰?zhèn)鞲衅鲃t負(fù)責(zé)檢測(cè)館內(nèi)是否存在火災(zāi)隱患,一旦發(fā)生異常,系統(tǒng)會(huì)及時(shí)響應(yīng)并觸發(fā)報(bào)警機(jī)制,保障館內(nèi)的安全。
所有采集的數(shù)據(jù)通過(guò)主控芯片STM32F103RCT6進(jìn)行處理,傳感器的數(shù)據(jù)通過(guò)WIFI模塊(ESP8266)被上傳到華為云IoT平臺(tái),進(jìn)行遠(yuǎn)程存儲(chǔ)和管理。這一部分的設(shè)計(jì)思路是通過(guò)云端的集中式存儲(chǔ),方便數(shù)據(jù)的后期分析與統(tǒng)計(jì),確保數(shù)據(jù)的可靠性和長(zhǎng)期存儲(chǔ)需求。
系統(tǒng)的本地顯示部分通過(guò)10寸LCD屏幕實(shí)時(shí)展示館內(nèi)的環(huán)境數(shù)據(jù),方便館內(nèi)工作人員直觀查看當(dāng)前的環(huán)境狀況,并及時(shí)發(fā)現(xiàn)異常情況。可視化大屏通過(guò)Qt在Windows平臺(tái)開(kāi)發(fā),能夠顯示包括環(huán)境參數(shù)、警報(bào)信息以及實(shí)時(shí)視頻監(jiān)控畫面等內(nèi)容。通過(guò)這種方式,工作人員不僅可以在現(xiàn)場(chǎng)通過(guò)LCD顯示屏進(jìn)行操作,還可以在遠(yuǎn)程的辦公室內(nèi)通過(guò)大屏監(jiān)控整個(gè)館內(nèi)的運(yùn)行狀況。
在安全監(jiān)控方面,設(shè)計(jì)了支持RTMP協(xié)議的監(jiān)控?cái)z像頭,能夠?qū)?shí)時(shí)視頻流推送至NGINX服務(wù)器,再通過(guò)華為云ECS服務(wù)器進(jìn)行存儲(chǔ)和管理。通過(guò)RTMP推流技術(shù),系統(tǒng)能夠?qū)崟r(shí)展示陳列館內(nèi)的監(jiān)控畫面,幫助工作人員隨時(shí)了解館內(nèi)動(dòng)態(tài)。此外,結(jié)合深度學(xué)習(xí)算法,系統(tǒng)可以對(duì)視頻數(shù)據(jù)進(jìn)行人體識(shí)別,統(tǒng)計(jì)館內(nèi)人流量,并將統(tǒng)計(jì)結(jié)果呈現(xiàn)在可視化大屏上。這一設(shè)計(jì)不僅能實(shí)現(xiàn)對(duì)文物的安全監(jiān)控,還能幫助工作人員優(yōu)化館內(nèi)的人員流動(dòng)管理。
為了確保系統(tǒng)的穩(wěn)定性,所有硬件模塊如傳感器、顯示屏和監(jiān)控設(shè)備都通過(guò)220V市電進(jìn)行供電,同時(shí)考慮到電力供應(yīng)的可靠性,電源管理模塊采用了穩(wěn)定的供電設(shè)計(jì)。設(shè)備運(yùn)行時(shí),主控芯片與傳感器之間的通信通過(guò)穩(wěn)定的接口和協(xié)議進(jìn)行,保證了數(shù)據(jù)采集的準(zhǔn)確性和實(shí)時(shí)性。
本項(xiàng)目的設(shè)計(jì)思路是通過(guò)物聯(lián)網(wǎng)技術(shù)結(jié)合環(huán)境監(jiān)測(cè)、視頻監(jiān)控、數(shù)據(jù)云存儲(chǔ)和智能化管理,實(shí)現(xiàn)陳列館環(huán)境的全方位監(jiān)控與管理,提升文物保護(hù)效果和館內(nèi)運(yùn)營(yíng)效率,同時(shí)確保館內(nèi)的安全與緊急事件的快速響應(yīng)。
1.5 系統(tǒng)功能總結(jié)
功能模塊 | 功能描述 |
---|---|
溫濕度檢測(cè) | 實(shí)時(shí)監(jiān)測(cè)陳列館內(nèi)的環(huán)境溫度和濕度,確保文物保存的適宜條件。 |
光照強(qiáng)度檢測(cè) | 實(shí)時(shí)檢測(cè)陳列館內(nèi)的光照強(qiáng)度,防止強(qiáng)光對(duì)文物造成損害。 |
煙霧與火焰檢測(cè) | 通過(guò)煙霧傳感器(MQ2)和火焰?zhèn)鞲衅鳈z測(cè)火災(zāi)隱患,一旦發(fā)現(xiàn)異常即觸發(fā)報(bào)警,保障文物與館內(nèi)安全。 |
本地?cái)?shù)據(jù)顯示 | 通過(guò)LCD顯示屏實(shí)時(shí)顯示溫濕度、光照強(qiáng)度等環(huán)境參數(shù),方便館內(nèi)工作人員查看當(dāng)前環(huán)境狀態(tài)。 |
數(shù)據(jù)上傳與云端存儲(chǔ) | 使用WIFI模塊(ESP8266)和MQTT協(xié)議,將環(huán)境數(shù)據(jù)上傳至華為云IoT平臺(tái)進(jìn)行存儲(chǔ),便于數(shù)據(jù)管理與分析。 |
可視化大屏顯示 | 在辦公室內(nèi)通過(guò)Qt開(kāi)發(fā)的可視化大屏展示環(huán)境參數(shù)、實(shí)時(shí)監(jiān)控畫面及預(yù)警信息,幫助工作人員遠(yuǎn)程監(jiān)控管理。 |
環(huán)境參數(shù)預(yù)警 | 設(shè)定閾值,當(dāng)溫濕度或光照強(qiáng)度超過(guò)/低于設(shè)定范圍時(shí),系統(tǒng)將在可視化大屏上進(jìn)行警示,提醒工作人員采取措施。 |
視頻監(jiān)控與實(shí)時(shí)推流 | 使用支持RTMP協(xié)議的監(jiān)控?cái)z像頭,通過(guò)NGINX服務(wù)器將視頻流推送至云端,并在可視化大屏上實(shí)時(shí)顯示監(jiān)控畫面。 |
人流量監(jiān)控與統(tǒng)計(jì) | 基于深度學(xué)習(xí)算法對(duì)視頻進(jìn)行人體識(shí)別,實(shí)時(shí)統(tǒng)計(jì)館內(nèi)人流量,并在可視化大屏上顯示當(dāng)前人流量和每日統(tǒng)計(jì)數(shù)據(jù)。 |
火災(zāi)警報(bào)與應(yīng)急響應(yīng) | 監(jiān)測(cè)到火災(zāi)時(shí)自動(dòng)觸發(fā)警報(bào)并向云端上傳報(bào)警信息,提醒工作人員采取緊急措施,避免災(zāi)難發(fā)生。 |
穩(wěn)定供電支持 | 系統(tǒng)通過(guò)220V市電供電,保證設(shè)備穩(wěn)定運(yùn)行,確保長(zhǎng)時(shí)間的監(jiān)控需求。 |
1.6 開(kāi)發(fā)工具的選擇
【1】設(shè)備端開(kāi)發(fā)
STM32的編程語(yǔ)言選擇C語(yǔ)言,C語(yǔ)言執(zhí)行效率高,大學(xué)里主學(xué)的C語(yǔ)言,C語(yǔ)言編譯出來(lái)的可執(zhí)行文件最接近于機(jī)器碼,匯編語(yǔ)言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機(jī)使用的較多,平常的單片機(jī)編程還是以C語(yǔ)言為主。C語(yǔ)言的執(zhí)行效率僅次于匯編,語(yǔ)法理解簡(jiǎn)單、代碼通用性強(qiáng),也支持跨平臺(tái),在嵌入式底層、單片機(jī)編程里用的非常多,當(dāng)前的設(shè)計(jì)就是采用C語(yǔ)言開(kāi)發(fā)。
開(kāi)發(fā)工具選擇Keil,keil是一家世界領(lǐng)先的嵌入式微控制器軟件開(kāi)發(fā)商,在2015年,keil被ARM公司收購(gòu)。因?yàn)楫?dāng)前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來(lái)開(kāi)發(fā)STM32是有先天優(yōu)勢(shì)的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來(lái)教學(xué),開(kāi)發(fā)51單片機(jī)、STM32單片機(jī)等等。目前作為MCU芯片開(kāi)發(fā)的軟件也不只是keil一家獨(dú)大,IAR在MCU微處理器開(kāi)發(fā)領(lǐng)域里也使用的非常多,IAR擴(kuò)展性更強(qiáng),也支持STM32開(kāi)發(fā),也支持其他芯片,比如:CC2530,51單片機(jī)的開(kāi)發(fā)。從軟件的使用上來(lái)講,IAR比keil更加簡(jiǎn)潔,功能相對(duì)少一些。如果之前使用過(guò)keil,而且使用頻率較多,已經(jīng)習(xí)慣再使用IAR是有點(diǎn)不適應(yīng)界面的。
【2】上位機(jī)開(kāi)發(fā)
上位機(jī)的開(kāi)發(fā)選擇Qt框架,編程語(yǔ)言采用C++;Qt是一個(gè)1991年由Qt Company開(kāi)發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架。它既可以開(kāi)發(fā)GUI程序,也可用于開(kāi)發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣埽褂锰厥獾拇a生成擴(kuò)展(稱為元對(duì)象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴(kuò)展,并且允許真正地組件編程。Qt能輕松創(chuàng)建具有原生C++性能的連接設(shè)備、用戶界面(UI)和應(yīng)用程序。它功能強(qiáng)大且結(jié)構(gòu)緊湊,擁有直觀的工具和庫(kù)。
1.8 模塊的技術(shù)詳情介紹
【1】ESP8266模塊
ESP8266是一款低功耗、低成本的WiFi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)項(xiàng)目中。它集成了WiFi無(wú)線通信功能,可以實(shí)現(xiàn)設(shè)備與互聯(lián)網(wǎng)的無(wú)線連接,具有非常高的性價(jià)比。ESP8266模塊的設(shè)計(jì)旨在簡(jiǎn)化無(wú)線網(wǎng)絡(luò)的配置和連接過(guò)程,特別適合嵌入式系統(tǒng)和智能硬件應(yīng)用。
ESP8266模塊基于Tensilica Xtensa架構(gòu)的32位微處理器,并集成了WiFi協(xié)議棧、網(wǎng)絡(luò)功能以及各種控制和通信接口,能夠支持WiFi標(biāo)準(zhǔn)的IEEE 802.11 b/g/n協(xié)議。它內(nèi)置有處理器、存儲(chǔ)器、WiFi射頻模塊以及網(wǎng)絡(luò)協(xié)議棧,支持通過(guò)AT命令或通過(guò)編程來(lái)控制和操作。用戶可以通過(guò)編程將其嵌入到各種應(yīng)用中,作為通信橋梁在微控制器和互聯(lián)網(wǎng)之間進(jìn)行數(shù)據(jù)傳輸。
該模塊通常包括多個(gè)版本,常見(jiàn)的有ESP-01、ESP-12E等,它們的差異主要體現(xiàn)在引腳數(shù)目、外部存儲(chǔ)、天線設(shè)計(jì)等方面。ESP8266具有較強(qiáng)的處理能力,能夠支持復(fù)雜的通信協(xié)議,并能夠獨(dú)立執(zhí)行部分任務(wù),無(wú)需外部微處理器的支持。它的主要功能是將嵌入式設(shè)備連接到WiFi網(wǎng)絡(luò),通過(guò)HTTP、MQTT、WebSocket等協(xié)議與云端進(jìn)行數(shù)據(jù)交互和控制。
在實(shí)際應(yīng)用中,ESP8266模塊通過(guò)串口(UART)與其他硬件設(shè)備進(jìn)行通信,且其支持AT命令集,通過(guò)這些命令可以配置WiFi參數(shù)、控制網(wǎng)絡(luò)連接、發(fā)送和接收數(shù)據(jù)。對(duì)于開(kāi)發(fā)者來(lái)說(shuō),它的開(kāi)發(fā)環(huán)境支持Arduino IDE、NodeMCU、PlatformIO等,極大地簡(jiǎn)化了開(kāi)發(fā)流程。使用這些開(kāi)發(fā)環(huán)境,開(kāi)發(fā)者可以通過(guò)編程實(shí)現(xiàn)更復(fù)雜的功能,如數(shù)據(jù)采集、遠(yuǎn)程控制、智能家居應(yīng)用等。
ESP8266的低功耗特點(diǎn)使得它特別適合于物聯(lián)網(wǎng)設(shè)備的應(yīng)用。模塊的工作電壓范圍為3.3V,雖然其本身的功耗較低,但在深度休眠模式下,功耗可以進(jìn)一步降低到微安級(jí)別,從而延長(zhǎng)電池壽命。這使得ESP8266在需要長(zhǎng)期運(yùn)行的無(wú)線傳感器網(wǎng)絡(luò)和便攜式設(shè)備中具有廣泛的應(yīng)用。
在物聯(lián)網(wǎng)應(yīng)用中,ESP8266常常用于實(shí)現(xiàn)設(shè)備與互聯(lián)網(wǎng)的互聯(lián)互通,能夠通過(guò)WiFi協(xié)議將數(shù)據(jù)上傳到云平臺(tái),如華為云、AWS、ThingSpeak等,實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、遠(yuǎn)程監(jiān)控、控制和分析。在智能家居、智能農(nóng)業(yè)、環(huán)境監(jiān)控等領(lǐng)域,ESP8266作為通信模塊發(fā)揮著至關(guān)重要的作用。
ESP8266憑借其低成本、高集成度、強(qiáng)大的WiFi連接功能以及良好的開(kāi)發(fā)支持,成為了物聯(lián)網(wǎng)領(lǐng)域中最受歡迎的無(wú)線通信模塊之一,尤其適用于需要無(wú)線連接的嵌入式設(shè)備和智能硬件項(xiàng)目。
【2】MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測(cè)傳輸協(xié)議)是一種輕量級(jí)、發(fā)布/訂閱模式的消息傳輸協(xié)議,專為低帶寬、不可靠網(wǎng)絡(luò)環(huán)境設(shè)計(jì)。它最早由IBM提出,現(xiàn)已成為物聯(lián)網(wǎng)(IoT)通信的重要協(xié)議之一。由于其高效、低功耗和實(shí)時(shí)性等特點(diǎn),MQTT在智能家居、工業(yè)自動(dòng)化、遠(yuǎn)程監(jiān)控和車聯(lián)網(wǎng)等領(lǐng)域得到了廣泛應(yīng)用。
MQTT的工作原理基于發(fā)布/訂閱模型。這種模型有別于傳統(tǒng)的客戶端-服務(wù)器模型,通信方不需要直接建立連接。MQTT由三個(gè)核心組件構(gòu)成:客戶端、代理(Broker)和主題(Topic)。客戶端可以作為消息的發(fā)布者或訂閱者,消息通過(guò)代理進(jìn)行路由。代理是一個(gè)中間服務(wù)端,用于接收和分發(fā)來(lái)自不同客戶端的消息。發(fā)布者發(fā)送消息到一個(gè)特定的主題上,代理負(fù)責(zé)將這些消息分發(fā)給所有訂閱了該主題的客戶端。通過(guò)這種解耦的架構(gòu)設(shè)計(jì),客戶端之間可以實(shí)現(xiàn)松耦合的通信,降低了復(fù)雜性和依賴性。
在MQTT協(xié)議中,消息被分為不同的主題(Topic),例如“home/sensor/temperature”可以用來(lái)代表溫度傳感器數(shù)據(jù)。客戶端可以訂閱這個(gè)主題,當(dāng)發(fā)布者發(fā)送新的數(shù)據(jù)到該主題時(shí),所有訂閱該主題的客戶端都會(huì)收到更新信息。這種靈活的主題結(jié)構(gòu)和層次化的命名規(guī)則,使得MQTT在復(fù)雜場(chǎng)景下也能快速組織和管理消息流。
MQTT協(xié)議支持三種服務(wù)質(zhì)量(QoS)等級(jí),分別為“至多一次”(QoS 0)、“至少一次”(QoS 1)和“僅一次”(QoS 2)。QoS 0表示消息傳輸盡力而為,可能會(huì)丟失或重復(fù);QoS 1確保消息至少送達(dá)一次,但可能會(huì)有重復(fù);QoS 2則確保消息恰好傳輸一次,保證消息的嚴(yán)格可靠性。這種設(shè)計(jì)使MQTT能夠適應(yīng)不同的應(yīng)用場(chǎng)景,用戶可以根據(jù)應(yīng)用需求選擇合適的QoS級(jí)別。
為了保證通信的安全性,MQTT支持用戶名和密碼驗(yàn)證,代理可以對(duì)連接進(jìn)行身份認(rèn)證。此外,許多實(shí)現(xiàn)中還支持TLS/SSL加密通信,確保數(shù)據(jù)在傳輸過(guò)程中不會(huì)被竊取或篡改。用戶也可以使用不同的認(rèn)證方式來(lái)增強(qiáng)系統(tǒng)的安全性,適應(yīng)物聯(lián)網(wǎng)應(yīng)用中對(duì)安全性的高需求。
MQTT非常注重輕量化和低功耗。它的報(bào)文頭非常小,通信開(kāi)銷很低,這使其特別適合在資源受限的設(shè)備或不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中使用。MQTT支持“保持連接”和“遺囑消息”功能,客戶端可以在連接斷開(kāi)時(shí)自動(dòng)向代理發(fā)送遺囑消息,通知其他客戶端連接狀態(tài)的變化。這種特性有助于提高網(wǎng)絡(luò)的健壯性和系統(tǒng)的可用性。
MQTT的典型使用場(chǎng)景包括物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)采集、實(shí)時(shí)監(jiān)控、消息推送和控制命令的發(fā)布。比如在智能家居中,傳感器可以發(fā)布環(huán)境數(shù)據(jù),如溫濕度、煙霧濃度等,控制設(shè)備根據(jù)收到的消息作出響應(yīng),實(shí)現(xiàn)自動(dòng)化操作。在工業(yè)場(chǎng)景中,MQTT可以幫助收集和管理大規(guī)模設(shè)備的運(yùn)行狀態(tài),實(shí)現(xiàn)集中化和高效的設(shè)備監(jiān)控。
MQTT協(xié)議憑借其低功耗、高效能、實(shí)時(shí)性強(qiáng)等優(yōu)勢(shì),已成為物聯(lián)網(wǎng)通信的主要協(xié)議之一。它的發(fā)布/訂閱模式簡(jiǎn)化了設(shè)備之間的通信,使其特別適合多對(duì)多、低延遲、高可靠性的數(shù)據(jù)傳輸場(chǎng)景。MQTT易于使用、拓展性強(qiáng),為開(kāi)發(fā)者提供了靈活的解決方案來(lái)構(gòu)建各種物聯(lián)網(wǎng)應(yīng)用。
二、搭建視頻監(jiān)控流媒體服務(wù)器
2.1 購(gòu)買云服務(wù)器
如果之前沒(méi)有使用過(guò)華為云的ECS服務(wù)器,可以先申請(qǐng)?jiān)囉?個(gè)月,了解服務(wù)器的基本使用然后再購(gòu)買,不得不說(shuō)提供這個(gè)試用服務(wù)還是非常不錯(cuò)。
產(chǎn)品試用領(lǐng)取地址: https://activity.huaweicloud.com/free_test/index.html
每天9:30開(kāi)搶,每天限量100份,這個(gè)頁(yè)面不僅有云服務(wù)器可以領(lǐng)取試用,還有云數(shù)據(jù)庫(kù)、沙盒等其他產(chǎn)品。
我這里領(lǐng)取了 2核4G S6云服務(wù)器
,這個(gè)服務(wù)器是配套華為自研25GE智能高速網(wǎng)卡,適用于網(wǎng)站和Web應(yīng)用等中輕載企業(yè)應(yīng)用。
選擇配置的時(shí)候發(fā)現(xiàn)S6規(guī)格的已經(jīng)沒(méi)有了,來(lái)晚了。
S6規(guī)格沒(méi)有了,就選擇了S3,2核,4GB的配置結(jié)算。
頁(yè)面向下翻,下面選擇系統(tǒng)預(yù)裝的系統(tǒng),我這里選擇ubuntu 20.04,安裝NGINX,來(lái)搭建流媒體服務(wù)器。
頁(yè)面繼續(xù)下翻,設(shè)置云服務(wù)器名稱,設(shè)置系統(tǒng)的root密碼。
接著就可以繼續(xù)去支付了。
購(gòu)買后等待一段時(shí)間,系統(tǒng)資源就即可分配完成。
2.2 登錄云服務(wù)器
云服務(wù)器的管理控制臺(tái)從這里進(jìn)入: https://www.huaweicloud.com/product/ecs.html
在官網(wǎng)主頁(yè),點(diǎn)擊產(chǎn)品,找到計(jì)算選項(xiàng),就可以看到彈性云服務(wù)器ECS,點(diǎn)擊進(jìn)去就可以看到管理控制臺(tái)的選項(xiàng)。
在彈性云服務(wù)器
的選項(xiàng)頁(yè)面可以看到剛才購(gòu)買的云服務(wù)器,如果點(diǎn)擊進(jìn)去提示該區(qū)域沒(méi)有可用的服務(wù)器,說(shuō)明區(qū)域選擇的不對(duì),在下面截圖紅色框框的位置可以看到可用的區(qū)域切換按鈕,切換之后就行了。
點(diǎn)擊服務(wù)器右邊的更多
,可以對(duì)服務(wù)器重裝系統(tǒng)、切換操作系統(tǒng)、關(guān)機(jī)、開(kāi)機(jī)、重啟、重置密碼等操作。
接下來(lái)先點(diǎn)擊登錄,了解一下登錄的流程,看看系統(tǒng)進(jìn)去的效果。
云服務(wù)器支持SSH協(xié)議遠(yuǎn)程登錄,可以在瀏覽器上直接使用CloudShell方式或者VNC方式登錄,如果本身你自己也是使用Linux系統(tǒng),可以在Linux系統(tǒng)里通過(guò)ssh命令直接登錄,如果是在windows下可以使用SecureCRT登錄。
其他登錄方式。
最方便的登錄方式,直接在控制臺(tái)使用VNC在瀏覽器里登錄,點(diǎn)擊立即登錄
。
根據(jù)提示輸入用戶名,密碼后,按下回車鍵即可登錄。
用戶名直接輸入root
,密碼就是剛才配置云服務(wù)器時(shí),填入的root密碼。
注意: Linux下輸入密碼默認(rèn)都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會(huì)有反應(yīng)的,自己按照正確的密碼輸入即可。
用戶名、密碼輸入正確后,登錄成功。
可以點(diǎn)擊全屏模式,更好的操作。
2.3 使用CloudShell登錄云服務(wù)器
在頁(yè)面上直接點(diǎn)擊CloudShell登錄
按鈕。CloudShell方式比VNC方式方便、流暢多了,也支持命令的復(fù)制粘貼。
輸入密碼點(diǎn)擊連接。
登錄成功進(jìn)入終端。
2.4 使用SecureCRT登錄云服務(wù)器
上面演示了兩種登錄方式,都是直接在瀏覽器里登錄,這種兩種方式比較來(lái)看,VNC方式效率最低,CloudShell
相對(duì)來(lái)說(shuō)要方便很多。一般我自己正常開(kāi)發(fā)時(shí),都是使用第三方工具來(lái)登錄的,如果本身自己開(kāi)發(fā)環(huán)境的電腦就是Linux,MAC等,可以直接使用ssh命令登錄,這種方式操作流暢方便。如果在windows下,可以使用第三方軟件登錄。
我現(xiàn)在使用的系統(tǒng)是win10,在windows系統(tǒng)下有很多遠(yuǎn)程終端軟件支持SSH登錄到Linux云服務(wù)器,我當(dāng)前采用的使用SecureCRT 6.5
來(lái)作為登錄終端,登錄云服務(wù)器。
注意: SecureCRT 6.5
登錄高版本Linux系統(tǒng)會(huì)出現(xiàn)Key exchange failed
問(wèn)題,導(dǎo)致登錄失敗,比如: 登錄ubuntu 20.04 系統(tǒng)。 出現(xiàn)這種問(wèn)題需要對(duì)系統(tǒng)ssh配置文件進(jìn)行添加配置。
添加配置的流程:
命令行輸入:
vim /etc/ssh/sshd_config
在文件最后添加:
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1
保存退出。
重啟ssh服務(wù)
service ssh restart
如果不想這么麻煩的去修改配置文件,那么最簡(jiǎn)單的辦法就是: 切換操作系統(tǒng),換一個(gè)低版本的,比如:ubuntu18.04 即可。
在云服務(wù)器的控制臺(tái),找到自己的服務(wù)器,然后選擇切換操作系統(tǒng)。
根據(jù)界面上的引導(dǎo)流程,切換即可。更換新的系統(tǒng)需要1~4分鐘時(shí)間,稍微等待一下即可。
如果要使用遠(yuǎn)程SSH協(xié)議方式登錄云服務(wù)器,需要具備以下幾個(gè)前提條件。
[1]彈性云服務(wù)器狀態(tài)為“運(yùn)行中”。
[2]彈性云服務(wù)器已經(jīng)綁定彈性公網(wǎng)IP,綁定方式請(qǐng)參見(jiàn)綁定彈性公網(wǎng)IP。
[3]所在安全組入方向已開(kāi)放22端口,配置方式請(qǐng)參見(jiàn)配置安全組規(guī)則。
[4]使用的登錄工具(如PuTTY,SecureCRT`)與待登錄的彈性云服務(wù)器之間網(wǎng)絡(luò)連通。例如,默認(rèn)的22端口沒(méi)有被防火墻屏蔽。
但是這些配置不用擔(dān)心,在購(gòu)買服務(wù)器后,根據(jù)引導(dǎo)一套走完,上面的這些配置都已經(jīng)默認(rèn)配置好了,不用自己再去單獨(dú)配置。
系統(tǒng)切換成功后,打開(kāi)SecureCRT 6.5
軟件,進(jìn)行登錄。SecureCRT 6.5
整體而言還是挺好用的。
如果自己沒(méi)有``SecureCRT,自己下載一個(gè)即可。當(dāng)然,不一定非要使用
SecureCRT`,其他還有很多SSH遠(yuǎn)程登錄工具,喜歡哪個(gè)使用哪個(gè)。
下面介紹``SecureCRT `登錄的流程。
選擇新建會(huì)話。
選擇SSH2協(xié)議。
主機(jī)名就填服務(wù)器的公網(wǎng)IP地址,端口號(hào)默認(rèn)是22,用戶名填root。
自己云服務(wù)器的公網(wǎng)IP地址,在控制臺(tái)可以看到。
軟件點(diǎn)擊下一步之后,可以填充描述信息,備注這個(gè)鏈接是干什么的。
選擇剛才新建的協(xié)議端口點(diǎn)擊連接。
云服務(wù)器連接上之后,軟件界面會(huì)彈出對(duì)話框填充用戶名、密碼。
登錄成功的效果如下。
軟件可以配置一些選項(xiàng),讓界面符合Linux終端配色,可以修改字體大小、字體編碼等等。
配置后的效果。
2.5 安裝NFS服務(wù)器
為了方便向服務(wù)器上拷貝文件,可以采用NFS服務(wù)器、或者FTP服務(wù)器 這些方式。 我本地有一臺(tái)ubuntu 18.04 系統(tǒng)筆記本,我這里采用NFS方式拷貝文件上去。
(1)安裝NFS服務(wù)器
root@ecs-348470:~# sudo apt-get install nfs-kernel-server
(2)創(chuàng)建一個(gè)work目錄方便當(dāng)做共享目錄使用
root@ecs-348470:~# mkdir work
(3)編寫NFS配置文件
NFS 服務(wù)的配置文件為/etc/exports,如果系統(tǒng)沒(méi)有默認(rèn)值,這個(gè)文件就不一定會(huì)存在,可以使用 vim 手動(dòng)建立,然后在文件里面寫入配置內(nèi)容。
/home/work *(rw,no_root_squash,sync,no_subtree_check,insecure)
配置文件里參數(shù)的含義:
(4)NFS服務(wù)器相關(guān)指令
/etc/init.d/nfs-kernel-server start #啟動(dòng) NFS 服務(wù)
ufw disable #關(guān)閉防火墻
/etc/init.d/nfs-kernel-server restart #重啟NFS服務(wù)
exportfs -arv #共享路徑生效
(5)本地客戶機(jī)掛載服務(wù)器的目錄
wbyq@wbyq:~$ sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
(6)設(shè)置華為云服務(wù)器的安全策略
需要把華為云服務(wù)器的端口號(hào)開(kāi)放出來(lái),不然其他客戶端是無(wú)法訪問(wèn)服務(wù)器的。
我這里比較粗暴直接,直接將所有端口號(hào),所有IP地址都開(kāi)放出來(lái)了。
**(7)本地客戶機(jī)掛載服務(wù)器測(cè)試 **
掛載指令:
sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
2.6 安裝NGINX(配置RTMP服務(wù))
(1)下載編譯時(shí)需要依賴的一些工具
root@ecs-348470:~# sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev
(2)下載NGINX編譯需要的軟件包
root@ecs-348470:~# mkdir nginx
root@ecs-348470:~# cd nginx/
root@ecs-348470:~# wget http://nginx.org/download/nginx-1.10.3.tar.gz
root@ecs-348470:~# wget http://zlib.net/zlib-1.2.11.tar.gz
root@ecs-348470:~# wget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz
root@ecs-348470:~# wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
root@ecs-348470:~# wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
(3)下載后的文件全部解壓
root@ecs-348470:~# tar xvf openssl-1.0.2k.tar.gz
root@ecs-348470:~# tar xvf nginx-rtmp-module-master.tar.gz
root@ecs-348470:~# tar xvf nginx-1.8.1.tar.gz
root@ecs-348470:~# tar xvf pcre-8.40.tar.gz
root@ecs-348470:~# tar xvf zlib-1.2.11.tar.gz
(4)配置NGINX源碼,生成Makefile文件
root@ecs-348470:~# cd nginx-1.8.1/
root@ecs-348470:~# ./configure --prefix=/usr/local/nginx --with-debug --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2k --add-module=../nginx-rtmp-module-master
執(zhí)行完上一步之后,打開(kāi)objs/Makefile文件,找到-Werror選項(xiàng)并刪除。
(5)編譯并安裝NGINX
root@ecs-348470:~/nginx/nginx-1.8.1# make && make install
安裝之后NGINX的配置文件存放路徑:
/usr/local/nginx/nginx:主程序
(6)查看NGINX的版本號(hào)
root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.8.1
(5)在配置文件里加入RTMP服務(wù)器的配置
root@ecs-348470:~# vim /usr/local/nginx/conf/nginx.conf
打開(kāi)文件后,在文件最后加入以下配置:
rtmp {
server {
listen 8888;
application live {
live on;
record all;
record_unique on;
record_path "./video"; #視頻緩存的路徑
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}
這樣配置之后,服務(wù)器收到RTMP流會(huì)在NGINX的當(dāng)前目錄下,創(chuàng)建一個(gè)video目錄用來(lái)緩存視頻。
客戶端向服務(wù)器推流之后,服務(wù)器就會(huì)緩存視頻到設(shè)置的目錄。
(5)檢查配置文件是否正確
root@ecs-348470:/usr/local/nginx/sbin# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
(6)NGINX常用的3個(gè)命令
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
(7)啟動(dòng)NGINX服務(wù)器
sudo service nginx start
2.7 攝像頭推流音視頻到服務(wù)器
為了模擬攝像頭實(shí)時(shí)監(jiān)控推流,我這使用QT+FFMPEG編寫了一個(gè)小軟件,在windows下運(yùn)行,推流本地筆記本電腦的數(shù)據(jù)到服務(wù)器。軟件運(yùn)行之后,將本地音頻、視頻編碼之后通過(guò)RTMP協(xié)議推流到NGINX服務(wù)器。
軟件可以去網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件運(yùn)行效果:
推流工具運(yùn)行過(guò)程中效果。
2.8 編寫本地RTMP流播放器
在上面通過(guò)推流客戶端模擬攝像頭,已經(jīng)將本地的攝像頭數(shù)據(jù)實(shí)時(shí)推流到服務(wù)器了,那么還差一個(gè)播放器,為了方便能夠在任何有網(wǎng)的地方實(shí)時(shí)查看攝像頭的音頻和圖像,還需要編寫一個(gè)RTMP流媒體播放器。
我這里的播放器內(nèi)核是采用libvlc開(kāi)發(fā)的,使用QT作為GUI框架,開(kāi)發(fā)了一個(gè)流媒體播放器,可以實(shí)時(shí)拉取服務(wù)器上的流數(shù)據(jù),并且還支持回放。因?yàn)榉?wù)器上的NGINX配置了自動(dòng)保存的參數(shù),可以將推上去的流按時(shí)間段保存下來(lái)。
軟件可以去網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
輸入服務(wù)器地址之后就可以拉取流進(jìn)行播放。
點(diǎn)擊獲取回放列表,可以查看服務(wù)器上保存的歷史視頻回放播放。
2.9 配置監(jiān)控?cái)z像頭
第一次使用攝像頭,先使用網(wǎng)線將攝像頭連接到家里路由器上,然后登錄攝像頭管理頁(yè)面配置攝像頭。
在攝像頭上面有一個(gè)碼,掃描之后就能看到使用辦法。里面有一個(gè)軟件下載下來(lái),可以搜索攝像頭IP。
詳細(xì)過(guò)程看這里:https://www.showdoc.com.cn/sqIPC/7929920934644196
設(shè)置攝像頭動(dòng)態(tài)獲取IP(非常重要)
攝像頭用戶名是admin 密碼是12345
登錄成功。
設(shè)置參數(shù):
設(shè)置攝像頭連接的WIFI:
**推流地址:**rtmp://111.160.79.93/live/video158
設(shè)置WIFI聯(lián)網(wǎng)之后,攝像頭就會(huì)自動(dòng)去連接指定的WIFI,完成推流。
三、部署華為云物聯(lián)網(wǎng)平臺(tái)
華為云官網(wǎng): https://www.huaweicloud.com/
打開(kāi)官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設(shè)備接入IoTDA
。
3.1 物聯(lián)網(wǎng)平臺(tái)介紹
華為云物聯(lián)網(wǎng)平臺(tái)(IoT 設(shè)備接入云服務(wù))提供海量設(shè)備的接入和管理能力,將物理設(shè)備聯(lián)接到云,支撐設(shè)備數(shù)據(jù)采集上云和云端下發(fā)命令給設(shè)備進(jìn)行遠(yuǎn)程控制,配合華為云其他產(chǎn)品,幫助我們快速構(gòu)筑物聯(lián)網(wǎng)解決方案。
使用物聯(lián)網(wǎng)平臺(tái)構(gòu)建一個(gè)完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺(tái)、業(yè)務(wù)應(yīng)用和設(shè)備。
物聯(lián)網(wǎng)平臺(tái)作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層,屏蔽了各種復(fù)雜的設(shè)備接口,實(shí)現(xiàn)設(shè)備的快速接入;同時(shí)提供強(qiáng)大的開(kāi)放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。
設(shè)備可以通過(guò)固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺(tái),并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報(bào)到平臺(tái),平臺(tái)也可以將控制命令下發(fā)給設(shè)備。
業(yè)務(wù)應(yīng)用通過(guò)調(diào)用物聯(lián)網(wǎng)平臺(tái)提供的API,實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場(chǎng)景。
3.2 開(kāi)通物聯(lián)網(wǎng)服務(wù)
地址: https://www.huaweicloud.com/product/iothub.html
開(kāi)通免費(fèi)單元。
點(diǎn)擊立即創(chuàng)建
。
正在創(chuàng)建標(biāo)準(zhǔn)版實(shí)例,需要等待片刻。
創(chuàng)建完成之后,點(diǎn)擊詳情。 可以看到標(biāo)準(zhǔn)版實(shí)例的設(shè)備接入端口和地址。
下面框起來(lái)的就是端口號(hào)
和域名
點(diǎn)擊實(shí)例名稱,可以查看當(dāng)前免費(fèi)單元
的配置情況。
開(kāi)通之后,點(diǎn)擊接入信息
,也能查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺(tái),這里可以看到MQTT協(xié)議的地址和端口號(hào)等信息。
總結(jié):
端口號(hào): MQTT (1883)| MQTTS (8883)
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
根據(jù)域名地址得到IP地址信息:
打開(kāi)Windows電腦的命令行控制臺(tái)終端,使用ping
命令。ping
一下即可。
Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有權(quán)利。
C:UsersLenovo >ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字節(jié)的數(shù)據(jù):
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來(lái)自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
117.78.5.125 的 Ping 統(tǒng)計(jì)信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
最短 = 37ms,最長(zhǎng) = 37ms,平均 = 37ms
C:UsersLenovo >
MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書加密端口,單片機(jī)無(wú)法加載證書,所以使用1883端口合適
。
3.3 創(chuàng)建產(chǎn)品
鏈接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af
(1)創(chuàng)建產(chǎn)品
(2)填寫產(chǎn)品信息
根據(jù)自己產(chǎn)品名字填寫,下面的設(shè)備類型選擇自定義類型。
(3)產(chǎn)品創(chuàng)建成功
創(chuàng)建完成之后點(diǎn)擊查看詳情。
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點(diǎn)擊進(jìn)入產(chǎn)品詳情頁(yè)面,翻到最下面可以看到模型定義。
模型簡(jiǎn)單來(lái)說(shuō): 就是存放設(shè)備上傳到云平臺(tái)的數(shù)據(jù)。
你可以根據(jù)自己的產(chǎn)品進(jìn)行創(chuàng)建。
比如:
煙霧可以叫 MQ2
溫度可以叫 Temperature
濕度可以叫 humidity
火焰可以叫 flame
其他的傳感器自己用單詞簡(jiǎn)寫命名即可。 這就是你的單片機(jī)設(shè)備端上傳到服務(wù)器的數(shù)據(jù)名字。
先點(diǎn)擊自定義模型。
再創(chuàng)建一個(gè)服務(wù)ID。
接著點(diǎn)擊新增屬性。
3.4 添加設(shè)備
產(chǎn)品是屬于上層的抽象模型,接下來(lái)在產(chǎn)品模型下添加實(shí)際的設(shè)備。添加的設(shè)備最終需要與真實(shí)的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊(cè)設(shè)備
(2)根據(jù)自己的設(shè)備填寫
(3)保存設(shè)備信息
創(chuàng)建完畢之后,點(diǎn)擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時(shí)候需要使用。
(4)設(shè)備創(chuàng)建完成
(5)設(shè)備詳情
3.5 MQTT協(xié)議主題訂閱與發(fā)布
(1)MQTT協(xié)議介紹
當(dāng)前的設(shè)備是采用MQTT協(xié)議與華為云平臺(tái)進(jìn)行通信。
MQTT是一個(gè)物聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計(jì)用于輕量級(jí)的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的物聯(lián)網(wǎng)設(shè)備提供可靠的網(wǎng)絡(luò)服務(wù)。MQTT是專門針對(duì)物聯(lián)網(wǎng)開(kāi)發(fā)的輕量級(jí)傳輸協(xié)議。MQTT協(xié)議針對(duì)低帶寬網(wǎng)絡(luò),低計(jì)算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場(chǎng)景。目前MQTT擁有各種平臺(tái)和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。
MQTT是一種消息隊(duì)列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合,相對(duì)于其他協(xié)議,開(kāi)發(fā)更簡(jiǎn)單;MQTT協(xié)議是工作在TCP/IP協(xié)議上;由TCP/IP協(xié)議提供穩(wěn)定的網(wǎng)絡(luò)連接;所以,只要具備TCP協(xié)議棧的網(wǎng)絡(luò)設(shè)備都可以使用MQTT協(xié)議。 本次設(shè)備采用的ESP8266就具備TCP協(xié)議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協(xié)議,就可以與華為云平臺(tái)完成通信。
華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業(yè)務(wù)流程:
(2)華為云平臺(tái)MQTT協(xié)議使用限制
描述 | 限制 |
---|---|
支持的MQTT協(xié)議版本 | 3.1.1 |
與標(biāo)準(zhǔn)MQTT協(xié)議的區(qū)別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級(jí) | 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本) |
單帳號(hào)每秒最大MQTT連接請(qǐng)求數(shù) | 無(wú)限制 |
單個(gè)設(shè)備每分鐘支持的最大MQTT連接數(shù) | 1 |
單個(gè)MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) | 3KB/s |
MQTT單個(gè)發(fā)布消息最大長(zhǎng)度,超過(guò)此大小的發(fā)布請(qǐng)求將被直接拒絕 | 1MB |
MQTT連接心跳時(shí)間建議值 | 心跳時(shí)間限定為30至1200秒,推薦設(shè)置為120秒 |
產(chǎn)品是否支持自定義Topic | 支持 |
消息發(fā)布與訂閱 | 設(shè)備只能對(duì)自己的Topic進(jìn)行消息發(fā)布與訂閱 |
每個(gè)訂閱請(qǐng)求的最大訂閱數(shù) | 無(wú)限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對(duì)于設(shè)備而言,一般會(huì)訂閱平臺(tái)下發(fā)消息給設(shè)備 這個(gè)主題。
設(shè)備想接收平臺(tái)下發(fā)的消息,就需要訂閱平臺(tái)下發(fā)消息給設(shè)備 的主題,訂閱后,平臺(tái)下發(fā)消息給設(shè)備,設(shè)備就會(huì)收到消息。
如果設(shè)備想要知道平臺(tái)下發(fā)的消息,需要訂閱上面圖片里標(biāo)注的主題。
以當(dāng)前設(shè)備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發(fā)布格式
對(duì)于設(shè)備來(lái)說(shuō),主題發(fā)布表示向云平臺(tái)上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設(shè)備狀態(tài)上傳到云平臺(tái)。
這個(gè)操作稱為:屬性上報(bào)。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據(jù)幫助文檔的介紹, 當(dāng)前設(shè)備發(fā)布主題,上報(bào)屬性的格式總結(jié)如下:
發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時(shí),需要上傳數(shù)據(jù),這個(gè)數(shù)據(jù)格式是JSON格式。
上傳的JSON數(shù)據(jù)格式如下:
{
"services": [
{
"service_id": < 填服務(wù)ID >,
"properties": {
"< 填屬性名稱1 >": < 填屬性值 >,
"< 填屬性名稱2 >": < 填屬性值 >,
..........
}
}
]
}
根據(jù)JSON格式,一次可以上傳多個(gè)屬性字段。 這個(gè)JSON格式里的,服務(wù)ID,屬性字段名稱,屬性值類型,在前面創(chuàng)建產(chǎn)品的時(shí)候就已經(jīng)介紹了,不記得可以翻到前面去查看。
根據(jù)這個(gè)格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
3.6 MQTT三元組
MQTT協(xié)議登錄需要填用戶ID,設(shè)備ID,設(shè)備密碼等信息,就像我們平時(shí)登錄QQ,微信一樣要輸入賬號(hào)密碼才能登錄。MQTT協(xié)議登錄的這3個(gè)參數(shù),一般稱為MQTT三元組。
接下來(lái)介紹,華為云平臺(tái)的MQTT三元組參數(shù)如何得到。
(1)MQTT服務(wù)器地址
要登錄MQTT服務(wù)器,首先記得先知道服務(wù)器的地址是多少,端口是多少。
幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機(jī)上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進(jìn)連接的。
根據(jù)上面的域名和端口號(hào),得到下面的IP地址和端口號(hào)信息: 如果設(shè)備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)
華為云的MQTT服務(wù)器地址:117.78.5.125
華為云的MQTT端口號(hào):1883
如何得到IP地址?如何域名轉(zhuǎn)IP? 打開(kāi)Windows的命令行輸入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元組
華為云提供了一個(gè)在線工具,用來(lái)生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開(kāi)這個(gè)工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點(diǎn)擊生成,就可以得到MQTT的登錄信息了。
下面是打開(kāi)的頁(yè)面:
填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設(shè)備端通過(guò)MQTT協(xié)議登錄鑒權(quán)的時(shí)候,填入?yún)?shù)即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
3.7 模擬設(shè)備登錄測(cè)試
經(jīng)過(guò)上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設(shè)備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來(lái)就用MQTT客戶端軟件模擬真實(shí)的設(shè)備來(lái)登錄平臺(tái)。測(cè)試與服務(wù)器通信是否正常。
MQTT軟件下載地址【免費(fèi)】: https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登錄信息
打開(kāi)MQTT客戶端軟件,對(duì)號(hào)填入相關(guān)信息(就是上面的文本介紹)。然后,點(diǎn)擊登錄,訂閱主題,發(fā)布主題。
(2)打開(kāi)網(wǎng)頁(yè)查看
完成上面的操作之后,打開(kāi)華為云網(wǎng)頁(yè)后臺(tái),可以看到設(shè)備已經(jīng)在線了。
點(diǎn)擊詳情頁(yè)面,可以看到上傳的數(shù)據(jù):
到此,云平臺(tái)的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。
(3)MQTT登錄測(cè)試參數(shù)總結(jié)
MQTT服務(wù)器: 117.78.5.125
MQTT端口號(hào): 183
//物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"
//訂閱與發(fā)布的主題
#define SET_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down" //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report" //發(fā)布
發(fā)布的數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
3.8 創(chuàng)建IAM賬戶
創(chuàng)建一個(gè)IAM賬戶,因?yàn)榻酉聛?lái)開(kāi)發(fā)上位機(jī),需要使用云平臺(tái)的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡(jiǎn)單來(lái)說(shuō),就是身份的認(rèn)證。 調(diào)用接口獲取Token時(shí),就需要填寫IAM賬號(hào)信息。所以,接下來(lái)演示一下過(guò)程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項(xiàng)目憑證 ** 點(diǎn)擊左上角用戶名,選擇下拉菜單里的我的憑證
項(xiàng)目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證
。
點(diǎn)擊左上角創(chuàng)建用戶
。
創(chuàng)建成功:
【3】創(chuàng)建完成
用戶信息如下:
主用戶名 l19504562721
IAM用戶 ds_abc
密碼 DS12345678
3.9 獲取影子數(shù)據(jù)
幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
設(shè)備影子介紹:
設(shè)備影子是一個(gè)用于存儲(chǔ)和檢索設(shè)備當(dāng)前狀態(tài)信息的JSON文檔。
每個(gè)設(shè)備有且只有一個(gè)設(shè)備影子,由設(shè)備ID唯一標(biāo)識(shí)
設(shè)備影子僅保存最近一次設(shè)備的上報(bào)數(shù)據(jù)和預(yù)期數(shù)據(jù)
無(wú)論該設(shè)備是否在線,都可以通過(guò)該影子獲取和設(shè)置設(shè)備的屬性
簡(jiǎn)單來(lái)說(shuō):設(shè)備影子就是保存,設(shè)備最新上傳的一次數(shù)據(jù)。
我們?cè)O(shè)計(jì)的軟件里,如果想要獲取設(shè)備的最新?tīng)顟B(tài)信息,就采用設(shè)備影子接口。
如果對(duì)接口不熟悉,可以先進(jìn)行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調(diào)試接口,可以請(qǐng)求影子接口,了解請(qǐng)求,與返回的數(shù)據(jù)格式。
調(diào)試完成看右下角的響應(yīng)體,就是返回的影子數(shù)據(jù)。
設(shè)備影子接口返回的數(shù)據(jù)如下:
{
"device_id": "663cb18871d845632a0912e7_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"DHT11_T": 18,
"DHT11_H": 90,
"BH1750": 38,
"MQ135": 70
},
"event_time": "20240509T113448Z"
},
"version": 3
}
]
}
調(diào)試成功之后,可以得到訪問(wèn)影子數(shù)據(jù)的真實(shí)鏈接,接下來(lái)的代碼開(kāi)發(fā)中,就采用Qt寫代碼訪問(wèn)此鏈接,獲取影子數(shù)據(jù),完成上位機(jī)開(kāi)發(fā)。
鏈接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
3.10 訪問(wèn)接口的代碼實(shí)現(xiàn)
(1)配置 Qt 項(xiàng)目
在 Qt 項(xiàng)目的 .pro
文件中,加入對(duì) libcurl
的支持:
QT += core
CONFIG += console
CONFIG -= app_bundle
INCLUDEPATH += /usr/include/curl # 根據(jù)你的系統(tǒng)設(shè)置 libcurl 的路徑
LIBS += -lcurl # 鏈接 libcurl 庫(kù)
SOURCES += main.cpp
(2)代碼實(shí)現(xiàn)
main.cpp
文件中實(shí)現(xiàn)代碼如下:
#include < QCoreApplication >
#include < curl/curl.h >
#include < QDebug >
#include < QString >
#include < QByteArray >
// 回調(diào)函數(shù),處理libcurl下載數(shù)據(jù)
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t totalSize = size * nmemb;
QByteArray *response = static_cast< QByteArray * >(userp);
response- >append(static_cast< char * >(contents), totalSize);
return totalSize;
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 初始化libcurl
CURL *curl;
CURLcode res;
QByteArray responseData; // 用于存儲(chǔ)響應(yīng)數(shù)據(jù)
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
// 設(shè)置訪問(wèn)URL
const QString url = "https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow";
// 設(shè)置HTTP請(qǐng)求頭
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer < Your_Access_Token >"); // 這里需要替換為你的實(shí)際 token
curl_easy_setopt(curl, CURLOPT_URL, url.toStdString().c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &responseData);
// 發(fā)起GET請(qǐng)求
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
qDebug() < < "Curl request failed:" < < curl_easy_strerror(res);
} else {
qDebug() < < "Response data:" < < responseData;
}
// 清理
curl_easy_cleanup(curl);
curl_slist_free_all(headers);
}
curl_global_cleanup();
return a.exec();
}
3.11 數(shù)據(jù)解析代碼
在 Qt 中使用 CJSON (一個(gè)用于解析 JSON 數(shù)據(jù)的輕量級(jí) C 庫(kù)) 來(lái)解析返回的 JSON 數(shù)據(jù)。
(1)配置 Qt 項(xiàng)目
在 Qt 項(xiàng)目的 .pro
文件中,確保包括了 CJSON 的頭文件,并鏈接 CJSON 的源代碼。
QT += core
CONFIG += console
CONFIG -= app_bundle
SOURCES += main.cpp
cJSON.c # 將 cJSON.c 文件添加到你的項(xiàng)目中
INCLUDEPATH += path/to/cjson/ # 添加 CJSON 頭文件的路徑
LIBS += -lcurl # 鏈接 libcurl 庫(kù)
(2)解析 JSON 數(shù)據(jù)的完整代碼
在 main.cpp
中,以下代碼展示了如何解析你提供的 JSON 數(shù)據(jù)。
#include < QCoreApplication >
#include < curl/curl.h >
#include < QDebug >
#include < QString >
#include < QByteArray >
#include "cJSON.h"
// 回調(diào)函數(shù),處理libcurl下載數(shù)據(jù)
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t totalSize = size * nmemb;
QByteArray *response = static_cast< QByteArray * >(userp);
response- >append(static_cast< char * >(contents), totalSize);
return totalSize;
}
// 解析 JSON 數(shù)據(jù)
void parseJson(const QByteArray &data) {
// 將 QByteArray 轉(zhuǎn)換為 char*
const char* jsonData = data.constData();
// 解析 JSON
cJSON *root = cJSON_Parse(jsonData);
if (root == NULL) {
qDebug() < < "Error parsing JSON.";
return;
}
// 解析 "device_id"
cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(root, "device_id");
if (cJSON_IsString(deviceId) && (deviceId- >valuestring != NULL)) {
qDebug() < < "Device ID:" < < deviceId- >valuestring;
}
// 解析 "shadow" 數(shù)組
cJSON *shadow = cJSON_GetObjectItemCaseSensitive(root, "shadow");
if (cJSON_IsArray(shadow)) {
cJSON *shadowItem = NULL;
cJSON_ArrayForEach(shadowItem, shadow) {
// 解析每個(gè) shadow 項(xiàng)目
cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
if (cJSON_IsString(serviceId) && (serviceId- >valuestring != NULL)) {
qDebug() < < "Service ID:" < < serviceId- >valuestring;
}
// 解析 "reported" 對(duì)象
cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
if (cJSON_IsObject(reported)) {
// 解析 "properties" 對(duì)象
cJSON *properties = cJSON_GetObjectItemCaseSensitive(reported, "properties");
if (cJSON_IsObject(properties)) {
cJSON *data1 = cJSON_GetObjectItemCaseSensitive(properties, "data1");
if (cJSON_IsNumber(data1)) {
qDebug() < < "data1:" < < data1- >valueint;
}
cJSON *data2 = cJSON_GetObjectItemCaseSensitive(properties, "data2");
if (cJSON_IsNumber(data2)) {
qDebug() < < "data2:" < < data2- >valueint;
}
cJSON *data3 = cJSON_GetObjectItemCaseSensitive(properties, "data3");
if (cJSON_IsNumber(data3)) {
qDebug() < < "data3:" < < data3- >valueint;
}
cJSON *data4 = cJSON_GetObjectItemCaseSensitive(properties, "data4");
if (cJSON_IsNumber(data4)) {
qDebug() < < "data4:" < < data4- >valueint;
}
}
// 解析 "event_time"
cJSON *eventTime = cJSON_GetObjectItemCaseSensitive(reported, "event_time");
if (cJSON_IsString(eventTime) && (eventTime- >valuestring != NULL)) {
qDebug() < < "Event Time:" < < eventTime- >valuestring;
}
}
// 解析 version
cJSON *version = cJSON_GetObjectItemCaseSensitive(shadowItem, "version");
if (cJSON_IsNumber(version)) {
qDebug() < < "Version:" < < version- >valueint;
}
}
}
// 釋放 JSON 對(duì)象
cJSON_Delete(root);
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
// 模擬獲取到的 JSON 數(shù)據(jù)
QByteArray jsonData = R"(
{
"device_id": "663cb18871d845632a0912e7_dev1",
"shadow": [
{
"service_id": "stm32",
"desired": {
"properties": null,
"event_time": null
},
"reported": {
"properties": {
"data1": 18,
"data2": 90,
"data3": 38,
"data4": 70
},
"event_time": "20240509T113448Z"
},
"version": 3
}
]
})";
// 調(diào)用解析函數(shù)
parseJson(jsonData);
return a.exec();
}
四、STM32設(shè)備端代碼設(shè)計(jì)
模塊代碼可以在網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
STM32(傳感器讀取、數(shù)據(jù)處理、WiFi通信等)代碼已經(jīng)設(shè)計(jì)完成,在main.c
中初始化硬件模塊,處理環(huán)境數(shù)據(jù),并通過(guò)WiFi上傳到云端的框架代碼。
#include "stm32f1xx_hal.h"
#include "sht30.h" // 溫濕度傳感器庫(kù)
#include "bh1750.h" // 光照傳感器庫(kù)
#include "mq2.h" // 煙霧傳感器庫(kù)
#include "wifi_module.h" // WiFi模塊庫(kù) (ESP8266)
#include "lcd_display.h" // LCD顯示屏庫(kù)
#include "mqtt_client.h" // MQTT客戶端庫(kù)
// 定義傳感器和模塊實(shí)例
SHT30_HandleTypeDef hSHT30; // 溫濕度傳感器
BH1750_HandleTypeDef hBH1750; // 光照傳感器
MQ2_HandleTypeDef hMQ2; // 煙霧傳感器
ESP8266_HandleTypeDef hWiFi; // WiFi模塊
MQTT_Client_HandleTypeDef hMQTTClient; // MQTT客戶端
// 環(huán)境參數(shù)
float temperature = 0.0;
float humidity = 0.0;
uint16_t light_intensity = 0;
uint16_t smoke_level = 0;
// 傳感器閾值
#define TEMPERATURE_THRESHOLD_HIGH 30.0f
#define TEMPERATURE_THRESHOLD_LOW 18.0f
#define HUMIDITY_THRESHOLD_HIGH 70.0f
#define HUMIDITY_THRESHOLD_LOW 40.0f
#define LIGHT_INTENSITY_THRESHOLD 300
// 外設(shè)初始化函數(shù)
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
static void MX_I2C1_Init(void);
static void MX_SPI1_Init(void);
static void MX_WIFI_Init(void);
static void MX_LCD_Init(void);
// 讀取傳感器數(shù)據(jù)
void Read_Sensors(void) {
// 獲取溫濕度數(shù)據(jù)
if (SHT30_Read(&hSHT30, &temperature, &humidity) != HAL_OK) {
// 處理錯(cuò)誤
}
// 獲取光照強(qiáng)度數(shù)據(jù)
if (BH1750_Read(&hBH1750, &light_intensity) != HAL_OK) {
// 處理錯(cuò)誤
}
// 獲取煙霧傳感器數(shù)據(jù)
if (MQ2_Read(&hMQ2, &smoke_level) != HAL_OK) {
// 處理錯(cuò)誤
}
}
// 處理環(huán)境數(shù)據(jù)并進(jìn)行顯示及上傳
void Process_And_Display(void) {
// 顯示當(dāng)前環(huán)境參數(shù)到LCD
LCD_DisplayTemperature(temperature);
LCD_DisplayHumidity(humidity);
LCD_DisplayLightIntensity(light_intensity);
LCD_DisplaySmokeLevel(smoke_level);
// 上傳數(shù)據(jù)到云端
char payload[256];
snprintf(payload, sizeof(payload), "{"temperature": %.2f, "humidity": %.2f, "light": %d, "smoke": %d}",
temperature, humidity, light_intensity, smoke_level);
if (MQTT_Publish(&hMQTTClient, "env_data/topic", payload) != HAL_OK) {
// 處理MQTT發(fā)布錯(cuò)誤
}
// 環(huán)境預(yù)警
if (temperature > TEMPERATURE_THRESHOLD_HIGH || temperature < TEMPERATURE_THRESHOLD_LOW) {
MQTT_Publish(&hMQTTClient, "alert/topic", "Temperature out of range!");
}
if (humidity > HUMIDITY_THRESHOLD_HIGH || humidity < HUMIDITY_THRESHOLD_LOW) {
MQTT_Publish(&hMQTTClient, "alert/topic", "Humidity out of range!");
}
if (light_intensity > LIGHT_INTENSITY_THRESHOLD) {
MQTT_Publish(&hMQTTClient, "alert/topic", "Light intensity too high!");
}
}
// 主程序入口
int main(void) {
// 初始化HAL庫(kù)
HAL_Init();
// 配置系統(tǒng)時(shí)鐘
SystemClock_Config();
// 初始化外設(shè)
MX_GPIO_Init();
MX_USART2_UART_Init();
MX_I2C1_Init(); // 初始化I2C
MX_SPI1_Init(); // 初始化SPI
MX_WIFI_Init(); // 初始化WiFi模塊
MX_LCD_Init(); // 初始化LCD顯示屏
// 初始化MQTT客戶端
MQTT_Init(&hMQTTClient);
// 連接WiFi
if (ESP8266_Connect(&hWiFi, "your_ssid", "your_password") != HAL_OK) {
// 處理WiFi連接失敗
}
// 連接MQTT服務(wù)器
if (MQTT_Connect(&hMQTTClient, "mqtt_server_address", 1883, "username", "password") != HAL_OK) {
// 處理MQTT連接失敗
}
// 主循環(huán)
while (1) {
// 定時(shí)讀取傳感器數(shù)據(jù)
Read_Sensors();
// 處理數(shù)據(jù)并顯示/上傳
Process_And_Display();
}
}
五、上位機(jī)開(kāi)發(fā)
為了方便查看設(shè)備上傳的數(shù)據(jù),接下來(lái)利用Qt開(kāi)發(fā)一款Android手機(jī)APP 和 Windows上位機(jī)。
使用華為云平臺(tái)提供的API接口獲取設(shè)備上傳的數(shù)據(jù),進(jìn)行可視化顯示,以及遠(yuǎn)程控制設(shè)備。
5.1 Qt開(kāi)發(fā)環(huán)境安裝
Qt的中文官網(wǎng): https://www.qt.io/zh-cn/
QT5.12.6的下載地址:https://download.qt.io/archive/qt/5.12/5.12.6
打開(kāi)下載鏈接后選擇下面的版本進(jìn)行下載:
如果下載不了,可以在網(wǎng)盤里找到安裝包下載: https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件安裝時(shí)斷網(wǎng)安裝,否則會(huì)提示輸入賬戶。
安裝的時(shí)候,第一個(gè)復(fù)選框里的編譯器可以全選,直接點(diǎn)擊下一步繼續(xù)安裝。
選擇編譯器: (一定要看清楚了)
前面2講解了需要用的API接口,接下來(lái)就使用Qt設(shè)計(jì)上位機(jī),設(shè)計(jì)界面,完成整體上位機(jī)的邏輯設(shè)計(jì)。
【1】新建工程
【2】設(shè)置項(xiàng)目的名稱。
【3】選擇編譯系統(tǒng)
【4】選擇默認(rèn)繼承的類
【5】選擇編譯器
【6】點(diǎn)擊完成
【7】工程創(chuàng)建完成
5.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時(shí)候選擇了2種編譯器。 一種是mingw32
這個(gè)編譯Windows下運(yùn)行的程序。 一種是Android
編譯器,可以生成Android
手機(jī)APP。
不過(guò)要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個(gè)大家可以看下面的教程配置一下就行了。
Android環(huán)境搭建的博客鏈接: https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的編譯器就沒(méi)有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的 mingw32
這個(gè)編譯器,編譯Windows下運(yùn)行的程序。
5.4 編譯測(cè)試功能
創(chuàng)建完畢之后,編譯測(cè)試一下功能是否OK。
點(diǎn)擊左下角的綠色三角形按鈕
。
正常運(yùn)行就可以看到彈出一個(gè)白色的框框。這就表示工程環(huán)境沒(méi)有問(wèn)題了。 接下來(lái)就可以放心的設(shè)計(jì)界面了。
5.5 設(shè)計(jì)UI界面與工程配置
【1】打開(kāi)UI文件
打開(kāi)默認(rèn)的界面如下:
【2】開(kāi)始設(shè)計(jì)界面
根據(jù)自己需求設(shè)計(jì)界面。
5.5 編譯Windows上位機(jī)
點(diǎn)擊軟件左下角的綠色三角形按鈕進(jìn)行編譯運(yùn)行。
5.6 配置Android環(huán)境
如果想編譯Android手機(jī)APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過(guò)程可以自行百度搜索學(xué)習(xí))
然后才可以進(jìn)行下面的步驟。
【1】選擇Android編譯器
選擇編譯器。
切換編譯器。
【2】創(chuàng)建Android配置文件
創(chuàng)建完成。
【3】配置Android圖標(biāo)與名稱
【3】編譯Android上位機(jī)
Qt本身是跨平臺(tái)的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺(tái)。
然后點(diǎn)擊構(gòu)建。
成功之后,在目錄下可以看到生成的apk
文件,也就是Android手機(jī)的安裝包,電腦端使用QQ
發(fā)送給手機(jī)QQ,手機(jī)登錄QQ接收,就能直接安裝。
生成的apk
的目錄在哪里呢? 編譯完成之后,在控制臺(tái)會(huì)輸出APK文件的路徑。
知道目錄在哪里之后,在Windows的文件資源管理器里,找到路徑,具體看下圖,找到生成的apk文件。
-- File: D:/QtProject/build-265_AgritechIoTManager-Android_for_arm64_v8a_Clang_Qt_5_12_6_for_Android_ARM64_v8a-Release/android-build//build/outputs/apk/debug/android-build-debug.apk
六、總結(jié)
綜上所述,基于物聯(lián)網(wǎng)技術(shù)設(shè)計(jì)的陳列館監(jiān)控系統(tǒng)在環(huán)境監(jiān)測(cè)、安全防護(hù)和數(shù)據(jù)管理等方面提供了全面的解決方案。通過(guò)多種傳感器模塊實(shí)時(shí)采集溫濕度、光照強(qiáng)度、煙霧和火焰數(shù)據(jù),并結(jié)合視頻監(jiān)控與人流量統(tǒng)計(jì),系統(tǒng)能夠有效保障陳列館內(nèi)文物的安全和環(huán)境的穩(wěn)定。同時(shí),系統(tǒng)還通過(guò)WIFI模塊與云端實(shí)現(xiàn)數(shù)據(jù)同步和遠(yuǎn)程監(jiān)控,便于工作人員隨時(shí)掌握館內(nèi)的實(shí)時(shí)情況,及時(shí)響應(yīng)可能發(fā)生的異常事件。
該系統(tǒng)不僅具備高效的本地?cái)?shù)據(jù)顯示功能,還通過(guò)可視化大屏展現(xiàn)環(huán)境監(jiān)測(cè)信息、預(yù)警提示和視頻監(jiān)控,進(jìn)一步增強(qiáng)了館內(nèi)管理的智能化和便捷性。利用深度學(xué)習(xí)技術(shù)進(jìn)行人流量監(jiān)控,為管理人員提供了更精準(zhǔn)的數(shù)據(jù)支持,有助于優(yōu)化陳列館的運(yùn)營(yíng)效率。
通過(guò)合理的硬件選型和智能化軟件設(shè)計(jì),本系統(tǒng)展示了物聯(lián)網(wǎng)技術(shù)在文化遺產(chǎn)保護(hù)領(lǐng)域的巨大潛力。未來(lái),隨著技術(shù)的不斷發(fā)展,系統(tǒng)的功能和應(yīng)用場(chǎng)景也有望得到進(jìn)一步擴(kuò)展和優(yōu)化,為更多公共設(shè)施和文化場(chǎng)館的智能化管理提供借鑒和支持。
審核編輯 黃宇
-
lcd
+關(guān)注
關(guān)注
34文章
4438瀏覽量
168375 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2913文章
44923瀏覽量
376988 -
監(jiān)控系統(tǒng)
+關(guān)注
關(guān)注
21文章
3940瀏覽量
176825 -
IOT
+關(guān)注
關(guān)注
187文章
4230瀏覽量
197591
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論