一、前言
1.1 項目開發(fā)背景
隨著全球經(jīng)濟的發(fā)展和物流行業(yè)的不斷創(chuàng)新,疫苗和生物制品的運輸要求變得越來越高。尤其是疫苗的冷鏈物流,溫度、濕度等環(huán)境因素的控制直接關系到疫苗的質量和效力,因此高效、可靠的冷鏈監(jiān)控系統(tǒng)顯得尤為重要。冷鏈物流系統(tǒng)通常用于保持藥品、食品等易腐物品的穩(wěn)定運輸環(huán)境,對于疫苗的運輸尤為關鍵,因為不當?shù)臏貪穸茸兓赡軐е乱呙缡В瑥亩绊懝娊】怠?/p>
傳統(tǒng)的冷鏈物流監(jiān)測方法主要依賴人工記錄和定期檢查,這不僅增加了人工成本,還存在檢測盲區(qū)和延時問題。為了應對這一挑戰(zhàn),物聯(lián)網(wǎng)技術為冷鏈物流提供了更加精準、實時的數(shù)據(jù)監(jiān)控手段。通過傳感器技術和無線通信,物流過程中每一環(huán)節(jié)的環(huán)境數(shù)據(jù)都能夠實時采集并上傳至云平臺,進行遠程監(jiān)控和控制。這種高效的信息化管理方式,不僅能夠提高疫苗運輸過程中的安全性,還能提升物流管理效率,減少人為疏忽和延誤。
本項目設計一個基于物聯(lián)網(wǎng)的疫苗冷鏈物流監(jiān)測系統(tǒng),采用溫濕度傳感器、震動傳感器、GPS定位模塊等硬件設備,結合STM32F103RCT6主控芯片、4G通信模塊、云平臺等技術,打造一個實時監(jiān)測、自動控制和遠程管理的系統(tǒng)。該系統(tǒng)能夠自動監(jiān)測和調(diào)節(jié)運輸過程中的溫度、濕度,并及時報警提醒駕駛員,確保疫苗在運輸過程中的質量和安全。同時,系統(tǒng)支持通過手機APP和后端服務器進行數(shù)據(jù)查看和歷史數(shù)據(jù)分析,進一步增強了系統(tǒng)的可靠性和智能化水平。
隨著全球冷鏈物流需求的日益增加,尤其是在疫苗運輸領域,創(chuàng)新的物聯(lián)網(wǎng)冷鏈監(jiān)測解決方案成為了保障公共健康的重要工具。通過將物聯(lián)網(wǎng)技術與傳統(tǒng)冷鏈物流管理相結合,可以實現(xiàn)實時數(shù)據(jù)采集、遠程控制和智能化管理,為疫苗冷鏈物流提供全方位、無死角的保障。這對于提升疫苗運輸?shù)目煽啃院托剩档鸵呙缋速M和風險,具有重要的現(xiàn)實意義和廣泛的應用前景。
1.2 設計實現(xiàn)的功能
(1)溫度監(jiān)測與控制
通過溫度傳感器實時采集運輸環(huán)境中的溫度數(shù)據(jù)。當檢測到溫度超過預設的安全閾值時,系統(tǒng)自動啟動制冷風機進行降溫,確保運輸環(huán)境保持在疫苗所需的適宜溫度范圍內(nèi)。
(2)濕度監(jiān)測與控制
通過濕度傳感器實時采集運輸環(huán)境中的濕度數(shù)據(jù)。當濕度值低于設定的正常范圍時,系統(tǒng)自動啟用加濕器進行加濕,保證運輸環(huán)境的濕度符合疫苗運輸要求。
(3)震動監(jiān)測與警報
系統(tǒng)集成震動傳感器,實時監(jiān)測運輸過程中可能出現(xiàn)的震動情況。當震動強度超出設定值時,系統(tǒng)會通過蜂鳴器發(fā)出警報,提醒駕駛員注意行駛中的震動情況,并采取必要的減速或避免劇烈顛簸。
(4)溫濕度值設置與調(diào)節(jié)
通過硬件按鍵,用戶可以手動設置溫度和濕度的安全閾值。當運輸過程中溫度或濕度變化超過設定范圍時,系統(tǒng)會啟動自動調(diào)節(jié)機制。
(5)環(huán)境數(shù)據(jù)實時顯示
系統(tǒng)配備小尺寸的1.44寸顯示屏,實時顯示當前運輸環(huán)境的溫度、濕度和震動等重要數(shù)據(jù)。駕駛員可以直觀地了解運輸環(huán)境的當前狀態(tài)。
(6)無線數(shù)據(jù)傳輸與遠程監(jiān)控
采用4G模塊將傳感器采集的實時數(shù)據(jù)無線傳輸到云平臺,并通過手機APP進行遠程監(jiān)控。用戶可以在APP端查看當前溫濕度數(shù)據(jù),及時獲取運輸環(huán)境的狀態(tài)信息,確保運輸過程中的數(shù)據(jù)透明和可控。
(7)歷史數(shù)據(jù)存儲與查詢
通過云平臺保存?zhèn)鞲衅鞑杉臍v史數(shù)據(jù)。用戶可以通過手機APP或后端服務器查詢歷史數(shù)據(jù),進行數(shù)據(jù)分析和趨勢預測,從而優(yōu)化運輸過程中的環(huán)境管理。
(8)GPS定位與實時跟蹤
系統(tǒng)集成GPS模塊,實時跟蹤運輸車輛的位置,獲取車輛的經(jīng)緯度信息,并將位置數(shù)據(jù)上傳至云平臺。用戶通過手機APP可以實時查看車輛的當前位置,確保運輸過程的可追溯性。
(9)數(shù)據(jù)上云與平臺管理
系統(tǒng)支持將采集的數(shù)據(jù)通過4G模塊上傳到華為云物聯(lián)網(wǎng)平臺,實現(xiàn)數(shù)據(jù)存儲和管理。云平臺可以展示實時數(shù)據(jù),并支持歷史數(shù)據(jù)分析與可視化展示,幫助管理人員全面監(jiān)控冷鏈運輸過程。
(10)后端服務器與可視化網(wǎng)頁
系統(tǒng)搭建Python后端服務器,接收來自云平臺的數(shù)據(jù),并設計HTML前端頁面進行展示。用戶可以通過電腦或手機瀏覽器查看環(huán)境數(shù)據(jù),進行實時控制和歷史數(shù)據(jù)查詢,支持局域網(wǎng)和公網(wǎng)訪問。
(11)系統(tǒng)報警與異常處理
當溫度、濕度或震動等環(huán)境指標異常時,系統(tǒng)會自動觸發(fā)報警機制,通過蜂鳴器、APP通知等方式提醒駕駛員或管理人員采取適當?shù)奶幚泶胧?,防止疫苗運輸過程中發(fā)生質量問題。
(12)自動化控制與人工干預
在正常運輸過程中,系統(tǒng)會根據(jù)實時數(shù)據(jù)自動調(diào)節(jié)溫濕度和震動狀態(tài)。如果出現(xiàn)無法自動解決的問題,駕駛員或管理人員可通過APP手動控制設備(如風機、加濕器等)進行調(diào)整,確保運輸環(huán)境始終符合要求。
1.3 項目硬件模塊組成
(1)主控芯片(STM32F103RCT6)
STM32F103RCT6作為項目的核心控制單元,負責所有傳感器數(shù)據(jù)的采集、處理和控制命令的執(zhí)行。它通過與各個外部模塊的通信,協(xié)調(diào)各個子系統(tǒng)的工作,確保整個系統(tǒng)的正常運行。
(2)溫濕度傳感器(SHT30)
SHT30傳感器用于實時采集運輸環(huán)境中的溫度和濕度數(shù)據(jù),并將其傳輸至主控芯片。該傳感器具有高精度和穩(wěn)定性,適用于需要精確環(huán)境監(jiān)控的冷鏈物流系統(tǒng)。
(3)震動傳感器
震動傳感器用于監(jiān)測運輸過程中的震動情況,當震動超過設定閾值時,系統(tǒng)會發(fā)出警報,提醒駕駛員注意行駛狀態(tài)。它能有效避免運輸中的劇烈顛簸對疫苗質量造成影響。
(4)4G通信模塊(Air724UG)
Air724UG 4G模塊用于實現(xiàn)數(shù)據(jù)的無線傳輸,將傳感器采集的數(shù)據(jù)上傳至云平臺。通過4G模塊,系統(tǒng)能夠隨時進行遠程監(jiān)控和控制,確保冷鏈運輸?shù)膶崟r數(shù)據(jù)不間斷傳輸。
(5)GPS定位模塊(中科微ATGM336H-GPS模塊)
GPS模塊用于實時獲取運輸車輛的位置數(shù)據(jù),并將經(jīng)緯度信息上傳至云平臺。通過GPS定位,用戶可以隨時查看車輛的實時位置,確保運輸過程的可追溯性。
(6)顯示屏(1.44寸顯示屏)
1.44寸小尺寸顯示屏用于實時顯示運輸環(huán)境的關鍵數(shù)據(jù),如溫度、濕度、震動狀態(tài)等。它為駕駛員提供了一個直觀的界面,便于在駕駛過程中隨時查看運輸環(huán)境的狀態(tài)。
(7)蜂鳴器
蜂鳴器用于在發(fā)生異常情況時發(fā)出聲音警報。通過蜂鳴器,系統(tǒng)能夠在溫度、濕度或震動等環(huán)境數(shù)據(jù)異常時及時提醒駕駛員采取措施,從而確保疫苗運輸?shù)陌踩浴?/p>
(8)加濕器
加濕器用于自動調(diào)節(jié)運輸環(huán)境的濕度。當濕度值低于設定值時,加濕器會自動啟用,確保運輸環(huán)境始終維持在適宜的濕度范圍,避免濕度過低影響疫苗質量。
(9)制冷風機
制冷風機用于自動調(diào)節(jié)運輸環(huán)境的溫度。當檢測到溫度超出設定的安全范圍時,風機會自動啟動進行降溫,以確保運輸過程中疫苗存儲在適宜的低溫環(huán)境中。
(10)按鍵模塊
按鍵模塊用于手動設置溫度、濕度等環(huán)境參數(shù)的閾值。用戶可以通過按鍵方便地調(diào)節(jié)和設定監(jiān)控的標準值,以適應不同類型疫苗的運輸需求。
(11)電源模塊
電源模塊為整個系統(tǒng)提供穩(wěn)定的電力支持。它需要支持4G模塊、傳感器、蜂鳴器等各個硬件設備的功耗需求,并確保系統(tǒng)在運輸過程中的持續(xù)穩(wěn)定運行。
(12)傳感器接口電路
傳感器接口電路用于連接各類傳感器(溫濕度傳感器、震動傳感器等)與主控芯片。它們提供電氣連接和數(shù)據(jù)傳輸通道,確保數(shù)據(jù)從傳感器正確、及時地傳送至主控芯片進行處理。
(13)云平臺通信模塊(MQTT協(xié)議)
云平臺通信模塊用于通過MQTT協(xié)議將數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺,實現(xiàn)實時監(jiān)控、數(shù)據(jù)存儲和歷史數(shù)據(jù)分析。該模塊支持與后端服務器的通信,確保數(shù)據(jù)的遠程傳輸與訪問。
1.4 設計思路
本項目的設計思路主要圍繞如何實現(xiàn)疫苗運輸過程中的環(huán)境監(jiān)控與控制,確保疫苗在運輸過程中的溫濕度、震動等關鍵因素始終處于安全范圍內(nèi),最大程度地保證疫苗的質量和效力。設計思路分為硬件選擇、數(shù)據(jù)采集與處理、控制策略、無線通信與遠程監(jiān)控等幾個主要部分。
在硬件選擇上,本項目采用了STM32F103RCT6主控芯片作為核心控制單元,具備較強的處理能力和豐富的外設接口,能夠高效地完成各類傳感器的數(shù)據(jù)采集和控制指令的執(zhí)行。為了精準監(jiān)測運輸環(huán)境中的溫濕度情況,選擇了SHT30溫濕度傳感器,該傳感器具有高精度、低功耗、響應速度快等特點,適合用于對冷鏈物流過程中的環(huán)境進行精細監(jiān)控。對于震動檢測,選用了震動傳感器,能夠實時捕捉到運輸中的震動狀態(tài),尤其在運輸過程中發(fā)生劇烈震動時,系統(tǒng)將立即觸發(fā)報警機制。此外,4G通信模塊Air724UG用于實現(xiàn)數(shù)據(jù)的遠程無線傳輸,而GPS模塊則能夠為系統(tǒng)提供實時的位置信息,便于追蹤車輛的具體位置。
數(shù)據(jù)采集和處理是系統(tǒng)設計中的核心部分。通過各類傳感器采集溫度、濕度、震動等環(huán)境數(shù)據(jù)后,主控芯片STM32將負責對這些數(shù)據(jù)進行實時處理和分析。一旦發(fā)現(xiàn)環(huán)境數(shù)據(jù)超出設定的安全范圍,系統(tǒng)會根據(jù)設定的控制策略做出響應。例如,當溫度過高時,系統(tǒng)會自動啟動制冷風機進行降溫;當濕度過低時,加濕器會自動啟用,補充環(huán)境濕度;當震動過于劇烈時,蜂鳴器會發(fā)出警報,提醒駕駛員注意行駛情況。通過這樣的實時控制,系統(tǒng)可以確保疫苗運輸過程中的環(huán)境始終處于安全狀態(tài)。
為了實現(xiàn)遠程監(jiān)控和管理,系統(tǒng)采用了4G模塊與華為云物聯(lián)網(wǎng)平臺進行數(shù)據(jù)交互。通過MQTT協(xié)議,系統(tǒng)將實時數(shù)據(jù)上傳至云平臺,確保用戶可以通過手機APP或計算機終端遠程查看運輸環(huán)境的溫濕度、震動等數(shù)據(jù),并進行實時控制。用戶還可以通過云平臺查詢歷史數(shù)據(jù),進行趨勢分析和數(shù)據(jù)回溯,以便及時發(fā)現(xiàn)潛在的問題并進行調(diào)整。與此同時,云平臺與本地服務器之間的通信,確保了數(shù)據(jù)的高效存儲與展示。
系統(tǒng)還具備靈活的控制方式。駕駛員可以通過按鍵模塊手動設置和調(diào)整溫度、濕度等環(huán)境參數(shù)的閾值,適應不同類型疫苗的運輸需求。在自動模式下,系統(tǒng)能夠根據(jù)實時數(shù)據(jù)進行自動調(diào)節(jié);而在人工干預模式下,駕駛員或管理人員可以通過APP或顯示屏直接調(diào)整設備的工作狀態(tài)。
整個系統(tǒng)的設計充分考慮了其穩(wěn)定性、可靠性和易用性。所有的硬件模塊和軟件算法均經(jīng)過優(yōu)化,確保在復雜的運輸環(huán)境下能夠穩(wěn)定運行。此外,系統(tǒng)支持在不同的網(wǎng)絡環(huán)境下進行遠程訪問和控制,無論是在局域網(wǎng)還是公網(wǎng)環(huán)境下,都能夠保證數(shù)據(jù)的準確傳輸和實時監(jiān)控。
本項目的設計思路是在物聯(lián)網(wǎng)技術和嵌入式硬件的支持下,通過高精度傳感器和智能控制策略,實現(xiàn)對疫苗運輸過程的全面監(jiān)控與管理,確保疫苗冷鏈物流的安全、可靠與高效。
1.5 系統(tǒng)功能總結
功能模塊 | 功能描述 |
---|---|
溫度監(jiān)測與控制 | 實時監(jiān)測運輸環(huán)境中的溫度,當溫度超過設定值時,自動啟動制冷風機進行降溫。 |
濕度監(jiān)測與控制 | 實時監(jiān)測運輸環(huán)境中的濕度,當濕度低于設定值時,自動啟動加濕器進行加濕,保證環(huán)境濕度適宜。 |
震動監(jiān)測與報警 | 實時監(jiān)測運輸中的震動情況,當震動超出設定閾值時,通過蜂鳴器發(fā)出警報,提醒駕駛員減少震動。 |
溫濕度設置功能 | 通過按鍵模塊手動設置溫度和濕度的安全閾值,允許用戶根據(jù)不同需求進行調(diào)整。 |
環(huán)境數(shù)據(jù)實時顯示 | 在顯示屏上實時顯示溫度、濕度、震動等關鍵環(huán)境數(shù)據(jù),供駕駛員查看當前運輸環(huán)境的狀態(tài)。 |
無線數(shù)據(jù)傳輸 | 通過4G模塊將環(huán)境數(shù)據(jù)實時上傳至云平臺,支持手機APP和計算機端進行遠程監(jiān)控。 |
歷史數(shù)據(jù)查詢 | 支持通過云平臺保存和查詢歷史數(shù)據(jù),便于數(shù)據(jù)分析和運輸過程中環(huán)境趨勢的回溯。 |
GPS定位與追蹤 | 實時獲取車輛位置,顯示車輛的經(jīng)緯度信息,確保運輸過程的可追溯性,并支持通過云平臺實時查看車輛位置。 |
數(shù)據(jù)上云 | 將所有環(huán)境數(shù)據(jù)通過MQTT協(xié)議上傳至華為云物聯(lián)網(wǎng)平臺,實現(xiàn)數(shù)據(jù)存儲、展示和分析。 |
后臺數(shù)據(jù)展示 | 通過Python后端服務器,設計HTML前端頁面,將數(shù)據(jù)通過可視化網(wǎng)頁展示,支持電腦和手機瀏覽器訪問。 |
報警與異常處理 | 當溫度、濕度、震動等環(huán)境參數(shù)異常時,系統(tǒng)會發(fā)出聲音或APP通知報警,提醒駕駛員采取必要的處理措施。 |
手動與自動控制 | 系統(tǒng)支持自動控制模式,根據(jù)實時環(huán)境數(shù)據(jù)進行調(diào)整,也支持手動控制,允許駕駛員或管理人員進行干預調(diào)整。 |
1.6 開發(fā)工具的選擇
STM32的編程語言選擇C語言,C語言執(zhí)行效率高,C語言編譯出來的可執(zhí)行文件最接近于機器碼,匯編語言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機使用的較多,平常的單片機編程還是以C語言為主。C語言的執(zhí)行效率僅次于匯編,語法理解簡單、代碼通用性強,也支持跨平臺,在嵌入式底層、單片機編程里用的非常多,當前的設計就是采用C語言開發(fā)。
開發(fā)工具選擇Keil,keil是一家世界領先的嵌入式微控制器軟件開發(fā)商,在2015年,keil被ARM公司收購。因為當前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來開發(fā)STM32是有先天優(yōu)勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學,開發(fā)51單片機、STM32單片機等等。目前作為MCU芯片開發(fā)的軟件也不只是keil一家獨大,IAR在MCU微處理器開發(fā)領域里也使用的非常多,IAR擴展性更強,也支持STM32開發(fā),也支持其他芯片,比如:CC2530,51單片機的開發(fā)。從軟件的使用上來講,IAR比keil更加簡潔,功能相對少一些。如果之前使用過keil,而且使用頻率較多,已經(jīng)習慣再使用IAR是有點不適應界面的。
1.7 參考文獻
1.8 模塊的技術詳情介紹
【1】Air724UG-4G模塊
Air724UG是一款功能強大且廣泛應用于物聯(lián)網(wǎng)(IoT)領域的4G通信模塊。它專為低功耗廣域網(wǎng)(LPWAN)應用設計,兼具高性能和穩(wěn)定性,適用于多種物聯(lián)網(wǎng)終端設備,包括智能表計、移動支付、智能家居、車載電子等場景。該模塊支持4G LTE Cat 1網(wǎng)絡制式,是一款具備高性價比的無線通信解決方案。
Air724UG這款模塊支持LTE FDD網(wǎng)絡,能夠提供穩(wěn)定的語音和數(shù)據(jù)傳輸服務,并向下兼容2G GSM網(wǎng)絡,使得在4G信號弱或不可用的區(qū)域仍可正常通信。由于其雙網(wǎng)支持能力,這一模塊可以靈活適應不同的網(wǎng)絡環(huán)境,從而更廣泛地滿足客戶需求。
在數(shù)據(jù)通信方面,Air724UG模塊支持SMS(短消息服務)、TCP/UDP、HTTP/HTTPS、MQTT等協(xié)議,為用戶開發(fā)與應用提供了多種可選方案。其良好的傳輸能力,能夠滿足物聯(lián)網(wǎng)設備對數(shù)據(jù)可靠性、響應速度等方面的嚴苛需求。這使其在多種行業(yè)和領域中得到了廣泛應用,如工業(yè)自動化、智能物流、移動支付等。模塊具備高效的數(shù)據(jù)傳輸和低延遲特性,是許多物聯(lián)網(wǎng)解決方案中的理想選擇。
Air724UG模塊在設計上注重低功耗特性,這在許多長期依賴電池供電的IoT設備中顯得尤為重要。模塊支持深度睡眠模式和待機模式,有效降低功耗,延長設備的使用壽命。此外,Air724UG的尺寸較為緊湊,提供易于集成的設計,能夠在有限的空間內(nèi)實現(xiàn)靈活部署,適應各種復雜應用場景。
在接口和硬件配置方面,Air724UG-4G模塊集成了豐富的接口,包括UART、I2C、SPI、ADC、GPIO等,為用戶提供了極大的開發(fā)靈活性。此外,模塊還具備支持多種通信協(xié)議和功能的AT指令集,便于用戶進行功能擴展和定制。模塊的工作溫度范圍廣,能夠在嚴苛的環(huán)境下保持穩(wěn)定性能,使其在工業(yè)、戶外和其他環(huán)境條件變化較大的場景中表現(xiàn)出色。
綜合而言,Air724UG模塊是一款兼顧高性能與靈活性的4G模塊,專注于物聯(lián)網(wǎng)應用的低功耗和高穩(wěn)定性需求。它的多網(wǎng)絡支持、強大的數(shù)據(jù)傳輸能力、低功耗特性以及靈活的硬件接口設計,使其成為物聯(lián)網(wǎng)設備開發(fā)中備受青睞的選擇。
【2】MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協(xié)議)是一種輕量級、發(fā)布/訂閱模式的消息傳輸協(xié)議,專為低帶寬、不可靠網(wǎng)絡環(huán)境設計。它最早由IBM提出,現(xiàn)已成為物聯(lián)網(wǎng)(IoT)通信的重要協(xié)議之一。由于其高效、低功耗和實時性等特點,MQTT在智能家居、工業(yè)自動化、遠程監(jiān)控和車聯(lián)網(wǎng)等領域得到了廣泛應用。
MQTT的工作原理基于發(fā)布/訂閱模型。這種模型有別于傳統(tǒng)的客戶端-服務器模型,通信方不需要直接建立連接。MQTT由三個核心組件構成:客戶端、代理(Broker)和主題(Topic)??蛻舳丝梢宰鳛橄⒌陌l(fā)布者或訂閱者,消息通過代理進行路由。代理是一個中間服務端,用于接收和分發(fā)來自不同客戶端的消息。發(fā)布者發(fā)送消息到一個特定的主題上,代理負責將這些消息分發(fā)給所有訂閱了該主題的客戶端。通過這種解耦的架構設計,客戶端之間可以實現(xiàn)松耦合的通信,降低了復雜性和依賴性。
在MQTT協(xié)議中,消息被分為不同的主題(Topic),例如“home/sensor/temperature”可以用來代表溫度傳感器數(shù)據(jù)??蛻舳丝梢杂嗛嗊@個主題,當發(fā)布者發(fā)送新的數(shù)據(jù)到該主題時,所有訂閱該主題的客戶端都會收到更新信息。這種靈活的主題結構和層次化的命名規(guī)則,使得MQTT在復雜場景下也能快速組織和管理消息流。
MQTT協(xié)議支持三種服務質量(QoS)等級,分別為“至多一次”(QoS 0)、“至少一次”(QoS 1)和“僅一次”(QoS 2)。QoS 0表示消息傳輸盡力而為,可能會丟失或重復;QoS 1確保消息至少送達一次,但可能會有重復;QoS 2則確保消息恰好傳輸一次,保證消息的嚴格可靠性。這種設計使MQTT能夠適應不同的應用場景,用戶可以根據(jù)應用需求選擇合適的QoS級別。
為了保證通信的安全性,MQTT支持用戶名和密碼驗證,代理可以對連接進行身份認證。此外,許多實現(xiàn)中還支持TLS/SSL加密通信,確保數(shù)據(jù)在傳輸過程中不會被竊取或篡改。用戶也可以使用不同的認證方式來增強系統(tǒng)的安全性,適應物聯(lián)網(wǎng)應用中對安全性的高需求。
MQTT非常注重輕量化和低功耗。它的報文頭非常小,通信開銷很低,這使其特別適合在資源受限的設備或不穩(wěn)定的網(wǎng)絡環(huán)境中使用。MQTT支持“保持連接”和“遺囑消息”功能,客戶端可以在連接斷開時自動向代理發(fā)送遺囑消息,通知其他客戶端連接狀態(tài)的變化。這種特性有助于提高網(wǎng)絡的健壯性和系統(tǒng)的可用性。
MQTT的典型使用場景包括物聯(lián)網(wǎng)設備數(shù)據(jù)采集、實時監(jiān)控、消息推送和控制命令的發(fā)布。比如在智能家居中,傳感器可以發(fā)布環(huán)境數(shù)據(jù),如溫濕度、煙霧濃度等,控制設備根據(jù)收到的消息作出響應,實現(xiàn)自動化操作。在工業(yè)場景中,MQTT可以幫助收集和管理大規(guī)模設備的運行狀態(tài),實現(xiàn)集中化和高效的設備監(jiān)控。
總的來說,MQTT協(xié)議憑借其低功耗、高效能、實時性強等優(yōu)勢,已成為物聯(lián)網(wǎng)通信的主要協(xié)議之一。它的發(fā)布/訂閱模式簡化了設備之間的通信,使其特別適合多對多、低延遲、高可靠性的數(shù)據(jù)傳輸場景。MQTT易于使用、拓展性強,為開發(fā)者提供了靈活的解決方案來構建各種物聯(lián)網(wǎng)應用。
【3】中科微ATGM336H-GPS模塊
中科微ATGM336H-GPS模塊是一款高性能、低功耗的全球定位模塊,專為衛(wèi)星定位導航應用設計。該模塊集成了GNSS基帶處理器和RF接收器,支持GPS、GLONASS、BDS(北斗)等多種衛(wèi)星系統(tǒng)的定位信號,能夠實現(xiàn)快速精準的定位,并提供穩(wěn)定可靠的位置、速度和時間數(shù)據(jù)。ATGM336H模塊廣泛應用于車輛定位、物流跟蹤、無人機導航、智能穿戴設備、戶外運動設備和物聯(lián)網(wǎng)等領域。
ATGM336H模塊采用小巧的LCC封裝,尺寸為16mm x 12.2mm x 2.3mm,便于集成到各種緊湊型設備中。模塊內(nèi)置高靈敏度接收芯片,具有-165dBm的高靈敏度,即使在復雜環(huán)境下也能快速捕獲和跟蹤衛(wèi)星信號。其冷啟動時間在開闊地帶一般小于30秒,熱啟動時間約為1秒,重捕獲時間小于1秒,使其在車輛移動和各種快速切換的場景下表現(xiàn)出色,定位精度可達2.5米。
該模塊支持多種工作模式,以滿足不同應用的功耗要求。它不僅可以在普通模式下連續(xù)定位,還支持周期性模式和節(jié)電模式,通過關閉部分功能或降低數(shù)據(jù)輸出頻率來減少功耗,適合電池供電的便攜式設備。其最低功耗在微安級別,能夠顯著延長電池續(xù)航時間,使其成為移動設備的理想選擇。
ATGM336H-GPS模塊的接口豐富,支持UART、I2C、SPI等多種通信接口,方便與主控MCU進行數(shù)據(jù)交換。模塊提供的標準NMEA協(xié)議輸出和二進制格式數(shù)據(jù)能夠直接對接多種導航應用程序。此外,模塊還具有內(nèi)置的天線檢測功能和動態(tài)干擾抑制技術,有助于在有較強電磁干擾的環(huán)境中保持定位精度,并能實時檢測和報告天線狀態(tài),進一步提高定位可靠性。
為了提高用戶體驗和簡化開發(fā)過程,中科微為ATGM336H模塊提供了完善的開發(fā)手冊和技術支持,便于開發(fā)者快速上手并將其應用到多種設備中。此外,模塊還支持多衛(wèi)星系統(tǒng)協(xié)同定位的功能,通過融合GPS、BDS、GLONASS等衛(wèi)星數(shù)據(jù),提高在市區(qū)、高山、森林等衛(wèi)星信號受限環(huán)境下的定位精度和穩(wěn)定性,使其適用于復雜環(huán)境的高精度定位需求。
二、硬件選型(搭建模型參考)
如果大家想自己搭建模型,完成這個項目的功能測試。
那么可以看參考下面的部分硬件模塊選型。
在本項目中,硬件選型是確保疫苗冷鏈物流監(jiān)測系統(tǒng)穩(wěn)定運行的關鍵。該系統(tǒng)的硬件組成包括主控芯片、傳感器模塊、通信模塊、顯示模塊、控制模塊以及電源模塊等,下面是各個硬件模塊的詳細選型和描述:
1. 主控芯片(STM32F103RCT6)
STM32F103RCT6是本系統(tǒng)的核心控制單元,基于ARM Cortex-M3架構,提供強大的運算能力和豐富的外設接口,能夠支持溫濕度傳感器、震動傳感器、顯示屏、4G模塊等多個設備的并行工作。其高效的處理能力能夠實時處理傳感器數(shù)據(jù)并進行控制輸出,適用于嵌入式物聯(lián)網(wǎng)應用。
2. 溫濕度傳感器(SHT30)
SHT30溫濕度傳感器用于實時采集運輸環(huán)境中的溫度和濕度數(shù)據(jù)。該傳感器具有較高的測量精度,響應速度快,適合精確監(jiān)測冷鏈運輸環(huán)境的溫濕度,確保疫苗運輸過程中環(huán)境條件符合標準。
3. 震動傳感器
震動傳感器用于監(jiān)測運輸過程中的震動情況,尤其是當運輸環(huán)境發(fā)生劇烈震動時,系統(tǒng)能夠及時觸發(fā)警報,提醒駕駛員注意行駛狀態(tài)。這是冷鏈物流監(jiān)控系統(tǒng)中的一個關鍵安全功能,避免因過度震動影響疫苗的質量。
4. 4G通信模塊(Air724UG)
Air724UG 4G模塊用于數(shù)據(jù)的無線傳輸,支持將采集的溫濕度、震動等數(shù)據(jù)通過4G網(wǎng)絡上傳至云平臺。該模塊支持高速數(shù)據(jù)傳輸,能夠確保系統(tǒng)在任何時間和地點都能實時上傳數(shù)據(jù),并通過APP進行遠程監(jiān)控和控制。
5. GPS定位模塊(中科微ATGM336H-GPS模塊)
GPS模塊提供實時的車輛位置數(shù)據(jù),能夠精確地獲取車輛的經(jīng)緯度信息,并上傳到云平臺。通過GPS定位,系統(tǒng)能夠在地圖上實時顯示運輸車輛的位置,確保運輸過程的可追溯性和監(jiān)控。
6. 顯示屏(1.44寸OLED顯示屏)
1.44寸OLED顯示屏用于在駕駛室內(nèi)實時顯示環(huán)境數(shù)據(jù),包括溫度、濕度、震動等關鍵監(jiān)控數(shù)據(jù)。OLED屏具有高亮度和低功耗的優(yōu)點,適合在車載環(huán)境中使用,且顯示清晰,駕駛員可以直觀地查看運輸環(huán)境狀態(tài)。
7. 蜂鳴器
蜂鳴器用于在系統(tǒng)檢測到異常情況時發(fā)出警報。當溫度、濕度或震動等數(shù)據(jù)超出預設的安全范圍時,蜂鳴器將發(fā)出聲音提醒,警告駕駛員或工作人員采取必要的糾正措施。蜂鳴器是系統(tǒng)的重要警報元件。
8. 加濕器
加濕器用于當運輸環(huán)境濕度低于設定值時,自動增加環(huán)境濕度。它確保冷鏈運輸過程中,尤其是需要特定濕度條件的疫苗能夠得到良好的存儲環(huán)境,從而避免疫苗質量受濕度過低的影響。
9. 制冷風機
制冷風機用于當溫度超出設定的安全范圍時,自動啟動進行降溫,確保運輸過程中疫苗始終處于適宜的溫度環(huán)境。制冷風機的選擇需要根據(jù)實際需求,保證能夠在運輸過程中快速降低溫度,以適應不同環(huán)境的要求。
10. 按鍵模塊
按鍵模塊用于手動設置和調(diào)整溫濕度閾值,允許駕駛員或操作員根據(jù)不同的運輸需求,快速修改系統(tǒng)的溫濕度標準。它為系統(tǒng)提供了人工干預的接口,增加了操作靈活性。
11. 電源模塊
電源模塊為整個系統(tǒng)提供穩(wěn)定的電力供應,確保系統(tǒng)在運輸過程中持續(xù)可靠地工作。電源模塊需要支持4G模塊、傳感器、蜂鳴器等硬件的功耗需求,并具有良好的電源管理能力。
12. 數(shù)據(jù)存儲模塊(可選)
為了實現(xiàn)歷史數(shù)據(jù)查詢和分析,本系統(tǒng)可以配備數(shù)據(jù)存儲模塊,如SD卡模塊或EEPROM。數(shù)據(jù)存儲模塊用于存儲重要的環(huán)境數(shù)據(jù),便于后期的查閱和分析,尤其是在網(wǎng)絡不穩(wěn)定或無信號的情況下,仍能保證數(shù)據(jù)的本地記錄。
13. 無線通信模塊(MQTT協(xié)議)
為實現(xiàn)數(shù)據(jù)上傳和遠程控制,系統(tǒng)采用了MQTT協(xié)議進行無線通信。通過4G模塊與華為云物聯(lián)網(wǎng)平臺進行數(shù)據(jù)交換,確保監(jiān)控數(shù)據(jù)能夠及時上傳至云端,且通過APP實現(xiàn)遠程控制和監(jiān)控。
14. 后端服務器與可視化模塊
后端服務器用于接收來自4G模塊上傳的數(shù)據(jù),并將其通過API接口與前端網(wǎng)頁進行交互。前端網(wǎng)頁采用HTML、CSS和JavaScript等技術進行可視化展示,支持電腦和手機瀏覽器訪問,用戶可以在網(wǎng)頁上查看實時數(shù)據(jù)、歷史數(shù)據(jù)以及控制設備。
三、部署華為云物聯(lián)網(wǎng)平臺
華為云官網(wǎng): https://www.huaweicloud.com/
打開官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設備接入IoTDA
。
3.1 物聯(lián)網(wǎng)平臺介紹
華為云物聯(lián)網(wǎng)平臺(IoT 設備接入云服務)提供海量設備的接入和管理能力,將物理設備聯(lián)接到云,支撐設備數(shù)據(jù)采集上云和云端下發(fā)命令給設備進行遠程控制,配合華為云其他產(chǎn)品,幫助快速構筑物聯(lián)網(wǎng)解決方案。
使用物聯(lián)網(wǎng)平臺構建一個完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺、業(yè)務應用和設備。
物聯(lián)網(wǎng)平臺作為連接業(yè)務應用和設備的中間層,屏蔽了各種復雜的設備接口,實現(xiàn)設備的快速接入;同時提供強大的開放能力,支撐行業(yè)用戶構建各種物聯(lián)網(wǎng)解決方案。
設備可以通過固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡接入物聯(lián)網(wǎng)平臺,并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務數(shù)據(jù)上報到平臺,平臺也可以將控制命令下發(fā)給設備。
業(yè)務應用通過調(diào)用物聯(lián)網(wǎng)平臺提供的API,實現(xiàn)設備數(shù)據(jù)采集、命令下發(fā)、設備管理等業(yè)務場景。
3.2 開通物聯(lián)網(wǎng)服務
地址: https://www.huaweicloud.com/product/iothub.html
開通免費單元。
點擊立即創(chuàng)建
。
正在創(chuàng)建標準版實例,需要等待片刻。
創(chuàng)建完成之后,點擊詳情。 可以看到標準版實例的設備接入端口和地址。
下面框起來的就是端口號
和域名
點擊實例名稱,可以查看當前免費單元
的配置情況。
開通之后,點擊接入信息
,也能查看接入信息。 當前設備準備采用MQTT協(xié)議接入華為云平臺,這里可以看到MQTT協(xié)議的地址和端口號等信息。
總結:
端口號: 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。保留所有權利。
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 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(jié)=32 時間=37ms TTL=44
來自 117.78.5.125 的回復: 字節(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)品名字填寫,下面的設備類型選擇自定義類型。
(3)產(chǎn)品創(chuàng)建成功
創(chuàng)建完成之后點擊查看詳情。
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點擊進入產(chǎn)品詳情頁面,翻到最下面可以看到模型定義。
模型簡單來說: 就是存放設備上傳到云平臺的數(shù)據(jù)。
你可以根據(jù)自己的產(chǎn)品進行創(chuàng)建。
比如:
煙霧可以叫 MQ2
溫度可以叫 Temperature
濕度可以叫 humidity
火焰可以叫 flame
其他的傳感器自己用單詞簡寫命名即可。 這就是你的單片機設備端上傳到服務器的數(shù)據(jù)名字。
先點擊自定義模型。
再創(chuàng)建一個服務ID。
接著點擊新增屬性。
3.4 添加設備
產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實際的設備。添加的設備最終需要與真實的設備關聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊設備
(2)根據(jù)自己的設備填寫
(3)保存設備信息
創(chuàng)建完畢之后,點擊保存并關閉,得到創(chuàng)建的設備密匙信息。該信息在后續(xù)生成MQTT三元組的時候需要使用。
(4)設備創(chuàng)建完成
(5)設備詳情
3.5 MQTT協(xié)議主題訂閱與發(fā)布
(1)MQTT協(xié)議介紹
當前的設備是采用MQTT協(xié)議與華為云平臺進行通信。
MQTT是一個物聯(lián)網(wǎng)傳輸協(xié)議,它被設計用于輕量級的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡環(huán)境中的物聯(lián)網(wǎng)設備提供可靠的網(wǎng)絡服務。MQTT是專門針對物聯(lián)網(wǎng)開發(fā)的輕量級傳輸協(xié)議。MQTT協(xié)議針對低帶寬網(wǎng)絡,低計算能力的設備,做了特殊的優(yōu)化,使得其能適應各種物聯(lián)網(wǎng)應用場景。目前MQTT擁有各種平臺和設備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。
MQTT是一種消息隊列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對多的消息發(fā)布,解除應用程序耦合,相對于其他協(xié)議,開發(fā)更簡單;MQTT協(xié)議是工作在TCP/IP協(xié)議上;由TCP/IP協(xié)議提供穩(wěn)定的網(wǎng)絡連接;所以,只要具備TCP協(xié)議棧的網(wǎng)絡設備都可以使用MQTT協(xié)議。 本次設備采用的ESP8266就具備TCP協(xié)議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協(xié)議,就可以與華為云平臺完成通信。
華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
業(yè)務流程:
(2)華為云平臺MQTT協(xié)議使用限制
描述 | 限制 |
---|---|
支持的MQTT協(xié)議版本 | 3.1.1 |
與標準MQTT協(xié)議的區(qū)別 | 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg |
MQTTS支持的安全等級 | 采用TCP通道基礎 + TLS協(xié)議(最高TLSv1.3版本) |
單帳號每秒最大MQTT連接請求數(shù) | 無限制 |
單個設備每分鐘支持的最大MQTT連接數(shù) | 1 |
單個MQTT連接每秒的吞吐量,即帶寬,包含直連設備和網(wǎng)關 | 3KB/s |
MQTT單個發(fā)布消息最大長度,超過此大小的發(fā)布請求將被直接拒絕 | 1MB |
MQTT連接心跳時間建議值 | 心跳時間限定為30至1200秒,推薦設置為120秒 |
產(chǎn)品是否支持自定義Topic | 支持 |
消息發(fā)布與訂閱 | 設備只能對自己的Topic進行消息發(fā)布與訂閱 |
每個訂閱請求的最大訂閱數(shù) | 無限制 |
(3)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設備而言,一般會訂閱平臺下發(fā)消息給設備 這個主題。
設備想接收平臺下發(fā)的消息,就需要訂閱平臺下發(fā)消息給設備 的主題,訂閱后,平臺下發(fā)消息給設備,設備就會收到消息。
如果設備想要知道平臺下發(fā)的消息,需要訂閱上面圖片里標注的主題。
以當前設備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down
(4)主題發(fā)布格式
對于設備來說,主題發(fā)布表示向云平臺上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設備狀態(tài)上傳到云平臺。
這個操作稱為:屬性上報。
幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html
根據(jù)幫助文檔的介紹, 當前設備發(fā)布主題,上報屬性的格式總結如下:
發(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": <填服務ID>,
"properties": {
"<填屬性名稱1>": <填屬性值>,
"<填屬性名稱2>": <填屬性值>,
..........
}
}
]
}
根據(jù)JSON格式,一次可以上傳多個屬性字段。 這個JSON格式里的,服務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,設備ID,設備密碼等信息,就像平時登錄QQ,微信一樣要輸入賬號密碼才能登錄。MQTT協(xié)議登錄的這3個參數(shù),一般稱為MQTT三元組。
接下來介紹,華為云平臺的MQTT三元組參數(shù)如何得到。
(1)MQTT服務器地址
要登錄MQTT服務器,首先記得先知道服務器的地址是多少,端口是多少。
幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home
MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機上使用比較困難,所以當前的設備是采用1883端口進連接的。
根據(jù)上面的域名和端口號,得到下面的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/
打開這個工具,填入設備的信息(也就是剛才創(chuàng)建完設備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設備的信息: (上面兩行就是設備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設備端通過MQTT協(xié)議登錄鑒權的時候,填入?yún)?shù)即可。
ClientId 663cb18871d845632a0912e7_dev1_0_0_2024050911
Username 663cb18871d845632a0912e7_dev1
Password 71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237
3.7 模擬設備登錄測試
經(jīng)過上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實的設備來登錄平臺。測試與服務器通信是否正常。
MQTT軟件下載地址【免費】: https://download.csdn.net/download/xiaolong1126626497/89928772
(1)填入登錄信息
打開MQTT客戶端軟件,對號填入相關信息(就是上面的文本介紹)。然后,點擊登錄,訂閱主題,發(fā)布主題。
(2)打開網(wǎng)頁查看
完成上面的操作之后,打開華為云網(wǎng)頁后臺,可以看到設備已經(jīng)在線了。
點擊詳情頁面,可以看到上傳的數(shù)據(jù):
到此,云平臺的部署已經(jīng)完成,設備已經(jīng)可以正常上傳數(shù)據(jù)了。
(3)MQTT登錄測試參數(shù)總結
MQTT服務器: 117.78.5.125
MQTT端口號: 183
//物聯(lián)網(wǎng)服務器的設備信息
#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進行鑒權。簡單來說,就是身份的認證。 調(diào)用接口獲取Token時,就需要填寫IAM賬號信息。所以,接下來演示一下過程。
地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users
**【1】獲取項目憑證 ** 點擊左上角用戶名,選擇下拉菜單里的我的憑證
項目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認證
。
點擊左上角創(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
設備影子介紹:
設備影子是一個用于存儲和檢索設備當前狀態(tài)信息的JSON文檔。
每個設備有且只有一個設備影子,由設備ID唯一標識
設備影子僅保存最近一次設備的上報數(shù)據(jù)和預期數(shù)據(jù)
無論該設備是否在線,都可以通過該影子獲取和設置設備的屬性
簡單來說:設備影子就是保存,設備最新上傳的一次數(shù)據(jù)。
設計的軟件里,如果想要獲取設備的最新狀態(tài)信息,就采用設備影子接口。
如果對接口不熟悉,可以先進行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow
在線調(diào)試接口,可以請求影子接口,了解請求,與返回的數(shù)據(jù)格式。
調(diào)試完成看右下角的響應體,就是返回的影子數(shù)據(jù)。
設備影子接口返回的數(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)設置 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; // 用于存儲響應數(shù)據(jù)
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);
// 發(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 轉換為 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設備端代碼設計
以下是一個示例的 main.c
代碼,將通過 4G 模塊與華為云物聯(lián)網(wǎng)平臺進行通信,實現(xiàn)溫濕度、震動、GPS 數(shù)據(jù)的采集與上傳。
- 使用 STM32F103RCT6 作為主控芯片。
- 溫濕度傳感器使用 SHT30。
- GPS 模塊使用中科微 ATGM336H-GPS 模塊。
- 震動傳感器是一個簡單的數(shù)字輸入傳感器。
- 4G 模塊(Air724UG)通過 UART 進行通信。
- 使用 MQTT 協(xié)議將數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺。
以下是 main.c
代碼示例: 這是框架代碼-偽代碼。
#include "stm32f1xx_hal.h"
#include "mqtt_client.h"
#include "sht30.h"
#include "gps.h"
#include "vibration_sensor.h"
#include "air724ug.h"
#include "wifi_module.h"
// 定義數(shù)據(jù)結構
typedef struct {
float temperature;
float humidity;
char gps_latitude[20];
char gps_longitude[20];
char vibration_status[20];
} sensor_data_t;
// 全局變量
sensor_data_t current_data;
MQTT_Client mqtt_client;
UART_HandleTypeDef huart1; // 4G模塊的串口配置
UART_HandleTypeDef huart2; // GPS模塊的串口配置
I2C_HandleTypeDef hi2c1; // SHT30溫濕度傳感器的I2C配置
// 定義函數(shù)原型
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_I2C1_Init(void);
void MX_UART1_Init(void);
void MX_UART2_Init(void);
void MX_WiFi_Init(void);
void MX_MQTT_Init(void);
void get_sensor_data(void);
void send_data_to_cloud(void);
// 主函數(shù)
int main(void)
{
// 初始化硬件抽象層(HAL)
HAL_Init();
SystemClock_Config();
// 初始化外設
MX_GPIO_Init();
MX_I2C1_Init();
MX_UART1_Init();
MX_UART2_Init();
MX_WiFi_Init();
MX_MQTT_Init();
// 初始化傳感器
SHT30_Init(&hi2c1);
GPS_Init(&huart2);
Vibration_Sensor_Init();
// 連接到WiFi
WiFi_Connect();
// MQTT連接到云平臺
if (MQTT_Connect(&mqtt_client) != MQTT_SUCCESS) {
// 連接失敗,進入錯誤處理流程
while (1);
}
// 主循環(huán)
while (1)
{
// 獲取傳感器數(shù)據(jù)
get_sensor_data();
// 將數(shù)據(jù)發(fā)送到云平臺
send_data_to_cloud();
}
}
// 獲取傳感器數(shù)據(jù)
void get_sensor_data(void)
{
// 獲取溫濕度數(shù)據(jù)
if (SHT30_ReadData(&hi2c1, ¤t_data.temperature, ¤t_data.humidity) != HAL_OK) {
// 如果讀取失敗,給默認值
current_data.temperature = 25.0f;
current_data.humidity = 50.0f;
}
// 獲取GPS數(shù)據(jù)
GPS_ReadData(&huart2, current_data.gps_latitude, current_data.gps_longitude);
// 獲取震動數(shù)據(jù)
if (Vibration_Sensor_Read() == 1) {
strcpy(current_data.vibration_status, "High");
} else {
strcpy(current_data.vibration_status, "Normal");
}
}
// 發(fā)送數(shù)據(jù)到云平臺
void send_data_to_cloud(void)
{
// 構造上傳的數(shù)據(jù)包
char payload[256];
sprintf(payload, "{"temperature":%.2f, "humidity":%.2f, "vibration_status":"%s", "gps_latitude":"%s", "gps_longitude":"%s"}",
current_data.temperature, current_data.humidity, current_data.vibration_status, current_data.gps_latitude, current_data.gps_longitude);
// 使用MQTT協(xié)議發(fā)送數(shù)據(jù)
if (MQTT_Publish(&mqtt_client, "device/data", payload) != MQTT_SUCCESS) {
// 發(fā)送失敗,進行錯誤處理
}
}
// 系統(tǒng)時鐘配置
void SystemClock_Config(void)
{
// 配置系統(tǒng)時鐘為 72 MHz
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL9;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
// 如果配置失敗,進入錯誤處理流程
while (1);
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
// 如果配置失敗,進入錯誤處理流程
while (1);
}
}
// GPIO初始化
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 在此處添加GPIO配置
}
// I2C1初始化
void MX_I2C1_Init(void)
{
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
// 初始化失敗,進入錯誤處理流程
while (1);
}
}
// UART1初始化 (用于4G模塊)
void MX_UART1_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&huart1) != HAL_OK) {
// 初始化失敗,進入錯誤處理流程
while (1);
}
}
// UART2初始化 (用于GPS模塊)
void MX_UART2_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
if (HAL_UART_Init(&huart2) != HAL_OK) {
// 初始化失敗,進入錯誤處理流程
while (1);
}
}
// WiFi模塊初始化
void MX_WiFi_Init(void)
{
}
// MQTT初始化
void MX_MQTT_Init(void)
{
// 配置MQTT客戶端
mqtt_client.broker = "mqtt://broker.huawei.com";
mqtt_client.port = 1883;
mqtt_client.client_id = "device_client_id";
mqtt_client.username = "device_username";
mqtt_client.password = "device_password";
mqtt_client.connect_timeout = 10; // 超時時間
mqtt_client.keep_alive_interval = 60; // 保持連接時間
MQTT_Init(&mqtt_client);
}
代碼說明:
初始化外設:MX_I2C1_Init()
:初始化用于與 SHT30 溫濕度傳感器通信的 I2C 接口。
MX_UART1_Init()
和MX_UART2_Init()
:初始化 UART 接口,用于與 4G 模塊和 GPS 模塊通信。MX_GPIO_Init()
:初始化 GPIO,配置其他硬件接口。MX_WiFi_Init()
:初始化 WiFi 模塊,連接到網(wǎng)絡。MX_MQTT_Init()
:初始化 MQTT 客戶端,配置連接到云平臺。
傳感器數(shù)據(jù)獲取:get_sensor_data()
函數(shù)獲取溫濕度、GPS 坐標和震動狀態(tài)數(shù)據(jù)。
數(shù)據(jù)上傳:send_data_to_cloud()
函數(shù)將傳感器數(shù)據(jù)格式化為 JSON 格式,并通過 MQTT 協(xié)議上傳到云平臺。
MQTT通信:通過配置好的 MQTT 客戶端與云平臺進行通信,發(fā)送實時的傳感器數(shù)據(jù)。
五、前端頁面設計
這段代碼是一個基于 HTML、CSS 和 JavaScript 的智慧大屏頁面,用于展示疫苗冷鏈物流監(jiān)測的數(shù)據(jù)。頁面的設計目標是通過展示環(huán)境數(shù)據(jù)(如溫度、濕度、震動)和 GPS 定位信息,實時監(jiān)控運輸過程中環(huán)境狀況。
下面是靜態(tài)頁面,模擬數(shù)據(jù)刷新顯示。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>智慧大屏 - 疫苗冷鏈物流監(jiān)測</title>
<link rel="stylesheet">
<style>
/* 設置全局字體和背景 */
body {
font-family: 'Roboto', sans-serif;
background: linear-gradient(45deg, #121212, #1c1c1c); /* 深色漸變背景 */
margin: 0;
padding: 0;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
overflow: hidden;
}
/* 中心容器 */
.container {
width: 100%;
height: 100%;
max-width: 1920px; /* 限制最大寬度為 1920px */
display: flex;
justify-content: space-between;
padding: 20px;
box-sizing: border-box;
flex-wrap: wrap;
}
/* 左側卡片區(qū)域 */
.left-panel {
display: flex;
flex-direction: column;
width: 48%;
justify-content: flex-start;
gap: 20px;
}
/* 右側地圖區(qū)域 */
.right-panel {
width: 48%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: flex-start;
}
/* 卡片樣式 */
.card {
background-color: #232323;
color: #fff;
width: 100%;
margin: 10px 0;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 15px rgba(0, 255, 255, 0.2);
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
height: 220px;
}
.card:hover {
transform: scale(1.05);
box-shadow: 0 0 25px rgba(0, 255, 255, 0.4);
}
.card h3 {
font-size: 26px;
margin-bottom: 10px;
color: #00FFFF; /* 科技藍 */
}
.card p {
font-size: 18px;
margin-bottom: 20px;
color: #ccc;
}
.card .value {
font-size: 32px;
font-weight: bold;
color: #00FF99; /* 科技綠 */
}
/* GPS定位樣式 */
.gps-map {
background-color: #232323;
color: white;
width: 100%;
margin: 10px 0;
padding: 20px;
border-radius: 10px;
display: flex;
justify-content: center;
align-items: center;
height: 100%;
position: relative;
box-shadow: 0 0 15px rgba(0, 255, 255, 0.2);
}
.map-overlay {
background: rgba(0, 0, 0, 0.7);
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
text-align: center;
padding: 50px;
border-radius: 10px;
}
.gps-coordinates {
font-size: 24px;
font-weight: 600;
position: absolute;
bottom: 10px;
width: 100%;
color: #00FFFF;
}
/* 頁眉樣式 */
.header {
text-align: center;
margin-bottom: 30px;
width: 100%;
}
.header h1 {
color: #00FFFF;
font-size: 40px;
margin-bottom: 20px;
}
.header p {
color: #ddd;
font-size: 18px;
}
/* 頁腳樣式 */
.footer {
text-align: center;
margin-top: 20px;
color: #aaa;
}
/* 控制頁面響應式布局 */
@media screen and (max-width: 768px) {
.container {
flex-direction: column;
align-items: center;
}
.left-panel, .right-panel {
width: 100%;
}
.card {
width: 100%;
}
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>智慧大屏 - 疫苗冷鏈物流監(jiān)測</h1>
<p>實時監(jiān)控運輸過程中的環(huán)境數(shù)據(jù),確保疫苗運輸過程符合標準</p>
</div>
<div class="left-panel">
<!-- 溫濕度監(jiān)控卡片 -->
<div class="card" id="temp-card">
<h3>環(huán)境溫度</h3>
<p>當前溫度</p>
<div class="value" id="temperature">23°C</div>
</div>
<div class="card" id="humidity-card">
<h3>環(huán)境濕度</h3>
<p>當前濕度</p>
<div class="value" id="humidity">55%</div>
</div>
<div class="card" id="vibration-card">
<h3>震動監(jiān)測</h3>
<p>當前震動強度</p>
<div class="value" id="vibration">正常</div>
</div>
</div>
<div class="right-panel">
<!-- GPS定位卡片 -->
<div class="gps-map">
<div class="map-overlay">
<h3>車輛當前位置</h3>
<p>正在運輸疫苗至目標地點</p>
<div class="gps-coordinates" id="gps-coordinates">經(jīng)度: 116.38° | 緯度: 39.90°</div>
</div>
</div>
</div>
<div class="footer">
<p>? 2024 疫苗冷鏈監(jiān)控系統(tǒng) - 所有權歸公司所有</p>
</div>
</div>
<script>
// 模擬數(shù)據(jù)更新
let temperatureElement = document.getElementById("temperature");
let humidityElement = document.getElementById("humidity");
let vibrationElement = document.getElementById("vibration");
let gpsCoordinatesElement = document.getElementById("gps-coordinates");
function updateData() {
// 模擬溫度變化
let temperature = Math.random() * 10 + 20;
temperatureElement.innerText = temperature.toFixed(1) + "°C";
// 模擬濕度變化
let humidity = Math.random() * 20 + 50;
humidityElement.innerText = humidity.toFixed(1) + "%";
// 模擬震動強度變化
let vibrationLevels = ["正常", "輕微震動", "劇烈震動"];
vibrationElement.innerText = vibrationLevels[Math.floor(Math.random() * vibrationLevels.length)];
// 模擬GPS坐標變化
let longitude = (Math.random() * 10 + 116).toFixed(2);
let latitude = (Math.random() * 10 + 39).toFixed(2);
gpsCoordinatesElement.innerText = `經(jīng)度: ${longitude}° | 緯度: ${latitude}°`;
}
setInterval(updateData, 3000); // 每3秒更新一次數(shù)據(jù)
</script>
</body>
</html>
以下是詳細的功能說明:
1. HTML 結構
<div >
- 作用:是頁面的主要容器,內(nèi)部包含了所有內(nèi)容。使用
flex
布局將頁面內(nèi)容分為左右兩個部分(左側為環(huán)境數(shù)據(jù)卡片,右側為 GPS 地圖卡片)。
<div >
- 作用:頁面頂部的標題區(qū)域,顯示頁面的標題 “智慧大屏 - 疫苗冷鏈物流監(jiān)測” 以及副標題,簡要描述該頁面的功能。
<div >
- 作用:該區(qū)域展示環(huán)境數(shù)據(jù)卡片,包含溫度、濕度和震動數(shù)據(jù),使用
flex
布局從上到下排列。
- 溫度卡片:顯示當前溫度。
- 濕度卡片:顯示當前濕度。
- 震動卡片:顯示當前震動監(jiān)測狀態(tài)。
<div >
- 作用:該區(qū)域用于顯示 GPS 定位地圖,展示當前疫苗運輸?shù)慕?jīng)緯度信息。地圖下方顯示當前的 GPS 坐標(經(jīng)度和緯度)。
<div >
- 作用:頁腳部分,提供版權信息或系統(tǒng)歸屬等簡短說明。
2. CSS 樣式
**全局樣式 **body:
- 設置了
background
為深色漸變背景,創(chuàng)造出科技感的氛圍。 font-family
設置為Roboto
字體,保證頁面的簡潔和現(xiàn)代感。- 使用
display: flex
和justify-content: center
來使頁面內(nèi)容居中顯示。
容器與布局
.container:
- 設置了最大寬度
max-width: 1920px
,確保頁面寬度適應大多數(shù)顯示器,保證在 1080p 屏幕分辨率下全屏顯示。 flex-wrap: wrap
使得頁面在小屏幕下可以自動換行,適應不同尺寸的設備。
左側卡片樣式
.left-panel:
- 使用
flex-direction: column
使得環(huán)境數(shù)據(jù)卡片垂直排列。 - 設置了
gap: 20px
來使卡片之間有一定的間距。
右側地圖樣式
.right-panel:
- 通過
flex-direction: column
保持地圖區(qū)域的整體布局,確保右側的地圖區(qū)域與左側數(shù)據(jù)區(qū)域并排顯示。 position: relative
為了定位地圖區(qū)域上的疊加內(nèi)容(如 GPS 坐標)。
卡片樣式
.card:
- 設置了卡片的背景色、內(nèi)邊距、圓角和陰影,使其看起來更為現(xiàn)代化和有層次感。
transition
用于設置卡片的動畫效果,卡片在鼠標懸停時會放大并且增加陰影,增強交互感。- 卡片內(nèi)容的標題、數(shù)值和描述有不同的字體大小和顏色,增強信息的可讀性和視覺層次感。
地圖樣式
.gps-map和 .map-overlay:
- 地圖區(qū)域使用
flex
居中顯示地圖內(nèi)容,并使用半透明的map-overlay
覆蓋在地圖上方,顯示 GPS 坐標等信息。
響應式設計
- 在小屏幕設備(如手機、平板)上,通過設置
@media screen and (max-width: 768px)
,容器變?yōu)樨Q向布局,左右區(qū)域都占滿整個屏幕寬度。卡片和地圖則會依次垂直排列,適配不同尺寸的設備。
3. JavaScript 動態(tài)數(shù)據(jù)更新
模擬數(shù)據(jù)更新
updateData() 函數(shù):
- 模擬實時更新環(huán)境數(shù)據(jù)和 GPS 坐標。
- 溫度:通過
Math.random()
隨機生成 20°C 到 30°C 之間的溫度值。 - 濕度:隨機生成 50% 到 70% 之間的濕度值。
- 震動:從 [“正?!? “輕微震動”, “劇烈震動”] 隨機選取一個震動狀態(tài)。
- GPS 坐標:模擬生成經(jīng)度和緯度,范圍在 116° 到 116.5° 之間,39° 到 39.5° 之間。
數(shù)據(jù)更新間隔
setInterval(updateData, 3000);
- 每 3 秒鐘調(diào)用一次
updateData
函數(shù),動態(tài)更新溫度、濕度、震動和 GPS 坐標,模擬實時監(jiān)測數(shù)據(jù)。
總結
- 頁面布局:
- 頁面通過
flex
布局實現(xiàn)了左側環(huán)境監(jiān)測數(shù)據(jù)區(qū)域和右側 GPS 地圖區(qū)域的并排展示。 - 使用響應式設計,確保頁面能夠自適應不同設備和屏幕分辨率,特別是在 1080p 屏幕分辨率下能夠全屏顯示。
- 頁面通過
- 動態(tài)數(shù)據(jù)展示:
- 使用 JavaScript 定時更新數(shù)據(jù),模擬溫濕度、震動監(jiān)測和 GPS 坐標的實時變化。
- 科技感設計:
- 通過深色背景、漸變效果、現(xiàn)代化卡片樣式和動態(tài)交互設計,提升了頁面的科技感和現(xiàn)代感,適合展示智慧監(jiān)控、物聯(lián)網(wǎng)等科技類內(nèi)容。
- 可擴展性:
- 頁面結構和樣式簡單清晰,易于擴展和定制,未來可以加入更多的監(jiān)控數(shù)據(jù)、功能和優(yōu)化
六、總結
本項目設計并實現(xiàn)了一套基于物聯(lián)網(wǎng)技術的疫苗冷鏈物流監(jiān)測系統(tǒng),保障疫苗在運輸過程中的安全性和有效性。通過結合溫度、濕度、震動等環(huán)境監(jiān)測數(shù)據(jù)的實時采集與反饋,本系統(tǒng)能夠及時發(fā)現(xiàn)并響應運輸過程中可能出現(xiàn)的異常情況,如溫濕度波動、劇烈震動等,從而采取相應的措施,例如開啟制冷風機、加濕器或蜂鳴器警報,確保疫苗始終處于適宜的環(huán)境條件下。
在硬件選型方面,系統(tǒng)采用了STM32F103RCT6作為主控芯片,結合了SHT30溫濕度傳感器、GPS模塊、震動傳感器以及4G模塊等多種外設,以實現(xiàn)多維度的數(shù)據(jù)采集和遠程監(jiān)控。4G模塊與華為云物聯(lián)網(wǎng)平臺的結合,使得運輸過程中的數(shù)據(jù)能夠實時上傳至云端,提供了更加可靠的數(shù)據(jù)存儲與管理手段。
在軟件部分,系統(tǒng)通過移動端APP和可視化網(wǎng)頁平臺進行數(shù)據(jù)展示和遠程控制,用戶可以隨時查看運輸環(huán)境的溫濕度、震動狀態(tài)和車輛位置,并獲取歷史數(shù)據(jù)進行分析。通過精準的GPS定位與實時數(shù)據(jù)更新,系統(tǒng)能夠有效避免運輸過程中可能出現(xiàn)的各類問題,確保疫苗冷鏈物流的穩(wěn)定性和安全性。
通過本項目的實現(xiàn),我們不僅增強了物聯(lián)網(wǎng)在醫(yī)療物流領域中的應用,還為疫苗冷鏈運輸提供了智能化、自動化的管理工具。未來,隨著技術的發(fā)展和系統(tǒng)功能的不斷完善,該系統(tǒng)將能夠支持更復雜的監(jiān)控需求,進一步提升疫苗運輸過程中的安全性和效率,為全球疫苗供應鏈的穩(wěn)定運行提供有力保障。