0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于物聯(lián)網(wǎng)技術(shù)設(shè)計的陳列館監(jiān)控系統(tǒng)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2025-01-15 09:29 ? 次閱讀

一、前言

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)試

image-20241128010712364

下面是陳列館的內(nèi)部實景一角。

image-20241128010410622

image-20241128010426102

image-20241128010352987

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)界面的。

image-20221210225339928

【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)緊湊,擁有直觀的工具和庫。

image-20230218001243591

image-20230218001219105

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

image-20220611130453218

每天9:30開搶,每天限量100份,這個頁面不僅有云服務(wù)器可以領(lǐng)取試用,還有云數(shù)據(jù)庫、沙盒等其他產(chǎn)品。

image-20220611130511064

image-20220611130612334

我這里領(lǐng)取了 2核4G S6云服務(wù)器,這個服務(wù)器是配套華為自研25GE智能高速網(wǎng)卡,適用于網(wǎng)站和Web應(yīng)用等中輕載企業(yè)應(yīng)用。

image-20220611130700250

選擇配置的時候發(fā)現(xiàn)S6規(guī)格的已經(jīng)沒有了,來晚了。

image-20220611130956075

S6規(guī)格沒有了,就選擇了S3,2核,4GB的配置結(jié)算。

image-20220611131022494

頁面向下翻,下面選擇系統(tǒng)預(yù)裝的系統(tǒng),我這里選擇ubuntu 20.04,安裝NGINX,來搭建流媒體服務(wù)器。

image-20220611131123954

頁面繼續(xù)下翻,設(shè)置云服務(wù)器名稱,設(shè)置系統(tǒng)的root密碼。

image-20220611131148126

接著就可以繼續(xù)去支付了。

image-20220611131218881

image-20220611131250941

image-20220611131306457

購買后等待一段時間,系統(tǒng)資源就即可分配完成。

image-20220611141408922

2.2 登錄云服務(wù)器

云服務(wù)器的管理控制臺從這里進入: https://www.huaweicloud.com/product/ecs.html

在官網(wǎng)主頁,點擊產(chǎn)品,找到計算選項,就可以看到彈性云服務(wù)器ECS,點擊進去就可以看到管理控制臺的選項。

image-20220611151527835

image-20220611151444306

彈性云服務(wù)器的選項頁面可以看到剛才購買的云服務(wù)器,如果點擊進去提示該區(qū)域沒有可用的服務(wù)器,說明區(qū)域選擇的不對,在下面截圖紅色框框的位置可以看到可用的區(qū)域切換按鈕,切換之后就行了。

image-20220611151650793

點擊服務(wù)器右邊的更多,可以對服務(wù)器重裝系統(tǒng)、切換操作系統(tǒng)、關(guān)機、開機、重啟、重置密碼等操作。

image-20220611151918159

接下來先點擊登錄,了解一下登錄的流程,看看系統(tǒng)進去的效果。

image-20220611152037313

云服務(wù)器支持SSH協(xié)議遠(yuǎn)程登錄,可以在瀏覽器上直接使用CloudShell方式或者VNC方式登錄,如果本身你自己也是使用Linux系統(tǒng),可以在Linux系統(tǒng)里通過ssh命令直接登錄,如果是在windows下可以使用SecureCRT登錄。

image-20220611160601965

其他登錄方式。

image-20220611152254866

最方便的登錄方式,直接在控制臺使用VNC在瀏覽器里登錄,點擊立即登錄。

image-20220611152727005

根據(jù)提示輸入用戶名,密碼后,按下回車鍵即可登錄。

用戶名直接輸入root,密碼就是剛才配置云服務(wù)器時,填入的root密碼。

注意: Linux下輸入密碼默認(rèn)都是隱藏的,也就是在鍵盤上輸入密碼界面上是不會有反應(yīng)的,自己按照正確的密碼輸入即可。

image-20220611152929951

用戶名、密碼輸入正確后,登錄成功。

可以點擊全屏模式,更好的操作。

image-20220611153239527

2.3 使用CloudShell登錄云服務(wù)器

在頁面上直接點擊CloudShell登錄按鈕。CloudShell方式比VNC方式方便、流暢多了,也支持命令的復(fù)制粘貼。

image-20220611160821704

image-20220611160729806

輸入密碼點擊連接。

image-20220611160944543

登錄成功進入終端。

image-20220611161046853

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)。

image-20220611155915095

根據(jù)界面上的引導(dǎo)流程,切換即可。更換新的系統(tǒng)需要1~4分鐘時間,稍微等待一下即可。

image-20220611160010714

如果要使用遠(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 `登錄的流程。

image-20220611160216821

選擇新建會話。

image-20220611161730570

選擇SSH2協(xié)議。

image-20220611161757991

主機名就填服務(wù)器的公網(wǎng)IP地址,端口號默認(rèn)是22,用戶名填root。

image-20220611161831158

自己云服務(wù)器的公網(wǎng)IP地址,在控制臺可以看到。

image-20220611161945275

軟件點擊下一步之后,可以填充描述信息,備注這個鏈接是干什么的。

image-20220611162046191

選擇剛才新建的協(xié)議端口點擊連接。

image-20220611162148248

云服務(wù)器連接上之后,軟件界面會彈出對話框填充用戶名、密碼。

image-20220611162228021

登錄成功的效果如下。

image-20220611162246059

軟件可以配置一些選項,讓界面符合Linux終端配色,可以修改字體大小、字體編碼等等。

image-20220611162407116

image-20220611162522751

配置后的效果。

image-20220611162543936

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)

image-20220611182221690

配置文件里參數(shù)的含義:

image-20220611180438643

image-20220611180457992

image-20220611180909866

image-20220611180933623

(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地址都開放出來了。

image-20220611185514553

image-20220611185254027

image-20220611185204400

**(7)本地客戶機掛載服務(wù)器測試 **

掛載指令:

sudo mount -t nfs -o nolock 122.112.212.171:/home/work /home/wbyq/mnt/

image-20220611185744008

2.6 安裝NGINX(配置RTMP服務(wù))

(1)下載編譯時需要依賴的一些工具

root@ecs-348470:~# sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

image-20220611170102729

(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

image-20220611190538685

(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

image-20220611190905353

(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

軟件運行效果:

image-20220611200146361

推流工具運行過程中效果。

image-20220611200428359

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ù)器地址之后就可以拉取流進行播放。

image-20220611201255709

點擊獲取回放列表,可以查看服務(wù)器上保存的歷史視頻回放播放。

image-20220611201443927

2.9 配置監(jiān)控攝像頭

第一次使用攝像頭,先使用網(wǎng)線將攝像頭連接到家里路由器上,然后登錄攝像頭管理頁面配置攝像頭。

image-20230411233724527

在攝像頭上面有一個碼,掃描之后就能看到使用辦法。里面有一個軟件下載下來,可以搜索攝像頭IP。

詳細(xì)過程看這里:https://www.showdoc.com.cn/sqIPC/7929920934644196

image-20230411233734467

image-20230411194134120

image-20230411225159176

設(shè)置攝像頭動態(tài)獲取IP(非常重要)

image-20241119222708176

攝像頭用戶名是admin 密碼是12345

image-20230411232434825

登錄成功。

image-20230411232546826

設(shè)置參數(shù):

image-20230411233101900

設(shè)置攝像頭連接的WIFI:

image-20230411232939592

**推流地址:**rtmp://111.160.79.93/live/video158

image-20230411233029013

設(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

image-20221204193824815

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ù)場景。

img

3.2 開通物聯(lián)網(wǎng)服務(wù)

地址: https://www.huaweicloud.com/product/iothub.html

image-20241028135834377

開通免費單元。

image-20241028135935457

點擊立即創(chuàng)建。

image-20240117134653452

正在創(chuàng)建標(biāo)準(zhǔn)版實例,需要等待片刻。

image-20241028140048811

創(chuàng)建完成之后,點擊詳情。 可以看到標(biāo)準(zhǔn)版實例的設(shè)備接入端口和地址。

image-20241028140129102

下面框起來的就是端口號域名

image-20241028140229696

點擊實例名稱,可以查看當(dāng)前免費單元的配置情況。

image-20241028140331523

image-20241028140428663

開通之后,點擊接入信息,也能查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺,這里可以看到MQTT協(xié)議的地址和端口號等信息。

image-20241028140511105

總結(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)品

image-20241028141601305

(2)填寫產(chǎn)品信息

根據(jù)自己產(chǎn)品名字填寫,下面的設(shè)備類型選擇自定義類型。

image-20240612094809689

(3)產(chǎn)品創(chuàng)建成功

image-20240612095148945

創(chuàng)建完成之后點擊查看詳情。

image-20240612095134263

(4)添加自定義模型

產(chǎn)品創(chuàng)建完成之后,點擊進入產(chǎn)品詳情頁面,翻到最下面可以看到模型定義。

模型簡單來說: 就是存放設(shè)備上傳到云平臺的數(shù)據(jù)。

你可以根據(jù)自己的產(chǎn)品進行創(chuàng)建。

比如:

煙霧可以叫  MQ2
溫度可以叫  Temperature
濕度可以叫  humidity
火焰可以叫  flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設(shè)備端上傳到服務(wù)器的數(shù)據(jù)名字。

先點擊自定義模型。

image-20240612095517900

再創(chuàng)建一個服務(wù)ID。

image-20240612095542749

接著點擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設(shè)備

產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實際的設(shè)備。添加的設(shè)備最終需要與真實的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。

(1)注冊設(shè)備

image-20240425181935561

(2)根據(jù)自己的設(shè)備填寫

image-20240612100115167

(3)保存設(shè)備信息

創(chuàng)建完畢之后,點擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時候需要使用。

image-20240612100128061

(4)設(shè)備創(chuàng)建完成

image-20240612100147232

(5)設(shè)備詳情

image-20240612100202960

image-20240612100217236

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

img

業(yè)務(wù)流程:

img

(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

image-20221207153310037

對于設(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

image-20221207153637391

根據(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

image-20240509193207359

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

image-20240425182610048

(2)生成MQTT三元組

華為云提供了一個在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/

打開這個工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。

下面是打開的頁面:

image-20240425183025893

填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)

直接得到三元組信息。

image-20240509193310020

得到三元組之后,設(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ā)布主題。

image-20240509193457358

(2)打開網(wǎng)頁查看

完成上面的操作之后,打開華為云網(wǎng)頁后臺,可以看到設(shè)備已經(jīng)在線了。

image-20240612100508790

點擊詳情頁面,可以看到上傳的數(shù)據(jù):

image-20240612100529581

到此,云平臺的部署已經(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】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證

image-20240509193646253

image-20240509193701262

項目憑證:

28add376c01e4a61ac8b621c714bf459

【2】創(chuàng)建IAM用戶

鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證。

image-20240509193729078

點擊左上角創(chuàng)建用戶。

image-20240509193744287

image-20240314153208692

image-20240314153228359

image-20240314153258229

創(chuàng)建成功:

image-20240314153315444

【3】創(chuàng)建完成

image-20240509193828289

用戶信息如下:

主用戶名  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ù)。

image-20240509194152229

設(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ā)。

image-20240509194214716

鏈接如下:

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/image-20221207160550486

image-20221207160606892

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ù)安裝。

image-20221203151742653

選擇編譯器: (一定要看清楚了)

image-20241028152725134

前面2講解了需要用的API接口,接下來就使用Qt設(shè)計上位機,設(shè)計界面,完成整體上位機的邏輯設(shè)計。

【1】新建工程

image-20240117144052547

【2】設(shè)置項目的名稱。

image-20241112142627805

【3】選擇編譯系統(tǒng)

image-20240117144239681

【4】選擇默認(rèn)繼承的類

image-20240117144302275

【5】選擇編譯器

image-20241028153603487

【6】點擊完成

image-20240117144354252

【7】工程創(chuàng)建完成

image-20241112142836874

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下運行的程序。

image-20241112142912481

5.4 編譯測試功能

創(chuàng)建完畢之后,編譯測試一下功能是否OK。

點擊左下角的綠色三角形按鈕

正常運行就可以看到彈出一個白色的框框。這就表示工程環(huán)境沒有問題了。 接下來就可以放心的設(shè)計界面了。

image-20241112142939735

5.5 設(shè)計UI界面與工程配置

【1】打開UI文件

image-20241112143019233

打開默認(rèn)的界面如下:

image-20240425194845233

【2】開始設(shè)計界面

根據(jù)自己需求設(shè)計界面。

5.5 編譯Windows上位機

點擊軟件左下角的綠色三角形按鈕進行編譯運行。

image-20241112153656462

5.6 配置Android環(huán)境

如果想編譯Android手機APP,必須要先自己配置好自己的Android環(huán)境。(搭建環(huán)境的過程可以自行百度搜索學(xué)習(xí))

然后才可以進行下面的步驟。

【1】選擇Android編譯器

選擇編譯器。

image-20240425232651515

切換編譯器。

image-20241112153812833

【2】創(chuàng)建Android配置文件

image-20240117144604025

image-20240117144635052

image-20240117144652014

創(chuàng)建完成。

image-20241112153851571

【3】配置Android圖標(biāo)與名稱

image-20241113114730689

【3】編譯Android上位機

Qt本身是跨平臺的,直接選擇Android的編譯器,就可以將程序編譯到Android平臺。

然后點擊構(gòu)建。

image-20241112154026342

成功之后,在目錄下可以看到生成的apk文件,也就是Android手機的安裝包,電腦端使用QQ發(fā)送給手機QQ,手機登錄QQ接收,就能直接安裝。

生成的apk的目錄在哪里呢? 編譯完成之后,在控制臺會輸出APK文件的路徑。

知道目錄在哪里之后,在Windows的文件資源管理器里,找到路徑,具體看下圖,找到生成的apk文件。

image-20241112154142209

-- 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è)施和文化場館的智能化管理提供借鑒和支持。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • lcd
    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)注

    21

    文章

    3938

    瀏覽量

    175727
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    187

    文章

    4222

    瀏覽量

    197170
收藏 人收藏

    評論

    相關(guān)推薦

    基于聯(lián)網(wǎng)技術(shù)的路燈監(jiān)控系統(tǒng)解決方案

    安科瑞楊婷婷→18702111592 概述 由于我國智慧城市建設(shè)的快速發(fā)展,傳統(tǒng)的路燈系統(tǒng)存在缺少遠(yuǎn)程控制手段、電能浪費、故障處理不及時等問題,本文提出一種基于聯(lián)網(wǎng)技術(shù)的路燈監(jiān)控
    的頭像 發(fā)表于 12-18 14:15 ?226次閱讀
    基于<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>的路燈<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>解決方案

    安科瑞基于聯(lián)網(wǎng)技術(shù)的路燈監(jiān)控系統(tǒng)的設(shè)計

    安科瑞徐赟杰 18706165067 0摘要 由于我國智慧城市建設(shè)的快速發(fā)展,傳統(tǒng)的路燈系統(tǒng)存在缺少遠(yuǎn)程控制手段、電能浪費、故障處理不及時等問題,本文提出一種基于聯(lián)網(wǎng)技術(shù)的路燈監(jiān)控
    的頭像 發(fā)表于 12-17 08:54 ?143次閱讀
    安科瑞基于<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>的路燈<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>的設(shè)計

    什么是聯(lián)網(wǎng)技術(shù)

    夠?qū)A康?b class='flag-5'>物聯(lián)網(wǎng)數(shù)據(jù)進行整合、分析和挖掘,提取有價值的信息。 應(yīng)用層:是聯(lián)網(wǎng)技術(shù)的最終體現(xiàn),直接面向用戶和具體的應(yīng)用場景。包括各類
    發(fā)表于 08-19 14:08

    聯(lián)網(wǎng)技術(shù)在軍事領(lǐng)域的應(yīng)用有哪些

    智慧華盛恒輝聯(lián)網(wǎng)技術(shù)在軍事領(lǐng)域的應(yīng)用廣泛而深入,以下是清晰分點表示和歸納的聯(lián)網(wǎng)技術(shù)在軍事領(lǐng)域的主要應(yīng)用: 一、智慧華盛恒輝戰(zhàn)場感知與監(jiān)控
    的頭像 發(fā)表于 06-23 10:35 ?1783次閱讀

    淺談聯(lián)網(wǎng)技術(shù)的電氣火災(zāi)智能監(jiān)控系統(tǒng)平臺設(shè)計

    淺談聯(lián)網(wǎng)技術(shù)的電氣火災(zāi)智能監(jiān)控系統(tǒng)平臺設(shè)計 張穎姣 安科瑞電氣股份有限公司 上海嘉定 201801 摘要:為了提高電氣火災(zāi)監(jiān)控效果,該文設(shè)
    的頭像 發(fā)表于 04-11 16:35 ?449次閱讀
    淺談<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>的電氣火災(zāi)智能<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>平臺設(shè)計

    智慧油站系統(tǒng)聯(lián)網(wǎng)技術(shù)方案

    智慧油站系統(tǒng)聯(lián)網(wǎng)技術(shù)方案 智慧油站遠(yuǎn)程監(jiān)控云平臺是聯(lián)網(wǎng)技術(shù)在石油能源行業(yè)的深度應(yīng)用,通過集
    的頭像 發(fā)表于 03-29 11:15 ?710次閱讀
    智慧油站<b class='flag-5'>系統(tǒng)</b>的<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>方案

    智慧農(nóng)業(yè)聯(lián)網(wǎng)系統(tǒng)聯(lián)網(wǎng)技術(shù)

      JD-Q3智慧農(nóng)業(yè)聯(lián)網(wǎng)系統(tǒng)是指應(yīng)用聯(lián)網(wǎng)技術(shù)和智能化設(shè)備,實現(xiàn)對農(nóng)田、作物、牲畜等農(nóng)業(yè)生產(chǎn)環(huán)節(jié)進行實時監(jiān)測、數(shù)據(jù)采集和智能化管理的
    的頭像 發(fā)表于 03-21 16:37 ?1606次閱讀

    電梯聯(lián)網(wǎng)技術(shù)如何解決電梯管理的痛點?

    隨著聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,電梯行業(yè)也迎來了新的變革。電梯聯(lián)網(wǎng)技術(shù)的應(yīng)用為電梯管理帶來了許多新的機遇和優(yōu)勢,同時也有效地解決了傳統(tǒng)電梯管理中存在的各種痛點。 本文梯云
    的頭像 發(fā)表于 03-19 10:09 ?561次閱讀

    聯(lián)網(wǎng)技術(shù)在農(nóng)藥化肥行業(yè)的遠(yuǎn)程監(jiān)控解決方案

    聯(lián)網(wǎng)技術(shù)在農(nóng)藥化肥行業(yè)的遠(yuǎn)程監(jiān)控解決方案 隨著聯(lián)網(wǎng)技術(shù)的日益成熟,其在農(nóng)藥化肥行業(yè)的應(yīng)用呈現(xiàn)出廣闊的前景。通過
    的頭像 發(fā)表于 03-15 15:06 ?478次閱讀
    <b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>在農(nóng)藥化肥行業(yè)的遠(yuǎn)程<b class='flag-5'>監(jiān)控</b>解決方案

    聯(lián)網(wǎng)技術(shù)在煤炭化工行業(yè)的遠(yuǎn)程監(jiān)控解決方案

    聯(lián)網(wǎng)技術(shù)在煤炭化工行業(yè)的遠(yuǎn)程監(jiān)控解決方案 隨著科技的飛速發(fā)展,聯(lián)網(wǎng)技術(shù)正在為煤炭化工行業(yè)帶來一場深刻的變革。
    的頭像 發(fā)表于 03-14 17:21 ?704次閱讀
    <b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>在煤炭化工行業(yè)的遠(yuǎn)程<b class='flag-5'>監(jiān)控</b>解決方案

    淺談聯(lián)網(wǎng)技術(shù)在分布式光伏電站監(jiān)控系統(tǒng)中的應(yīng)用

    淺談聯(lián)網(wǎng)技術(shù)在分布式光伏電站監(jiān)控系統(tǒng)中的應(yīng)用 張穎姣 江蘇安科瑞電器制造有限公司 江蘇江陰 214405 摘要:為了順應(yīng)我國目前的光伏產(chǎn)業(yè)高質(zhì)量發(fā)展形勢,在提升光伏發(fā)電
    的頭像 發(fā)表于 03-13 10:41 ?1059次閱讀
    淺談<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>在分布式光伏電站<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>中的應(yīng)用

    淺談無線聯(lián)網(wǎng)技術(shù)的電氣火災(zāi)監(jiān)控系統(tǒng)設(shè)計

    淺談無線聯(lián)網(wǎng)技術(shù)的電氣火災(zāi)監(jiān)控系統(tǒng)設(shè)計 張穎姣 安科瑞電氣股份有限公司?上海嘉定 201801 摘要:電氣故障是引起火災(zāi)的重要原因。由于傳統(tǒng)的火災(zāi)報警器都是獨立存在的,不僅沒有組網(wǎng),
    的頭像 發(fā)表于 03-12 11:03 ?436次閱讀
    淺談無線<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>的電氣火災(zāi)<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>設(shè)計

    打樁機遠(yuǎn)程監(jiān)控運維聯(lián)網(wǎng)系統(tǒng)

    通博聯(lián)推出的打樁機遠(yuǎn)程監(jiān)控運維聯(lián)網(wǎng)系統(tǒng)是一套集成了聯(lián)
    的頭像 發(fā)表于 03-06 14:00 ?507次閱讀
    打樁機遠(yuǎn)程<b class='flag-5'>監(jiān)控</b>運維<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b><b class='flag-5'>系統(tǒng)</b>

    淺談基于聯(lián)網(wǎng)技術(shù)的隧道配電房智能監(jiān)控管理系統(tǒng)設(shè)計

    淺談基于聯(lián)網(wǎng)技術(shù)的隧道配電房智能監(jiān)控管理系統(tǒng)設(shè)計 張穎姣 安科瑞電氣股份有限公司 上海嘉定 201801 摘要:針對高速公路隧道配電房管理現(xiàn)狀,利用
    的頭像 發(fā)表于 02-19 14:14 ?539次閱讀
    淺談基于<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)技術(shù)</b>的隧道配電房智能<b class='flag-5'>監(jiān)控</b>管理<b class='flag-5'>系統(tǒng)</b>設(shè)計

    水質(zhì)凈化廠聯(lián)網(wǎng)遠(yuǎn)程監(jiān)控系統(tǒng)解決方案

    水質(zhì)凈化廠聯(lián)網(wǎng)遠(yuǎn)程監(jiān)控系統(tǒng)解決方案 隨著科技的不斷發(fā)展,聯(lián)網(wǎng)技術(shù)逐漸走進我們的生活。在水質(zhì)凈
    的頭像 發(fā)表于 01-17 15:19 ?546次閱讀
    水質(zhì)凈化廠<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>遠(yuǎn)程<b class='flag-5'>監(jiān)控</b><b class='flag-5'>系統(tǒng)</b>解決方案