一、前言
1.1 項目開發(fā)背景
隨著科技的迅速發(fā)展,物聯(lián)網(wǎng)(IoT)技術(shù)在各個領(lǐng)域的應(yīng)用日益廣泛,尤其是在智慧場館管理中表現(xiàn)出強大的潛力。陳列館作為重要的文化遺產(chǎn)和文物展示空間,其環(huán)境的精細(xì)化管理至關(guān)重要。文物的保存對溫度、濕度、光照等環(huán)境參數(shù)有著嚴(yán)格要求,同時也需要高度重視安全防范工作,防止火災(zāi)和盜竊等突發(fā)事件對文物造成損害。因此,設(shè)計一套基于物聯(lián)網(wǎng)技術(shù)的智能監(jiān)控系統(tǒng),可以有效提升陳列館的管理效率和文物保護水平。
傳統(tǒng)的陳列館監(jiān)控方式通常依賴人工定時巡查和簡單的環(huán)境監(jiān)測設(shè)備,缺乏自動化與智能化手段。這種方式不僅效率低下,而且在緊急情況下響應(yīng)能力有限。通過物聯(lián)網(wǎng)技術(shù)與智能化手段的結(jié)合,可以實現(xiàn)對陳列館內(nèi)環(huán)境參數(shù)和安全狀況的全面感知和實時管理,大幅提高運行效率和風(fēng)險防范能力。
該項目構(gòu)建一個功能全面、實時監(jiān)控的陳列館智能監(jiān)控系統(tǒng)。通過引入高精度的溫濕度傳感器(SHT30)、光照強度檢測模(BH1750)、煙霧和火焰傳感器(MQ2和火焰?zhèn)鞲衅鳎?,實時采集館內(nèi)環(huán)境數(shù)據(jù),并利用10寸LCD顯示屏進行本地展示,同時通過WIFI模塊(ESP8266)和MQTT協(xié)議將數(shù)據(jù)上傳至華為云IoT平臺,實現(xiàn)云端存儲與分析。結(jié)合Qt開發(fā)的Windows可視化大屏,工作人員可以在辦公室內(nèi)直觀查看環(huán)境參數(shù)、預(yù)警信息及陳列館實時監(jiān)控畫面,進一步提升管理便捷性。
此外,系統(tǒng)還結(jié)合了視頻監(jiān)控功能,采用支持RTMP推流的獨立攝像頭,將實時視頻畫面通過NGINX服務(wù)器推流至華為云ECS服務(wù)器,并在可視化大屏上呈現(xiàn)。同時,通過深度學(xué)習(xí)算法對視頻畫面進行人體識別,實時統(tǒng)計陳列館內(nèi)人流量并生成每日統(tǒng)計數(shù)據(jù),為場館運營提供決策依據(jù)。
本系統(tǒng)的開發(fā)不僅滿足了陳列館日常環(huán)境監(jiān)控與安全管理的需求,還通過引入先進的IoT技術(shù)和視頻分析能力,為文物保護和場館管理提供了一種高效、智能的解決方案,具有廣泛的推廣價值和應(yīng)用前景。
大屏調(diào)試
下面是陳列館
的內(nèi)部實景一角。
1.2 設(shè)計實現(xiàn)的功能
(1)溫濕度檢測
使用SHT30傳感器實時檢測陳列館內(nèi)的環(huán)境溫度和濕度,確保文物保存的適宜條件。
(2)光照強度檢測
使用BH1750傳感器實時檢測光照強度,避免強光對文物造成損害。
(3)煙霧與火焰檢測
通過MQ2傳感器檢測煙霧濃度和火焰?zhèn)鞲衅鳈z測火光,及時發(fā)現(xiàn)火災(zāi)隱患。一旦檢測到火情,系統(tǒng)將立即拉響警報并觸發(fā)報警機制。
(4)本地數(shù)據(jù)顯示
配備10寸LCD顯示屏,實時展示采集的溫濕度、光照強度等環(huán)境參數(shù)。顯示屏安裝在陳列館大門口,方便工作人員查看。
(5)數(shù)據(jù)上傳與云端存儲
使用ESP8266模塊,通過WIFI和MQTT協(xié)議,將采集到的環(huán)境數(shù)據(jù)上傳至華為云IoT物聯(lián)網(wǎng)平臺進行存儲和管理。
(6)可視化大屏顯示
在辦公室內(nèi)的Windows電腦上,通過Qt開發(fā)的可視化大屏展示環(huán)境參數(shù)、實時監(jiān)控畫面及預(yù)警信息,方便工作人員遠(yuǎn)程管理。
(7)環(huán)境參數(shù)預(yù)警
當(dāng)溫濕度、光照強度超出預(yù)設(shè)閾值時,系統(tǒng)會在可視化大屏上發(fā)出警示,提醒工作人員及時采取措施。
(8)視頻監(jiān)控與實時推流
使用支持RTMP協(xié)議的獨立攝像頭,通過NGINX服務(wù)器推流,將實時監(jiān)控畫面上傳至華為云ECS服務(wù)器。可視化大屏上可以實時查看視頻監(jiān)控畫面,便于隨時了解館內(nèi)情況。
(9)人流量監(jiān)控與統(tǒng)計
基于深度學(xué)習(xí)算法進行人體識別,實時統(tǒng)計陳列館內(nèi)的人流量。在可視化大屏上顯示當(dāng)前人流量,并生成每日統(tǒng)計數(shù)據(jù),為運營分析提供支持。
(10)火災(zāi)警報與應(yīng)急響應(yīng)
在檢測到火災(zāi)時,系統(tǒng)會自動觸發(fā)警報,同時上傳報警信息到云端,提醒工作人員采取應(yīng)急措施。
(11)穩(wěn)定供電支持
系統(tǒng)通過220V市電供電,保證設(shè)備長期穩(wěn)定運行,滿足陳列館全天候監(jiān)控需求。
1.3 項目硬件模塊組成
(1)主控芯片(STM32F103RCT6)
作為系統(tǒng)的核心控制單元,負(fù)責(zé)接收和處理各類傳感器的數(shù)據(jù),控制顯示屏顯示內(nèi)容,管理與云端的通信等功能。
(2)溫濕度傳感器(SHT30)
用于實時檢測陳列館內(nèi)的環(huán)境溫度和濕度,數(shù)據(jù)將被傳輸?shù)街骺匦酒M行處理和顯示。
(3)光照強度傳感器(BH1750)
用于測量陳列館內(nèi)的光照強度,確保館內(nèi)光照水平符合文物保護的需求。
(4)煙霧傳感器(MQ2)
用于檢測館內(nèi)是否有煙霧存在,及時發(fā)現(xiàn)火災(zāi)隱患,防止火災(zāi)的發(fā)生。
(5)火焰?zhèn)鞲衅?/strong>
用于檢測火焰的存在,一旦檢測到火焰,立即觸發(fā)報警系統(tǒng)進行應(yīng)急處理。
(6)WIFI模塊(ESP8266)
負(fù)責(zé)通過WIFI將傳感器采集的數(shù)據(jù)上傳至華為云IoT平臺,支持與云端的通信和數(shù)據(jù)傳輸。
(7)顯示屏(10寸LCD顯示屏)
用于實時顯示陳列館內(nèi)的環(huán)境參數(shù),如溫濕度、光照強度等,便于工作人員進行現(xiàn)場監(jiān)控。
(8)220V市電供電模塊
為整個系統(tǒng)提供穩(wěn)定的電源支持,確保硬件設(shè)備持續(xù)運行。
(9)監(jiān)控攝像頭(支持RTMP協(xié)議)
用于實時采集陳列館內(nèi)的畫面,并通過RTMP協(xié)議將視頻推送至云端,支持視頻監(jiān)控和人流量統(tǒng)計功能。
(10)視頻推流服務(wù)器(NGINX服務(wù)器)
用于接收來自監(jiān)控攝像頭的RTMP視頻流,并將其轉(zhuǎn)發(fā)至華為云ECS服務(wù)器,實現(xiàn)實時視頻監(jiān)控功能。
(11)環(huán)境參數(shù)報警模塊
當(dāng)檢測到溫濕度或光照強度超出預(yù)設(shè)閾值時,系統(tǒng)將通過警報裝置(如蜂鳴器、LED指示燈等)向工作人員發(fā)出預(yù)警信號。
1.4 設(shè)計思路
本項目的設(shè)計思路是通過物聯(lián)網(wǎng)技術(shù)將傳感器數(shù)據(jù)采集、視頻監(jiān)控和云端管理相結(jié)合,構(gòu)建一個智能化、自動化的陳列館環(huán)境監(jiān)控系統(tǒng)。其核心目標(biāo)是實時監(jiān)測環(huán)境參數(shù)、確保文物安全,并通過智能化管理提升陳列館的運營效率。
系統(tǒng)通過多種傳感器模塊實現(xiàn)環(huán)境參數(shù)的實時監(jiān)測。溫濕度傳感器(SHT30)和光照強度傳感器(BH1750)負(fù)責(zé)監(jiān)測陳列館內(nèi)部的溫度、濕度和光照強度,確保環(huán)境條件適宜文物的保存。煙霧傳感器(MQ2)和火焰?zhèn)鞲衅鲃t負(fù)責(zé)檢測館內(nèi)是否存在火災(zāi)隱患,一旦發(fā)生異常,系統(tǒng)會及時響應(yīng)并觸發(fā)報警機制,保障館內(nèi)的安全。
所有采集的數(shù)據(jù)通過主控芯片STM32F103RCT6進行處理,傳感器的數(shù)據(jù)通過WIFI模塊(ESP8266)被上傳到華為云IoT平臺,進行遠(yuǎn)程存儲和管理。這一部分的設(shè)計思路是通過云端的集中式存儲,方便數(shù)據(jù)的后期分析與統(tǒng)計,確保數(shù)據(jù)的可靠性和長期存儲需求。
系統(tǒng)的本地顯示部分通過10寸LCD屏幕實時展示館內(nèi)的環(huán)境數(shù)據(jù),方便館內(nèi)工作人員直觀查看當(dāng)前的環(huán)境狀況,并及時發(fā)現(xiàn)異常情況??梢暬笃镣ㄟ^Qt在Windows平臺開發(fā),能夠顯示包括環(huán)境參數(shù)、警報信息以及實時視頻監(jiān)控畫面等內(nèi)容。通過這種方式,工作人員不僅可以在現(xiàn)場通過LCD顯示屏進行操作,還可以在遠(yuǎn)程的辦公室內(nèi)通過大屏監(jiān)控整個館內(nèi)的運行狀況。
在安全監(jiān)控方面,設(shè)計了支持RTMP協(xié)議的監(jiān)控攝像頭,能夠?qū)崟r視頻流推送至NGINX服務(wù)器,再通過華為云ECS服務(wù)器進行存儲和管理。通過RTMP推流技術(shù),系統(tǒng)能夠?qū)崟r展示陳列館內(nèi)的監(jiān)控畫面,幫助工作人員隨時了解館內(nèi)動態(tài)。此外,結(jié)合深度學(xué)習(xí)算法,系統(tǒng)可以對視頻數(shù)據(jù)進行人體識別,統(tǒng)計館內(nèi)人流量,并將統(tǒng)計結(jié)果呈現(xiàn)在可視化大屏上。這一設(shè)計不僅能實現(xiàn)對文物的安全監(jiān)控,還能幫助工作人員優(yōu)化館內(nèi)的人員流動管理。
為了確保系統(tǒng)的穩(wěn)定性,所有硬件模塊如傳感器、顯示屏和監(jiān)控設(shè)備都通過220V市電進行供電,同時考慮到電力供應(yīng)的可靠性,電源管理模塊采用了穩(wěn)定的供電設(shè)計。設(shè)備運行時,主控芯片與傳感器之間的通信通過穩(wěn)定的接口和協(xié)議進行,保證了數(shù)據(jù)采集的準(zhǔn)確性和實時性。
本項目的設(shè)計思路是通過物聯(lián)網(wǎng)技術(shù)結(jié)合環(huán)境監(jiān)測、視頻監(jiān)控、數(shù)據(jù)云存儲和智能化管理,實現(xiàn)陳列館環(huán)境的全方位監(jiān)控與管理,提升文物保護效果和館內(nèi)運營效率,同時確保館內(nèi)的安全與緊急事件的快速響應(yīng)。
1.5 系統(tǒng)功能總結(jié)
功能模塊 | 功能描述 |
---|---|
溫濕度檢測 | 實時監(jiān)測陳列館內(nèi)的環(huán)境溫度和濕度,確保文物保存的適宜條件。 |
光照強度檢測 | 實時檢測陳列館內(nèi)的光照強度,防止強光對文物造成損害。 |
煙霧與火焰檢測 | 通過煙霧傳感器(MQ2)和火焰?zhèn)鞲衅鳈z測火災(zāi)隱患,一旦發(fā)現(xiàn)異常即觸發(fā)報警,保障文物與館內(nèi)安全。 |
本地數(shù)據(jù)顯示 | 通過LCD顯示屏實時顯示溫濕度、光照強度等環(huán)境參數(shù),方便館內(nèi)工作人員查看當(dāng)前環(huán)境狀態(tài)。 |
數(shù)據(jù)上傳與云端存儲 | 使用WIFI模塊(ESP8266)和MQTT協(xié)議,將環(huán)境數(shù)據(jù)上傳至華為云IoT平臺進行存儲,便于數(shù)據(jù)管理與分析。 |
可視化大屏顯示 | 在辦公室內(nèi)通過Qt開發(fā)的可視化大屏展示環(huán)境參數(shù)、實時監(jiān)控畫面及預(yù)警信息,幫助工作人員遠(yuǎn)程監(jiān)控管理。 |
環(huán)境參數(shù)預(yù)警 | 設(shè)定閾值,當(dāng)溫濕度或光照強度超過/低于設(shè)定范圍時,系統(tǒng)將在可視化大屏上進行警示,提醒工作人員采取措施。 |
視頻監(jiān)控與實時推流 | 使用支持RTMP協(xié)議的監(jiān)控攝像頭,通過NGINX服務(wù)器將視頻流推送至云端,并在可視化大屏上實時顯示監(jiān)控畫面。 |
人流量監(jiān)控與統(tǒng)計 | 基于深度學(xué)習(xí)算法對視頻進行人體識別,實時統(tǒng)計館內(nèi)人流量,并在可視化大屏上顯示當(dāng)前人流量和每日統(tǒng)計數(shù)據(jù)。 |
火災(zāi)警報與應(yīng)急響應(yīng) | 監(jiān)測到火災(zāi)時自動觸發(fā)警報并向云端上傳報警信息,提醒工作人員采取緊急措施,避免災(zāi)難發(fā)生。 |
穩(wěn)定供電支持 | 系統(tǒng)通過220V市電供電,保證設(shè)備穩(wěn)定運行,確保長時間的監(jiān)控需求。 |
1.6 開發(fā)工具的選擇
【1】設(shè)備端開發(fā)
STM32的編程語言選擇C語言,C語言執(zhí)行效率高,大學(xué)里主學(xué)的C語言,C語言編譯出來的可執(zhí)行文件最接近于機器碼,匯編語言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執(zhí)行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當(dāng)前的設(shè)計就是采用C語言開發(fā)。
開發(fā)工具選擇Keil,keil是一家世界領(lǐng)先的嵌入式微控制器軟件開發(fā)商,在2015年,keil被ARM公司收購。因為當(dāng)前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來開發(fā)STM32是有先天優(yōu)勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學(xué),開發(fā)51單片機、STM32單片機等等。目前作為MCU芯片開發(fā)的軟件也不只是keil一家獨大,IAR在MCU微處理器開發(fā)領(lǐng)域里也使用的非常多,IAR擴展性更強,也支持STM32開發(fā),也支持其他芯片,比如:CC2530,51單片機的開發(fā)。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經(jīng)習(xí)慣再使用IAR是有點不適應(yīng)界面的。
【2】上位機開發(fā)
上位機的開發(fā)選擇Qt框架,編程語言采用C++;Qt是一個1991年由Qt Company開發(fā)的跨平臺C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴展(稱為元對象編譯器(Meta Object Compiler, moc))以及一些宏,Qt很容易擴展,并且允許真正地組件編程。Qt能輕松創(chuàng)建具有原生C++性能的連接設(shè)備、用戶界面(UI)和應(yīng)用程序。它功能強大且結(jié)構(gòu)緊湊,擁有直觀的工具和庫。
1.8 模塊的技術(shù)詳情介紹
【1】ESP8266模塊
ESP8266是一款低功耗、低成本的WiFi模塊,廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)項目中。它集成了WiFi無線通信功能,可以實現(xiàn)設(shè)備與互聯(lián)網(wǎng)的無線連接,具有非常高的性價比。ESP8266模塊的設(shè)計旨在簡化無線網(wǎng)絡(luò)的配置和連接過程,特別適合嵌入式系統(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)置有處理器、存儲器、WiFi射頻模塊以及網(wǎng)絡(luò)協(xié)議棧,支持通過AT命令或通過編程來控制和操作。用戶可以通過編程將其嵌入到各種應(yīng)用中,作為通信橋梁在微控制器和互聯(lián)網(wǎng)之間進行數(shù)據(jù)傳輸。
該模塊通常包括多個版本,常見的有ESP-01、ESP-12E等,它們的差異主要體現(xiàn)在引腳數(shù)目、外部存儲、天線設(shè)計等方面。ESP8266具有較強的處理能力,能夠支持復(fù)雜的通信協(xié)議,并能夠獨立執(zhí)行部分任務(wù),無需外部微處理器的支持。它的主要功能是將嵌入式設(shè)備連接到WiFi網(wǎng)絡(luò),通過HTTP、MQTT、WebSocket等協(xié)議與云端進行數(shù)據(jù)交互和控制。
在實際應(yīng)用中,ESP8266模塊通過串口(UART)與其他硬件設(shè)備進行通信,且其支持AT命令集,通過這些命令可以配置WiFi參數(shù)、控制網(wǎng)絡(luò)連接、發(fā)送和接收數(shù)據(jù)。對于開發(fā)者來說,它的開發(fā)環(huán)境支持Arduino IDE、NodeMCU、PlatformIO等,極大地簡化了開發(fā)流程。使用這些開發(fā)環(huán)境,開發(fā)者可以通過編程實現(xiàn)更復(fù)雜的功能,如數(shù)據(jù)采集、遠(yuǎn)程控制、智能家居應(yīng)用等。
ESP8266的低功耗特點使得它特別適合于物聯(lián)網(wǎng)設(shè)備的應(yīng)用。模塊的工作電壓范圍為3.3V,雖然其本身的功耗較低,但在深度休眠模式下,功耗可以進一步降低到微安級別,從而延長電池壽命。這使得ESP8266在需要長期運行的無線傳感器網(wǎng)絡(luò)和便攜式設(shè)備中具有廣泛的應(yīng)用。
在物聯(lián)網(wǎng)應(yīng)用中,ESP8266常常用于實現(xiàn)設(shè)備與互聯(lián)網(wǎng)的互聯(lián)互通,能夠通過WiFi協(xié)議將數(shù)據(jù)上傳到云平臺,如華為云、AWS、ThingSpeak等,實現(xiàn)數(shù)據(jù)存儲、遠(yuǎn)程監(jiān)控、控制和分析。在智能家居、智能農(nóng)業(yè)、環(huán)境監(jiān)控等領(lǐng)域,ESP8266作為通信模塊發(fā)揮著至關(guān)重要的作用。
ESP8266憑借其低成本、高集成度、強大的WiFi連接功能以及良好的開發(fā)支持,成為了物聯(lián)網(wǎng)領(lǐng)域中最受歡迎的無線通信模塊之一,尤其適用于需要無線連接的嵌入式設(shè)備和智能硬件項目。
【2】MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協(xié)議)是一種輕量級、發(fā)布/訂閱模式的消息傳輸協(xié)議,專為低帶寬、不可靠網(wǎng)絡(luò)環(huán)境設(shè)計。它最早由IBM提出,現(xiàn)已成為物聯(lián)網(wǎng)(IoT)通信的重要協(xié)議之一。由于其高效、低功耗和實時性等特點,MQTT在智能家居、工業(yè)自動化、遠(yuǎn)程監(jiān)控和車聯(lián)網(wǎng)等領(lǐng)域得到了廣泛應(yīng)用。
MQTT的工作原理基于發(fā)布/訂閱模型。這種模型有別于傳統(tǒng)的客戶端-服務(wù)器模型,通信方不需要直接建立連接。MQTT由三個核心組件構(gòu)成:客戶端、代理(Broker)和主題(Topic)。客戶端可以作為消息的發(fā)布者或訂閱者,消息通過代理進行路由。代理是一個中間服務(wù)端,用于接收和分發(fā)來自不同客戶端的消息。發(fā)布者發(fā)送消息到一個特定的主題上,代理負(fù)責(zé)將這些消息分發(fā)給所有訂閱了該主題的客戶端。通過這種解耦的架構(gòu)設(shè)計,客戶端之間可以實現(xiàn)松耦合的通信,降低了復(fù)雜性和依賴性。
在MQTT協(xié)議中,消息被分為不同的主題(Topic),例如“home/sensor/temperature”可以用來代表溫度傳感器數(shù)據(jù)??蛻舳丝梢杂嗛嗊@個主題,當(dāng)發(fā)布者發(fā)送新的數(shù)據(jù)到該主題時,所有訂閱該主題的客戶端都會收到更新信息。這種靈活的主題結(jié)構(gòu)和層次化的命名規(guī)則,使得MQTT在復(fù)雜場景下也能快速組織和管理消息流。
MQTT協(xié)議支持三種服務(wù)質(zhì)量(QoS)等級,分別為“至多一次”(QoS 0)、“至少一次”(QoS 1)和“僅一次”(QoS 2)。QoS 0表示消息傳輸盡力而為,可能會丟失或重復(fù);QoS 1確保消息至少送達(dá)一次,但可能會有重復(fù);QoS 2則確保消息恰好傳輸一次,保證消息的嚴(yán)格可靠性。這種設(shè)計使MQTT能夠適應(yīng)不同的應(yīng)用場景,用戶可以根據(jù)應(yīng)用需求選擇合適的QoS級別。
為了保證通信的安全性,MQTT支持用戶名和密碼驗證,代理可以對連接進行身份認(rèn)證。此外,許多實現(xiàn)中還支持TLS/SSL加密通信,確保數(shù)據(jù)在傳輸過程中不會被竊取或篡改。用戶也可以使用不同的認(rèn)證方式來增強系統(tǒng)的安全性,適應(yīng)物聯(lián)網(wǎng)應(yīng)用中對安全性的高需求。
MQTT非常注重輕量化和低功耗。它的報文頭非常小,通信開銷很低,這使其特別適合在資源受限的設(shè)備或不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中使用。MQTT支持“保持連接”和“遺囑消息”功能,客戶端可以在連接斷開時自動向代理發(fā)送遺囑消息,通知其他客戶端連接狀態(tài)的變化。這種特性有助于提高網(wǎng)絡(luò)的健壯性和系統(tǒng)的可用性。
MQTT的典型使用場景包括物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)采集、實時監(jiān)控、消息推送和控制命令的發(fā)布。比如在智能家居中,傳感器可以發(fā)布環(huán)境數(shù)據(jù),如溫濕度、煙霧濃度等,控制設(shè)備根據(jù)收到的消息作出響應(yīng),實現(xiàn)自動化操作。在工業(yè)場景中,MQTT可以幫助收集和管理大規(guī)模設(shè)備的運行狀態(tài),實現(xiàn)集中化和高效的設(shè)備監(jiān)控。
MQTT協(xié)議憑借其低功耗、高效能、實時性強等優(yōu)勢,已成為物聯(lián)網(wǎng)通信的主要協(xié)議之一。它的發(fā)布/訂閱模式簡化了設(shè)備之間的通信,使其特別適合多對多、低延遲、高可靠性的數(shù)據(jù)傳輸場景。MQTT易于使用、拓展性強,為開發(fā)者提供了靈活的解決方案來構(gòu)建各種物聯(lián)網(wǎng)應(yīng)用。
二、搭建視頻監(jiān)控流媒體服務(wù)器
2.1 購買云服務(wù)器
如果之前沒有使用過華為云的ECS服務(wù)器,可以先申請試用1個月,了解服務(wù)器的基本使用然后再購買,不得不說提供這個試用服務(wù)還是非常不錯。
產(chǎn)品試用領(lǐng)取地址: https://activity.huaweicloud.com/free_test/index.html
每天9:30開搶,每天限量100份,這個頁面不僅有云服務(wù)器可以領(lǐng)取試用,還有云數(shù)據(jù)庫、沙盒等其他產(chǎn)品。
我這里領(lǐng)取了 2核4G S6云服務(wù)器
,這個服務(wù)器是配套華為自研25GE智能高速網(wǎng)卡,適用于網(wǎng)站和Web應(yīng)用等中輕載企業(yè)應(yīng)用。
選擇配置的時候發(fā)現(xiàn)S6規(guī)格的已經(jīng)沒有了,來晚了。
S6規(guī)格沒有了,就選擇了S3,2核,4GB的配置結(jié)算。
頁面向下翻,下面選擇系統(tǒng)預(yù)裝的系統(tǒng),我這里選擇ubuntu 20.04,安裝NGINX,來搭建流媒體服務(wù)器。
頁面繼續(xù)下翻,設(shè)置云服務(wù)器名稱,設(shè)置系統(tǒng)的root密碼。
接著就可以繼續(xù)去支付了。
購買后等待一段時間,系統(tǒng)資源就即可分配完成。
2.2 登錄云服務(wù)器
云服務(wù)器的管理控制臺從這里進入: https://www.huaweicloud.com/product/ecs.html
在官網(wǎng)主頁,點擊產(chǎn)品,找到計算選項,就可以看到彈性云服務(wù)器ECS,點擊進去就可以看到管理控制臺的選項。
在彈性云服務(wù)器
的選項頁面可以看到剛才購買的云服務(wù)器,如果點擊進去提示該區(qū)域沒有可用的服務(wù)器,說明區(qū)域選擇的不對,在下面截圖紅色框框的位置可以看到可用的區(qū)域切換按鈕,切換之后就行了。
點擊服務(wù)器右邊的更多
,可以對服務(wù)器重裝系統(tǒng)、切換操作系統(tǒng)、關(guān)機、開機、重啟、重置密碼等操作。
接下來先點擊登錄,了解一下登錄的流程,看看系統(tǒng)進去的效果。
云服務(wù)器支持SSH協(xié)議遠(yuǎn)程登錄,可以在瀏覽器上直接使用CloudShell方式或者VNC方式登錄,如果本身你自己也是使用Linux系統(tǒng),可以在Linux系統(tǒng)里通過ssh命令直接登錄,如果是在windows下可以使用SecureCRT登錄。
其他登錄方式。
最方便的登錄方式,直接在控制臺使用VNC在瀏覽器里登錄,點擊立即登錄
。
根據(jù)提示輸入用戶名,密碼后,按下回車鍵即可登錄。
用戶名直接輸入root
,密碼就是剛才配置云服務(wù)器時,填入的root密碼。
注意: Linux下輸入密碼默認(rèn)都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會有反應(yīng)的,自己按照正確的密碼輸入即可。
用戶名、密碼輸入正確后,登錄成功。
可以點擊全屏模式,更好的操作。
2.3 使用CloudShell登錄云服務(wù)器
在頁面上直接點擊CloudShell登錄
按鈕。CloudShell方式比VNC方式方便、流暢多了,也支持命令的復(fù)制粘貼。
輸入密碼點擊連接。
登錄成功進入終端。
2.4 使用SecureCRT登錄云服務(wù)器
上面演示了兩種登錄方式,都是直接在瀏覽器里登錄,這種兩種方式比較來看,VNC方式效率最低,CloudShell
相對來說要方便很多。一般我自己正常開發(fā)時,都是使用第三方工具來登錄的,如果本身自己開發(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
來作為登錄終端,登錄云服務(wù)器。
注意: SecureCRT 6.5
登錄高版本Linux系統(tǒng)會出現(xiàn)Key exchange failed
問題,導(dǎo)致登錄失敗,比如: 登錄ubuntu 20.04 系統(tǒng)。 出現(xiàn)這種問題需要對系統(tǒng)ssh配置文件進行添加配置。
添加配置的流程:
命令行輸入:
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
如果不想這么麻煩的去修改配置文件,那么最簡單的辦法就是: 切換操作系統(tǒng),換一個低版本的,比如:ubuntu18.04 即可。
在云服務(wù)器的控制臺,找到自己的服務(wù)器,然后選擇切換操作系統(tǒng)。
根據(jù)界面上的引導(dǎo)流程,切換即可。更換新的系統(tǒng)需要1~4分鐘時間,稍微等待一下即可。
如果要使用遠(yuǎn)程SSH協(xié)議方式登錄云服務(wù)器,需要具備以下幾個前提條件。
[1]彈性云服務(wù)器狀態(tài)為“運行中”。
[2]彈性云服務(wù)器已經(jīng)綁定彈性公網(wǎng)IP,綁定方式請參見綁定彈性公網(wǎng)IP。
[3]所在安全組入方向已開放22端口,配置方式請參見配置安全組規(guī)則。
[4]使用的登錄工具(如PuTTY,SecureCRT`)與待登錄的彈性云服務(wù)器之間網(wǎng)絡(luò)連通。例如,默認(rèn)的22端口沒有被防火墻屏蔽。
但是這些配置不用擔(dān)心,在購買服務(wù)器后,根據(jù)引導(dǎo)一套走完,上面的這些配置都已經(jīng)默認(rèn)配置好了,不用自己再去單獨配置。
系統(tǒng)切換成功后,打開SecureCRT 6.5
軟件,進行登錄。SecureCRT 6.5
整體而言還是挺好用的。
如果自己沒有``SecureCRT,自己下載一個即可。當(dāng)然,不一定非要使用
SecureCRT`,其他還有很多SSH遠(yuǎn)程登錄工具,喜歡哪個使用哪個。
下面介紹``SecureCRT `登錄的流程。
選擇新建會話。
選擇SSH2協(xié)議。
主機名就填服務(wù)器的公網(wǎng)IP地址,端口號默認(rèn)是22,用戶名填root。
自己云服務(wù)器的公網(wǎng)IP地址,在控制臺可以看到。
軟件點擊下一步之后,可以填充描述信息,備注這個鏈接是干什么的。
選擇剛才新建的協(xié)議端口點擊連接。
云服務(wù)器連接上之后,軟件界面會彈出對話框填充用戶名、密碼。
登錄成功的效果如下。
軟件可以配置一些選項,讓界面符合Linux終端配色,可以修改字體大小、字體編碼等等。
配置后的效果。
2.5 安裝NFS服務(wù)器
為了方便向服務(wù)器上拷貝文件,可以采用NFS服務(wù)器、或者FTP服務(wù)器 這些方式。 我本地有一臺ubuntu 18.04 系統(tǒng)筆記本,我這里采用NFS方式拷貝文件上去。
(1)安裝NFS服務(wù)器
root@ecs-348470:~# sudo apt-get install nfs-kernel-server
(2)創(chuàng)建一個work目錄方便當(dāng)做共享目錄使用
root@ecs-348470:~# mkdir work
(3)編寫NFS配置文件
NFS 服務(wù)的配置文件為/etc/exports,如果系統(tǒng)沒有默認(rèn)值,這個文件就不一定會存在,可以使用 vim 手動建立,然后在文件里面寫入配置內(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 #啟動 NFS 服務(wù)
ufw disable #關(guān)閉防火墻
/etc/init.d/nfs-kernel-server restart #重啟NFS服務(wù)
exportfs -arv #共享路徑生效
(5)本地客戶機掛載服務(wù)器的目錄
wbyq@wbyq:~$ sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
(6)設(shè)置華為云服務(wù)器的安全策略
需要把華為云服務(wù)器的端口號開放出來,不然其他客戶端是無法訪問服務(wù)器的。
我這里比較粗暴直接,直接將所有端口號,所有IP地址都開放出來了。
**(7)本地客戶機掛載服務(wù)器測試 **
掛載指令:
sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/
2.6 安裝NGINX(配置RTMP服務(wù))
(1)下載編譯時需要依賴的一些工具
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í)行完上一步之后,打開objs/Makefile文件,找到-Werror選項并刪除。
(5)編譯并安裝NGINX
root@ecs-348470:~/nginx/nginx-1.8.1# make && make install
安裝之后NGINX的配置文件存放路徑:
/usr/local/nginx/nginx:主程序
(6)查看NGINX的版本號
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
打開文件后,在文件最后加入以下配置:
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流會在NGINX的當(dāng)前目錄下,創(chuàng)建一個video目錄用來緩存視頻。
客戶端向服務(wù)器推流之后,服務(wù)器就會緩存視頻到設(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個命令
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
(7)啟動NGINX服務(wù)器
sudo service nginx start
2.7 攝像頭推流音視頻到服務(wù)器
為了模擬攝像頭實時監(jiān)控推流,我這使用QT+FFMPEG編寫了一個小軟件,在windows下運行,推流本地筆記本電腦的數(shù)據(jù)到服務(wù)器。軟件運行之后,將本地音頻、視頻編碼之后通過RTMP協(xié)議推流到NGINX服務(wù)器。
軟件可以去網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件運行效果:
推流工具運行過程中效果。
2.8 編寫本地RTMP流播放器
在上面通過推流客戶端模擬攝像頭,已經(jīng)將本地的攝像頭數(shù)據(jù)實時推流到服務(wù)器了,那么還差一個播放器,為了方便能夠在任何有網(wǎng)的地方實時查看攝像頭的音頻和圖像,還需要編寫一個RTMP流媒體播放器。
我這里的播放器內(nèi)核是采用libvlc開發(fā)的,使用QT作為GUI框架,開發(fā)了一個流媒體播放器,可以實時拉取服務(wù)器上的流數(shù)據(jù),并且還支持回放。因為服務(wù)器上的NGINX配置了自動保存的參數(shù),可以將推上去的流按時間段保存下來。
軟件可以去網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
輸入服務(wù)器地址之后就可以拉取流進行播放。
點擊獲取回放列表,可以查看服務(wù)器上保存的歷史視頻回放播放。
2.9 配置監(jiān)控攝像頭
第一次使用攝像頭,先使用網(wǎng)線將攝像頭連接到家里路由器上,然后登錄攝像頭管理頁面配置攝像頭。
在攝像頭上面有一個碼,掃描之后就能看到使用辦法。里面有一個軟件下載下來,可以搜索攝像頭IP。
詳細(xì)過程看這里:https://www.showdoc.com.cn/sqIPC/7929920934644196
設(shè)置攝像頭動態(tài)獲取IP(非常重要)
攝像頭用戶名是admin 密碼是12345
登錄成功。
設(shè)置參數(shù):
設(shè)置攝像頭連接的WIFI:
**推流地址:**rtmp://111.160.79.93/live/video158
設(shè)置WIFI聯(lián)網(wǎng)之后,攝像頭就會自動去連接指定的WIFI,完成推流。
三、部署華為云物聯(lián)網(wǎng)平臺
華為云官網(wǎng): https://www.huaweicloud.com/
打開官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設(shè)備接入IoTDA
。
3.1 物聯(lián)網(wǎng)平臺介紹
華為云物聯(lián)網(wǎng)平臺(IoT 設(shè)備接入云服務(wù))提供海量設(shè)備的接入和管理能力,將物理設(shè)備聯(lián)接到云,支撐設(shè)備數(shù)據(jù)采集上云和云端下發(fā)命令給設(shè)備進行遠(yuǎn)程控制,配合華為云其他產(chǎn)品,幫助我們快速構(gòu)筑物聯(lián)網(wǎng)解決方案。
使用物聯(lián)網(wǎng)平臺構(gòu)建一個完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺、業(yè)務(wù)應(yīng)用和設(shè)備。
物聯(lián)網(wǎng)平臺作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層,屏蔽了各種復(fù)雜的設(shè)備接口,實現(xiàn)設(shè)備的快速接入;同時提供強大的開放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。
設(shè)備可以通過固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺,并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報到平臺,平臺也可以將控制命令下發(fā)給設(shè)備。
業(yè)務(wù)應(yīng)用通過調(diào)用物聯(lián)網(wǎng)平臺提供的API,實現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場景。
3.2 開通物聯(lián)網(wǎng)服務(wù)
地址: https://www.huaweicloud.com/product/iothub.html
開通免費單元。
點擊立即創(chuàng)建
。
正在創(chuàng)建標(biāo)準(zhǔn)版實例,需要等待片刻。
創(chuàng)建完成之后,點擊詳情。 可以看到標(biāo)準(zhǔn)版實例的設(shè)備接入端口和地址。
下面框起來的就是端口號
和域名
點擊實例名稱,可以查看當(dāng)前免費單元
的配置情況。
開通之后,點擊接入信息
,也能查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺,這里可以看到MQTT協(xié)議的地址和端口號等信息。
總結(jié):
端口號: MQTT (1883)| MQTTS (8883)
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com
根據(jù)域名地址得到IP地址信息:
打開Windows電腦的命令行控制臺終端,使用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ù):
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時間=37ms TTL=44
117.78.5.125 的 Ping 統(tǒng)計信息:
數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒為單位):
最短 = 37ms,最長 = 37ms,平均 = 37ms
C:UsersLenovo >
MQTT協(xié)議接入端口號有兩個,1883是非加密端口,8883是證書加密端口,單片機無法加載證書,所以使用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)建完成之后點擊查看詳情。
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點擊進入產(chǎn)品詳情頁面,翻到最下面可以看到模型定義。
模型簡單來說: 就是存放設(shè)備上傳到云平臺的數(shù)據(jù)。
你可以根據(jù)自己的產(chǎn)品進行創(chuàng)建。
比如:
煙霧可以叫 MQ2
溫度可以叫 Temperature
濕度可以叫 humidity
火焰可以叫 flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設(shè)備端上傳到服務(wù)器的數(shù)據(jù)名字。
先點擊自定義模型。
再創(chuàng)建一個服務(wù)ID。
接著點擊新增屬性。
3.4 添加設(shè)備
產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實際的設(shè)備。添加的設(shè)備最終需要與真實的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊設(shè)備
(2)根據(jù)自己的設(shè)備填寫
(3)保存設(shè)備信息
創(chuàng)建完畢之后,點擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時候需要使用。
(4)設(shè)備創(chuàng)建完成
(5)設(shè)備詳情
3.5 MQTT協(xié)議主題訂閱與發(fā)布
(1)MQTT協(xié)議介紹
當(dāng)前的設(shè)備是采用MQTT協(xié)議與華為云平臺進行通信。
MQTT是一個物聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的物聯(lián)網(wǎng)設(shè)備提供可靠的網(wǎng)絡(luò)服務(wù)。MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡(luò),低計算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場景。目前MQTT擁有各種平臺和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。
MQTT是一種消息隊列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應(yīng)用程序耦合,相對于其他協(xié)議,開發(fā)更簡單;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é)議,就可以與華為云平臺完成通信。
華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業(yè)務(wù)流程:
(2)華為云平臺MQTT協(xié)議使用限制
描述 | 限制 |
---|---|
支持的MQTT協(xié)議版本 | 3.1.1 |
與標(biāo)準(zhǔn)MQTT協(xié)議的區(qū)別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級 | 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本) |
單帳號每秒最大MQTT連接請求數(shù) | 無限制 |
單個設(shè)備每分鐘支持的最大MQTT連接數(shù) | 1 |
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) | 3KB/s |
MQTT單個發(fā)布消息最大長度,超過此大小的發(fā)布請求將被直接拒絕 | 1MB |
MQTT連接心跳時間建議值 | 心跳時間限定為30至1200秒,推薦設(shè)置為120秒 |
產(chǎn)品是否支持自定義Topic | 支持 |
消息發(fā)布與訂閱 | 設(shè)備只能對自己的Topic進行消息發(fā)布與訂閱 |
每個訂閱請求的最大訂閱數(shù) | 無限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設(shè)備而言,一般會訂閱平臺下發(fā)消息給設(shè)備 這個主題。
設(shè)備想接收平臺下發(fā)的消息,就需要訂閱平臺下發(fā)消息給設(shè)備 的主題,訂閱后,平臺下發(fā)消息給設(shè)備,設(shè)備就會收到消息。
如果設(shè)備想要知道平臺下發(fā)的消息,需要訂閱上面圖片里標(biāo)注的主題。
以當(dāng)前設(shè)備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發(fā)布格式
對于設(shè)備來說,主題發(fā)布表示向云平臺上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設(shè)備狀態(tài)上傳到云平臺。
這個操作稱為:屬性上報。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據(jù)幫助文檔的介紹, 當(dāng)前設(shè)備發(fā)布主題,上報屬性的格式總結(jié)如下:
發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時,需要上傳數(shù)據(jù),這個數(shù)據(jù)格式是JSON格式。
上傳的JSON數(shù)據(jù)格式如下:
{
"services": [
{
"service_id": < 填服務(wù)ID >,
"properties": {
"< 填屬性名稱1 >": < 填屬性值 >,
"< 填屬性名稱2 >": < 填屬性值 >,
..........
}
}
]
}
根據(jù)JSON格式,一次可以上傳多個屬性字段。 這個JSON格式里的,服務(wù)ID,屬性字段名稱,屬性值類型,在前面創(chuàng)建產(chǎn)品的時候就已經(jīng)介紹了,不記得可以翻到前面去查看。
根據(jù)這個格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}
3.6 MQTT三元組
MQTT協(xié)議登錄需要填用戶ID,設(shè)備ID,設(shè)備密碼等信息,就像我們平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協(xié)議登錄的這3個參數(shù),一般稱為MQTT三元組。
接下來介紹,華為云平臺的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 是加密端口更加安全。但是單片機上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進連接的。
根據(jù)上面的域名和端口號,得到下面的IP地址和端口號信息: 如果設(shè)備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)
華為云的MQTT服務(wù)器地址:117.78.5.125
華為云的MQTT端口號:1883
如何得到IP地址?如何域名轉(zhuǎn)IP? 打開Windows的命令行輸入以下命令。
ping ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com
(2)生成MQTT三元組
華為云提供了一個在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開這個工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設(shè)備端通過MQTT協(xié)議登錄鑒權(quán)的時候,填入?yún)?shù)即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
3.7 模擬設(shè)備登錄測試
經(jīng)過上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設(shè)備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實的設(shè)備來登錄平臺。測試與服務(wù)器通信是否正常。
MQTT軟件下載地址【免費】: https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登錄信息
打開MQTT客戶端軟件,對號填入相關(guān)信息(就是上面的文本介紹)。然后,點擊登錄,訂閱主題,發(fā)布主題。
(2)打開網(wǎng)頁查看
完成上面的操作之后,打開華為云網(wǎng)頁后臺,可以看到設(shè)備已經(jīng)在線了。
點擊詳情頁面,可以看到上傳的數(shù)據(jù):
到此,云平臺的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。
(3)MQTT登錄測試參數(shù)總結(jié)
MQTT服務(wù)器: 117.78.5.125
MQTT端口號: 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)建一個IAM賬戶,因為接下來開發(fā)上位機,需要使用云平臺的API接口,這些接口都需要token進行鑒權(quán)。簡單來說,就是身份的認(rèn)證。 調(diào)用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證
項目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rè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è)備影子是一個用于存儲和檢索設(shè)備當(dāng)前狀態(tài)信息的JSON文檔。
每個設(shè)備有且只有一個設(shè)備影子,由設(shè)備ID唯一標(biāo)識
設(shè)備影子僅保存最近一次設(shè)備的上報數(shù)據(jù)和預(yù)期數(shù)據(jù)
無論該設(shè)備是否在線,都可以通過該影子獲取和設(shè)置設(shè)備的屬性
簡單來說:設(shè)備影子就是保存,設(shè)備最新上傳的一次數(shù)據(jù)。
我們設(shè)計的軟件里,如果想要獲取設(shè)備的最新狀態(tài)信息,就采用設(shè)備影子接口。
如果對接口不熟悉,可以先進行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調(diào)試接口,可以請求影子接口,了解請求,與返回的數(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)試成功之后,可以得到訪問影子數(shù)據(jù)的真實鏈接,接下來的代碼開發(fā)中,就采用Qt寫代碼訪問此鏈接,獲取影子數(shù)據(jù),完成上位機開發(fā)。
鏈接如下:
https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow
3.10 訪問接口的代碼實現(xiàn)
(1)配置 Qt 項目
在 Qt 項目的 .pro
文件中,加入對 libcurl
的支持:
QT += core
CONFIG += console
CONFIG -= app_bundle
INCLUDEPATH += /usr/include/curl # 根據(jù)你的系統(tǒng)設(shè)置 libcurl 的路徑
LIBS += -lcurl # 鏈接 libcurl 庫
SOURCES += main.cpp
(2)代碼實現(xiàn)
main.cpp
文件中實現(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; // 用于存儲響應(yīng)數(shù)據(jù)
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();
if (curl) {
// 設(shè)置訪問URL
const QString url = "https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow";
// 設(shè)置HTTP請求頭
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Authorization: Bearer < Your_Access_Token >"); // 這里需要替換為你的實際 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請求
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 (一個用于解析 JSON 數(shù)據(jù)的輕量級 C 庫) 來解析返回的 JSON 數(shù)據(jù)。
(1)配置 Qt 項目
在 Qt 項目的 .pro
文件中,確保包括了 CJSON 的頭文件,并鏈接 CJSON 的源代碼。
QT += core
CONFIG += console
CONFIG -= app_bundle
SOURCES += main.cpp
cJSON.c # 將 cJSON.c 文件添加到你的項目中
INCLUDEPATH += path/to/cjson/ # 添加 CJSON 頭文件的路徑
LIBS += -lcurl # 鏈接 libcurl 庫
(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) {
// 解析每個 shadow 項目
cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
if (cJSON_IsString(serviceId) && (serviceId- >valuestring != NULL)) {
qDebug() < < "Service ID:" < < serviceId- >valuestring;
}
// 解析 "reported" 對象
cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
if (cJSON_IsObject(reported)) {
// 解析 "properties" 對象
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 對象
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è)計
模塊代碼可以在網(wǎng)盤里下載:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
STM32(傳感器讀取、數(shù)據(jù)處理、WiFi通信等)代碼已經(jīng)設(shè)計完成,在main.c
中初始化硬件模塊,處理環(huán)境數(shù)據(jù),并通過WiFi上傳到云端的框架代碼。
#include "stm32f1xx_hal.h"
#include "sht30.h" // 溫濕度傳感器庫
#include "bh1750.h" // 光照傳感器庫
#include "mq2.h" // 煙霧傳感器庫
#include "wifi_module.h" // WiFi模塊庫 (ESP8266)
#include "lcd_display.h" // LCD顯示屏庫
#include "mqtt_client.h" // MQTT客戶端庫
// 定義傳感器和模塊實例
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) {
// 處理錯誤
}
// 獲取光照強度數(shù)據(jù)
if (BH1750_Read(&hBH1750, &light_intensity) != HAL_OK) {
// 處理錯誤
}
// 獲取煙霧傳感器數(shù)據(jù)
if (MQ2_Read(&hMQ2, &smoke_level) != HAL_OK) {
// 處理錯誤
}
}
// 處理環(huán)境數(shù)據(jù)并進行顯示及上傳
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ā)布錯誤
}
// 環(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庫
HAL_Init();
// 配置系統(tǒng)時鐘
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ù)據(jù)
Read_Sensors();
// 處理數(shù)據(jù)并顯示/上傳
Process_And_Display();
}
}
五、上位機開發(fā)
為了方便查看設(shè)備上傳的數(shù)據(jù),接下來利用Qt開發(fā)一款Android手機APP 和 Windows上位機。
使用華為云平臺提供的API接口獲取設(shè)備上傳的數(shù)據(jù),進行可視化顯示,以及遠(yuǎn)程控制設(shè)備。
5.1 Qt開發(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
打開下載鏈接后選擇下面的版本進行下載:
如果下載不了,可以在網(wǎng)盤里找到安裝包下載: https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
軟件安裝時斷網(wǎng)安裝,否則會提示輸入賬戶。
安裝的時候,第一個復(fù)選框里的編譯器可以全選,直接點擊下一步繼續(xù)安裝。
選擇編譯器: (一定要看清楚了)
前面2講解了需要用的API接口,接下來就使用Qt設(shè)計上位機,設(shè)計界面,完成整體上位機的邏輯設(shè)計。
【1】新建工程
【2】設(shè)置項目的名稱。
【3】選擇編譯系統(tǒng)
【4】選擇默認(rèn)繼承的類
【5】選擇編譯器
【6】點擊完成
【7】工程創(chuàng)建完成
5.3 切換編譯器
在左下角是可以切換編譯器的。 可以選擇用什么樣的編譯器編譯程序。
目前新建工程的時候選擇了2種編譯器。 一種是mingw32
這個編譯Windows下運行的程序。 一種是Android
編譯器,可以生成Android
手機APP。
不過要注意:Android的編譯器需要配置一些環(huán)境才可以正常使用,這個大家可以看下面的教程配置一下就行了。
Android環(huán)境搭建的博客鏈接: https://blog.csdn.net/xiaolong1126626497/article/details/117254453
windows的編譯器就沒有這么麻煩,安裝好Qt就可以編譯使用。
下面我這里就選擇的 mingw32
這個編譯器,編譯Windows下運行的程序。
5.4 編譯測試功能
創(chuàng)建完畢之后,編譯測試一下功能是否OK。
點擊左下角的綠色三角形按鈕
。
正常運行就可以看到彈出一個白色的框框。這就表示工程環(huán)境沒有問題了。 接下來就可以放心的設(shè)計界面了。
5.5 設(shè)計UI界面與工程配置
【1】打開UI文件
打開默認(rèn)的界面如下:
【2】開始設(shè)計界面
根據(jù)自己需求設(shè)計界面。
5.5 編譯Windows上位機
點擊軟件左下角的綠色三角形按鈕進行編譯運行。
5.6 配置Android環(huán)境
如果想編譯Android手機APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過程可以自行百度搜索學(xué)習(xí))
然后才可以進行下面的步驟。
【1】選擇Android編譯器
選擇編譯器。
切換編譯器。
【2】創(chuàng)建Android配置文件
創(chuàng)建完成。
【3】配置Android圖標(biāo)與名稱
【3】編譯Android上位機
Qt本身是跨平臺的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺。
然后點擊構(gòu)建。
成功之后,在目錄下可以看到生成的apk
文件,也就是Android手機的安裝包,電腦端使用QQ
發(fā)送給手機QQ,手機登錄QQ接收,就能直接安裝。
生成的apk
的目錄在哪里呢? 編譯完成之后,在控制臺會輸出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è)計的陳列館監(jiān)控系統(tǒng)在環(huán)境監(jiān)測、安全防護和數(shù)據(jù)管理等方面提供了全面的解決方案。通過多種傳感器模塊實時采集溫濕度、光照強度、煙霧和火焰數(shù)據(jù),并結(jié)合視頻監(jiān)控與人流量統(tǒng)計,系統(tǒng)能夠有效保障陳列館內(nèi)文物的安全和環(huán)境的穩(wěn)定。同時,系統(tǒng)還通過WIFI模塊與云端實現(xiàn)數(shù)據(jù)同步和遠(yuǎn)程監(jiān)控,便于工作人員隨時掌握館內(nèi)的實時情況,及時響應(yīng)可能發(fā)生的異常事件。
該系統(tǒng)不僅具備高效的本地數(shù)據(jù)顯示功能,還通過可視化大屏展現(xiàn)環(huán)境監(jiān)測信息、預(yù)警提示和視頻監(jiān)控,進一步增強了館內(nèi)管理的智能化和便捷性。利用深度學(xué)習(xí)技術(shù)進行人流量監(jiān)控,為管理人員提供了更精準(zhǔn)的數(shù)據(jù)支持,有助于優(yōu)化陳列館的運營效率。
通過合理的硬件選型和智能化軟件設(shè)計,本系統(tǒng)展示了物聯(lián)網(wǎng)技術(shù)在文化遺產(chǎn)保護領(lǐng)域的巨大潛力。未來,隨著技術(shù)的不斷發(fā)展,系統(tǒng)的功能和應(yīng)用場景也有望得到進一步擴展和優(yōu)化,為更多公共設(shè)施和文化場館的智能化管理提供借鑒和支持。
審核編輯 黃宇
-
lcd
+關(guān)注
關(guān)注
34文章
4436瀏覽量
167930 -
物聯(lián)網(wǎng)
+關(guān)注
關(guān)注
2911文章
44824瀏覽量
375079 -
監(jiān)控系統(tǒng)
+關(guān)注
關(guān)注
21文章
3938瀏覽量
175727 -
IOT
+關(guān)注
關(guān)注
187文章
4222瀏覽量
197170
發(fā)布評論請先 登錄
相關(guān)推薦
評論