• 方案介紹
    • 一、前言
    • 二、硬件選型(搭建模型參考)
    • 三、部署華為云物聯(lián)網(wǎng)平臺
    • 四、STM32設備端代碼設計
    • 五、前端頁面設計
    • 六、總結
  • 附件下載
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

基于物聯(lián)網(wǎng)設計的疫苗冷鏈物流監(jiān)測系統(tǒng)

02/08 09:54
1955
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

一、前言

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)實意義和廣泛的應用前景。

image-20241226143657006

image-20241226143024849

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是有點不適應界面的。

image-20221210225339928

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。

image-20221204193824815

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

img

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

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

image-20241028135834377

開通免費單元。

image-20241028135935457

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

image-20240117134653452

正在創(chuàng)建標準版實例,需要等待片刻。

image-20241028140048811

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

image-20241028140129102

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

image-20241028140229696

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

image-20241028140331523

image-20241028140428663

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

image-20241028140511105

總結:

端口號:   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)品

image-20241028141601305

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

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

image-20240612094809689

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

image-20240612095148945

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

image-20240612095134263

(4)添加自定義模型

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

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

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

比如:

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

先點擊自定義模型。

image-20240612095517900

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

image-20240612095542749

接著點擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設備

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

(1)注冊設備

image-20240425181935561

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

image-20240612100115167

(3)保存設備信息

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

image-20240612100128061

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

image-20240612100147232

(5)設備詳情

image-20240612100202960

image-20240612100217236

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

img

業(yè)務流程:

img

(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

image-20221207153310037

對于設備而言,一般會訂閱平臺下發(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

image-20221207153637391

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

image-20240509193207359

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

image-20240425182610048

(2)生成MQTT三元組

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

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

下面是打開的頁面:

image-20240425183025893

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

直接得到三元組信息。

image-20240509193310020

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

image-20240509193457358

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

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

image-20240612100508790

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

image-20240612100529581

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

image-20240509193646253

image-20240509193701262

項目憑證:

28add376c01e4a61ac8b621c714bf459

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

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

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

設備影子介紹:

設備影子是一個用于存儲和檢索設備當前狀態(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ù)。

image-20240509194152229

設備影子接口返回的數(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)設置 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, &current_data.temperature, &current_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)境狀況。

image-20241226143626718

下面是靜態(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: flexjustify-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ù)。

總結

  1. 頁面布局
    • 頁面通過 flex 布局實現(xiàn)了左側環(huán)境監(jiān)測數(shù)據(jù)區(qū)域和右側 GPS 地圖區(qū)域的并排展示。
    • 使用響應式設計,確保頁面能夠自適應不同設備和屏幕分辨率,特別是在 1080p 屏幕分辨率下能夠全屏顯示。
  2. 動態(tài)數(shù)據(jù)展示
    • 使用 JavaScript 定時更新數(shù)據(jù),模擬溫濕度、震動監(jiān)測和 GPS 坐標的實時變化。
  3. 科技感設計
    • 通過深色背景、漸變效果、現(xiàn)代化卡片樣式和動態(tài)交互設計,提升了頁面的科技感和現(xiàn)代感,適合展示智慧監(jiān)控、物聯(lián)網(wǎng)等科技類內(nèi)容。
  4. 可擴展性
    • 頁面結構和樣式簡單清晰,易于擴展和定制,未來可以加入更多的監(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)定運行提供有力保障。

  • 更多詳細資料請聯(lián)系.docx
    下載

相關推薦