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