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

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

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

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、前言

1.1 項(xiàng)目開發(fā)背景

隨著全球經(jīng)濟(jì)的發(fā)展和物流行業(yè)的不斷創(chuàng)新,疫苗和生物制品的運(yùn)輸要求變得越來越高。尤其是疫苗的冷鏈物流,溫度、濕度等環(huán)境因素的控制直接關(guān)系到疫苗的質(zhì)量和效力,因此高效、可靠的冷鏈監(jiān)控系統(tǒng)顯得尤為重要。冷鏈物流系統(tǒng)通常用于保持藥品、食品等易腐物品的穩(wěn)定運(yùn)輸環(huán)境,對(duì)于疫苗的運(yùn)輸尤為關(guān)鍵,因?yàn)椴划?dāng)?shù)臏貪穸茸兓赡軐?dǎo)致疫苗失效,從而影響公眾健康。

傳統(tǒng)的冷鏈物流監(jiān)測方法主要依賴人工記錄和定期檢查,這不僅增加了人工成本,還存在檢測盲區(qū)和延時(shí)問題。為了應(yīng)對(duì)這一挑戰(zhàn),物聯(lián)網(wǎng)技術(shù)為冷鏈物流提供了更加精準(zhǔn)、實(shí)時(shí)的數(shù)據(jù)監(jiān)控手段。通過傳感器技術(shù)無線通信,物流過程中每一環(huán)節(jié)的環(huán)境數(shù)據(jù)都能夠?qū)崟r(shí)采集并上傳至云平臺(tái),進(jìn)行遠(yuǎn)程監(jiān)控和控制。這種高效的信息化管理方式,不僅能夠提高疫苗運(yùn)輸過程中的安全性,還能提升物流管理效率,減少人為疏忽和延誤。

本項(xiàng)目設(shè)計(jì)一個(gè)基于物聯(lián)網(wǎng)的疫苗冷鏈物流監(jiān)測系統(tǒng),采用溫濕度傳感器、震動(dòng)傳感器、GPS定位模塊硬件設(shè)備,結(jié)合STM32F103RCT6主控芯片、4G通信模塊、云平臺(tái)等技術(shù),打造一個(gè)實(shí)時(shí)監(jiān)測、自動(dòng)控制和遠(yuǎn)程管理的系統(tǒng)。該系統(tǒng)能夠自動(dòng)監(jiān)測和調(diào)節(jié)運(yùn)輸過程中的溫度、濕度,并及時(shí)報(bào)警提醒駕駛員,確保疫苗在運(yùn)輸過程中的質(zhì)量和安全。同時(shí),系統(tǒng)支持通過手機(jī)APP和后端服務(wù)器進(jìn)行數(shù)據(jù)查看和歷史數(shù)據(jù)分析,進(jìn)一步增強(qiáng)了系統(tǒng)的可靠性和智能化水平。

隨著全球冷鏈物流需求的日益增加,尤其是在疫苗運(yùn)輸領(lǐng)域,創(chuàng)新的物聯(lián)網(wǎng)冷鏈監(jiān)測解決方案成為了保障公共健康的重要工具。通過將物聯(lián)網(wǎng)技術(shù)與傳統(tǒng)冷鏈物流管理相結(jié)合,可以實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)采集、遠(yuǎn)程控制和智能化管理,為疫苗冷鏈物流提供全方位、無死角的保障。這對(duì)于提升疫苗運(yùn)輸?shù)目煽啃院托?,降低疫苗浪費(fèi)和風(fēng)險(xiǎn),具有重要的現(xiàn)實(shí)意義和廣泛的應(yīng)用前景。

image-20241226143657006

image-20241226143024849

1.2 設(shè)計(jì)實(shí)現(xiàn)的功能

(1)溫度監(jiān)測與控制
通過溫度傳感器實(shí)時(shí)采集運(yùn)輸環(huán)境中的溫度數(shù)據(jù)。當(dāng)檢測到溫度超過預(yù)設(shè)的安全閾值時(shí),系統(tǒng)自動(dòng)啟動(dòng)制冷風(fēng)機(jī)進(jìn)行降溫,確保運(yùn)輸環(huán)境保持在疫苗所需的適宜溫度范圍內(nèi)。

(2)濕度監(jiān)測與控制
通過濕度傳感器實(shí)時(shí)采集運(yùn)輸環(huán)境中的濕度數(shù)據(jù)。當(dāng)濕度值低于設(shè)定的正常范圍時(shí),系統(tǒng)自動(dòng)啟用加濕器進(jìn)行加濕,保證運(yùn)輸環(huán)境的濕度符合疫苗運(yùn)輸要求。

(3)震動(dòng)監(jiān)測與警報(bào)
系統(tǒng)集成震動(dòng)傳感器,實(shí)時(shí)監(jiān)測運(yùn)輸過程中可能出現(xiàn)的震動(dòng)情況。當(dāng)震動(dòng)強(qiáng)度超出設(shè)定值時(shí),系統(tǒng)會(huì)通過蜂鳴器發(fā)出警報(bào),提醒駕駛員注意行駛中的震動(dòng)情況,并采取必要的減速或避免劇烈顛簸。

(4)溫濕度值設(shè)置與調(diào)節(jié)
通過硬件按鍵,用戶可以手動(dòng)設(shè)置溫度和濕度的安全閾值。當(dāng)運(yùn)輸過程中溫度或濕度變化超過設(shè)定范圍時(shí),系統(tǒng)會(huì)啟動(dòng)自動(dòng)調(diào)節(jié)機(jī)制。

(5)環(huán)境數(shù)據(jù)實(shí)時(shí)顯示
系統(tǒng)配備小尺寸的1.44寸顯示屏,實(shí)時(shí)顯示當(dāng)前運(yùn)輸環(huán)境的溫度、濕度和震動(dòng)等重要數(shù)據(jù)。駕駛員可以直觀地了解運(yùn)輸環(huán)境的當(dāng)前狀態(tài)。

(6)無線數(shù)據(jù)傳輸與遠(yuǎn)程監(jiān)控
采用4G模塊將傳感器采集的實(shí)時(shí)數(shù)據(jù)無線傳輸到云平臺(tái),并通過手機(jī)APP進(jìn)行遠(yuǎn)程監(jiān)控。用戶可以在APP端查看當(dāng)前溫濕度數(shù)據(jù),及時(shí)獲取運(yùn)輸環(huán)境的狀態(tài)信息,確保運(yùn)輸過程中的數(shù)據(jù)透明和可控。

(7)歷史數(shù)據(jù)存儲(chǔ)與查詢
通過云平臺(tái)保存?zhèn)鞲衅鞑杉臍v史數(shù)據(jù)。用戶可以通過手機(jī)APP或后端服務(wù)器查詢歷史數(shù)據(jù),進(jìn)行數(shù)據(jù)分析和趨勢預(yù)測,從而優(yōu)化運(yùn)輸過程中的環(huán)境管理。

(8)GPS定位與實(shí)時(shí)跟蹤
系統(tǒng)集成GPS模塊,實(shí)時(shí)跟蹤運(yùn)輸車輛的位置,獲取車輛的經(jīng)緯度信息,并將位置數(shù)據(jù)上傳至云平臺(tái)。用戶通過手機(jī)APP可以實(shí)時(shí)查看車輛的當(dāng)前位置,確保運(yùn)輸過程的可追溯性。

(9)數(shù)據(jù)上云與平臺(tái)管理
系統(tǒng)支持將采集的數(shù)據(jù)通過4G模塊上傳到華為云物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)和管理。云平臺(tái)可以展示實(shí)時(shí)數(shù)據(jù),并支持歷史數(shù)據(jù)分析與可視化展示,幫助管理人員全面監(jiān)控冷鏈運(yùn)輸過程。

(10)后端服務(wù)器與可視化網(wǎng)頁
系統(tǒng)搭建Python后端服務(wù)器,接收來自云平臺(tái)的數(shù)據(jù),并設(shè)計(jì)HTML前端頁面進(jìn)行展示。用戶可以通過電腦或手機(jī)瀏覽器查看環(huán)境數(shù)據(jù),進(jìn)行實(shí)時(shí)控制和歷史數(shù)據(jù)查詢,支持局域網(wǎng)和公網(wǎng)訪問。

(11)系統(tǒng)報(bào)警與異常處理
當(dāng)溫度、濕度或震動(dòng)等環(huán)境指標(biāo)異常時(shí),系統(tǒng)會(huì)自動(dòng)觸發(fā)報(bào)警機(jī)制,通過蜂鳴器、APP通知等方式提醒駕駛員或管理人員采取適當(dāng)?shù)奶幚泶胧?,防止疫苗運(yùn)輸過程中發(fā)生質(zhì)量問題。

(12)自動(dòng)化控制與人工干預(yù)
在正常運(yùn)輸過程中,系統(tǒng)會(huì)根據(jù)實(shí)時(shí)數(shù)據(jù)自動(dòng)調(diào)節(jié)溫濕度和震動(dòng)狀態(tài)。如果出現(xiàn)無法自動(dòng)解決的問題,駕駛員或管理人員可通過APP手動(dòng)控制設(shè)備(如風(fēng)機(jī)、加濕器等)進(jìn)行調(diào)整,確保運(yùn)輸環(huán)境始終符合要求。

1.3 項(xiàng)目硬件模塊組成

(1)主控芯片(STM32F103RCT6)
STM32F103RCT6作為項(xiàng)目的核心控制單元,負(fù)責(zé)所有傳感器數(shù)據(jù)的采集、處理和控制命令的執(zhí)行。它通過與各個(gè)外部模塊的通信,協(xié)調(diào)各個(gè)子系統(tǒng)的工作,確保整個(gè)系統(tǒng)的正常運(yùn)行。

(2)溫濕度傳感器(SHT30)
SHT30傳感器用于實(shí)時(shí)采集運(yùn)輸環(huán)境中的溫度和濕度數(shù)據(jù),并將其傳輸至主控芯片。該傳感器具有高精度和穩(wěn)定性,適用于需要精確環(huán)境監(jiān)控的冷鏈物流系統(tǒng)。

(3)震動(dòng)傳感器
震動(dòng)傳感器用于監(jiān)測運(yùn)輸過程中的震動(dòng)情況,當(dāng)震動(dòng)超過設(shè)定閾值時(shí),系統(tǒng)會(huì)發(fā)出警報(bào),提醒駕駛員注意行駛狀態(tài)。它能有效避免運(yùn)輸中的劇烈顛簸對(duì)疫苗質(zhì)量造成影響。

(4)4G通信模塊(Air724UG)
Air724UG 4G模塊用于實(shí)現(xiàn)數(shù)據(jù)的無線傳輸,將傳感器采集的數(shù)據(jù)上傳至云平臺(tái)。通過4G模塊,系統(tǒng)能夠隨時(shí)進(jìn)行遠(yuǎn)程監(jiān)控和控制,確保冷鏈運(yùn)輸?shù)膶?shí)時(shí)數(shù)據(jù)不間斷傳輸。

(5)GPS定位模塊(中科微ATGM336H-GPS模塊)
GPS模塊用于實(shí)時(shí)獲取運(yùn)輸車輛的位置數(shù)據(jù),并將經(jīng)緯度信息上傳至云平臺(tái)。通過GPS定位,用戶可以隨時(shí)查看車輛的實(shí)時(shí)位置,確保運(yùn)輸過程的可追溯性。

(6)顯示屏(1.44寸顯示屏)
1.44寸小尺寸顯示屏用于實(shí)時(shí)顯示運(yùn)輸環(huán)境的關(guān)鍵數(shù)據(jù),如溫度、濕度、震動(dòng)狀態(tài)等。它為駕駛員提供了一個(gè)直觀的界面,便于在駕駛過程中隨時(shí)查看運(yùn)輸環(huán)境的狀態(tài)。

(7)蜂鳴器
蜂鳴器用于在發(fā)生異常情況時(shí)發(fā)出聲音警報(bào)。通過蜂鳴器,系統(tǒng)能夠在溫度、濕度或震動(dòng)等環(huán)境數(shù)據(jù)異常時(shí)及時(shí)提醒駕駛員采取措施,從而確保疫苗運(yùn)輸?shù)陌踩浴?/p>

(8)加濕器
加濕器用于自動(dòng)調(diào)節(jié)運(yùn)輸環(huán)境的濕度。當(dāng)濕度值低于設(shè)定值時(shí),加濕器會(huì)自動(dòng)啟用,確保運(yùn)輸環(huán)境始終維持在適宜的濕度范圍,避免濕度過低影響疫苗質(zhì)量。

(9)制冷風(fēng)機(jī)
制冷風(fēng)機(jī)用于自動(dòng)調(diào)節(jié)運(yùn)輸環(huán)境的溫度。當(dāng)檢測到溫度超出設(shè)定的安全范圍時(shí),風(fēng)機(jī)會(huì)自動(dòng)啟動(dòng)進(jìn)行降溫,以確保運(yùn)輸過程中疫苗存儲(chǔ)在適宜的低溫環(huán)境中。

(10)按鍵模塊
按鍵模塊用于手動(dòng)設(shè)置溫度、濕度等環(huán)境參數(shù)的閾值。用戶可以通過按鍵方便地調(diào)節(jié)和設(shè)定監(jiān)控的標(biāo)準(zhǔn)值,以適應(yīng)不同類型疫苗的運(yùn)輸需求。

(11)電源模塊
電源模塊為整個(gè)系統(tǒng)提供穩(wěn)定的電力支持。它需要支持4G模塊、傳感器、蜂鳴器等各個(gè)硬件設(shè)備的功耗需求,并確保系統(tǒng)在運(yùn)輸過程中的持續(xù)穩(wěn)定運(yùn)行。

(12)傳感器接口電路
傳感器接口電路用于連接各類傳感器(溫濕度傳感器、震動(dòng)傳感器等)與主控芯片。它們提供電氣連接和數(shù)據(jù)傳輸通道,確保數(shù)據(jù)從傳感器正確、及時(shí)地傳送至主控芯片進(jìn)行處理。

(13)云平臺(tái)通信模塊(MQTT協(xié)議)
云平臺(tái)通信模塊用于通過MQTT協(xié)議將數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)實(shí)時(shí)監(jiān)控、數(shù)據(jù)存儲(chǔ)和歷史數(shù)據(jù)分析。該模塊支持與后端服務(wù)器的通信,確保數(shù)據(jù)的遠(yuǎn)程傳輸與訪問。

1.4 設(shè)計(jì)思路

本項(xiàng)目的設(shè)計(jì)思路主要圍繞如何實(shí)現(xiàn)疫苗運(yùn)輸過程中的環(huán)境監(jiān)控與控制,確保疫苗在運(yùn)輸過程中的溫濕度、震動(dòng)等關(guān)鍵因素始終處于安全范圍內(nèi),最大程度地保證疫苗的質(zhì)量和效力。設(shè)計(jì)思路分為硬件選擇、數(shù)據(jù)采集與處理、控制策略、無線通信與遠(yuǎn)程監(jiān)控等幾個(gè)主要部分。

在硬件選擇上,本項(xiàng)目采用了STM32F103RCT6主控芯片作為核心控制單元,具備較強(qiáng)的處理能力和豐富的外設(shè)接口,能夠高效地完成各類傳感器的數(shù)據(jù)采集和控制指令的執(zhí)行。為了精準(zhǔn)監(jiān)測運(yùn)輸環(huán)境中的溫濕度情況,選擇了SHT30溫濕度傳感器,該傳感器具有高精度、低功耗、響應(yīng)速度快等特點(diǎn),適合用于對(duì)冷鏈物流過程中的環(huán)境進(jìn)行精細(xì)監(jiān)控。對(duì)于震動(dòng)檢測,選用了震動(dòng)傳感器,能夠?qū)崟r(shí)捕捉到運(yùn)輸中的震動(dòng)狀態(tài),尤其在運(yùn)輸過程中發(fā)生劇烈震動(dòng)時(shí),系統(tǒng)將立即觸發(fā)報(bào)警機(jī)制。此外,4G通信模塊Air724UG用于實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程無線傳輸,而GPS模塊則能夠?yàn)橄到y(tǒng)提供實(shí)時(shí)的位置信息,便于追蹤車輛的具體位置。

數(shù)據(jù)采集和處理是系統(tǒng)設(shè)計(jì)中的核心部分。通過各類傳感器采集溫度、濕度、震動(dòng)等環(huán)境數(shù)據(jù)后,主控芯片STM32將負(fù)責(zé)對(duì)這些數(shù)據(jù)進(jìn)行實(shí)時(shí)處理和分析。一旦發(fā)現(xiàn)環(huán)境數(shù)據(jù)超出設(shè)定的安全范圍,系統(tǒng)會(huì)根據(jù)設(shè)定的控制策略做出響應(yīng)。例如,當(dāng)溫度過高時(shí),系統(tǒng)會(huì)自動(dòng)啟動(dòng)制冷風(fēng)機(jī)進(jìn)行降溫;當(dāng)濕度過低時(shí),加濕器會(huì)自動(dòng)啟用,補(bǔ)充環(huán)境濕度;當(dāng)震動(dòng)過于劇烈時(shí),蜂鳴器會(huì)發(fā)出警報(bào),提醒駕駛員注意行駛情況。通過這樣的實(shí)時(shí)控制,系統(tǒng)可以確保疫苗運(yùn)輸過程中的環(huán)境始終處于安全狀態(tài)。

為了實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和管理,系統(tǒng)采用了4G模塊與華為云物聯(lián)網(wǎng)平臺(tái)進(jìn)行數(shù)據(jù)交互。通過MQTT協(xié)議,系統(tǒng)將實(shí)時(shí)數(shù)據(jù)上傳至云平臺(tái),確保用戶可以通過手機(jī)APP或計(jì)算機(jī)終端遠(yuǎn)程查看運(yùn)輸環(huán)境的溫濕度、震動(dòng)等數(shù)據(jù),并進(jìn)行實(shí)時(shí)控制。用戶還可以通過云平臺(tái)查詢歷史數(shù)據(jù),進(jìn)行趨勢分析和數(shù)據(jù)回溯,以便及時(shí)發(fā)現(xiàn)潛在的問題并進(jìn)行調(diào)整。與此同時(shí),云平臺(tái)與本地服務(wù)器之間的通信,確保了數(shù)據(jù)的高效存儲(chǔ)與展示。

系統(tǒng)還具備靈活的控制方式。駕駛員可以通過按鍵模塊手動(dòng)設(shè)置和調(diào)整溫度、濕度等環(huán)境參數(shù)的閾值,適應(yīng)不同類型疫苗的運(yùn)輸需求。在自動(dòng)模式下,系統(tǒng)能夠根據(jù)實(shí)時(shí)數(shù)據(jù)進(jìn)行自動(dòng)調(diào)節(jié);而在人工干預(yù)模式下,駕駛員或管理人員可以通過APP或顯示屏直接調(diào)整設(shè)備的工作狀態(tài)。

整個(gè)系統(tǒng)的設(shè)計(jì)充分考慮了其穩(wěn)定性、可靠性和易用性。所有的硬件模塊和軟件算法均經(jīng)過優(yōu)化,確保在復(fù)雜的運(yùn)輸環(huán)境下能夠穩(wěn)定運(yùn)行。此外,系統(tǒng)支持在不同的網(wǎng)絡(luò)環(huán)境下進(jìn)行遠(yuǎn)程訪問和控制,無論是在局域網(wǎng)還是公網(wǎng)環(huán)境下,都能夠保證數(shù)據(jù)的準(zhǔn)確傳輸和實(shí)時(shí)監(jiān)控。

本項(xiàng)目的設(shè)計(jì)思路是在物聯(lián)網(wǎng)技術(shù)和嵌入式硬件的支持下,通過高精度傳感器和智能控制策略,實(shí)現(xiàn)對(duì)疫苗運(yùn)輸過程的全面監(jiān)控與管理,確保疫苗冷鏈物流的安全、可靠與高效。

1.5 系統(tǒng)功能總結(jié)

功能模塊 功能描述
溫度監(jiān)測與控制 實(shí)時(shí)監(jiān)測運(yùn)輸環(huán)境中的溫度,當(dāng)溫度超過設(shè)定值時(shí),自動(dòng)啟動(dòng)制冷風(fēng)機(jī)進(jìn)行降溫。
濕度監(jiān)測與控制 實(shí)時(shí)監(jiān)測運(yùn)輸環(huán)境中的濕度,當(dāng)濕度低于設(shè)定值時(shí),自動(dòng)啟動(dòng)加濕器進(jìn)行加濕,保證環(huán)境濕度適宜。
震動(dòng)監(jiān)測與報(bào)警 實(shí)時(shí)監(jiān)測運(yùn)輸中的震動(dòng)情況,當(dāng)震動(dòng)超出設(shè)定閾值時(shí),通過蜂鳴器發(fā)出警報(bào),提醒駕駛員減少震動(dòng)。
溫濕度設(shè)置功能 通過按鍵模塊手動(dòng)設(shè)置溫度和濕度的安全閾值,允許用戶根據(jù)不同需求進(jìn)行調(diào)整。
環(huán)境數(shù)據(jù)實(shí)時(shí)顯示 在顯示屏上實(shí)時(shí)顯示溫度、濕度、震動(dòng)等關(guān)鍵環(huán)境數(shù)據(jù),供駕駛員查看當(dāng)前運(yùn)輸環(huán)境的狀態(tài)。
無線數(shù)據(jù)傳輸 通過4G模塊將環(huán)境數(shù)據(jù)實(shí)時(shí)上傳至云平臺(tái),支持手機(jī)APP和計(jì)算機(jī)端進(jìn)行遠(yuǎn)程監(jiān)控。
歷史數(shù)據(jù)查詢 支持通過云平臺(tái)保存和查詢歷史數(shù)據(jù),便于數(shù)據(jù)分析和運(yùn)輸過程中環(huán)境趨勢的回溯。
GPS定位與追蹤 實(shí)時(shí)獲取車輛位置,顯示車輛的經(jīng)緯度信息,確保運(yùn)輸過程的可追溯性,并支持通過云平臺(tái)實(shí)時(shí)查看車輛位置。
數(shù)據(jù)上云 將所有環(huán)境數(shù)據(jù)通過MQTT協(xié)議上傳至華為云物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)、展示和分析。
后臺(tái)數(shù)據(jù)展示 通過Python后端服務(wù)器,設(shè)計(jì)HTML前端頁面,將數(shù)據(jù)通過可視化網(wǎng)頁展示,支持電腦和手機(jī)瀏覽器訪問。
報(bào)警與異常處理 當(dāng)溫度、濕度、震動(dòng)等環(huán)境參數(shù)異常時(shí),系統(tǒng)會(huì)發(fā)出聲音或APP通知報(bào)警,提醒駕駛員采取必要的處理措施。
手動(dòng)與自動(dòng)控制 系統(tǒng)支持自動(dòng)控制模式,根據(jù)實(shí)時(shí)環(huán)境數(shù)據(jù)進(jìn)行調(diào)整,也支持手動(dòng)控制,允許駕駛員或管理人員進(jìn)行干預(yù)調(diào)整。

1.6 開發(fā)工具的選擇

STM32的編程語言選擇C語言,C語言執(zhí)行效率高,C語言編譯出來的可執(zhí)行文件最接近于機(jī)器碼,匯編語言執(zhí)行效率最高,但是匯編的移植性比較差,目前在一些操作系統(tǒng)內(nèi)核里還有一些低配的單片機(jī)使用的較多,平常的單片機(jī)編程還是以C語言為主。C語言的執(zhí)行效率僅次于匯編,語法理解簡單、代碼通用性強(qiáng),也支持跨平臺(tái),在嵌入式底層、單片機(jī)編程里用的非常多,當(dāng)前的設(shè)計(jì)就是采用C語言開發(fā)。

開發(fā)工具選擇Keil,keil是一家世界領(lǐng)先的嵌入式微控制器軟件開發(fā)商,在2015年,keil被ARM公司收購。因?yàn)楫?dāng)前芯片選擇的是STM32F103系列,STMF103是屬于ARM公司的芯片構(gòu)架、Cortex-M3內(nèi)核系列的芯片,所以使用Kile來開發(fā)STM32是有先天優(yōu)勢的,而keil在各大高校使用的也非常多,很多教科書里都是以keil來教學(xué),開發(fā)51單片機(jī)、STM32單片機(jī)等等。目前作為MCU芯片開發(fā)的軟件也不只是keil一家獨(dú)大,IAR在MCU微處理器開發(fā)領(lǐng)域里也使用的非常多,IAR擴(kuò)展性更強(qiáng),也支持STM32開發(fā),也支持其他芯片,比如:CC2530,51單片機(jī)的開發(fā)。從軟件的使用上來講,IAR比keil更加簡潔,功能相對(duì)少一些。如果之前使用過keil,而且使用頻率較多,已經(jīng)習(xí)慣再使用IAR是有點(diǎn)不適應(yīng)界面的。

image-20221210225339928

1.7 參考文獻(xiàn)

1.8 模塊的技術(shù)詳情介紹

【1】Air724UG-4G模塊

Air724UG是一款功能強(qiáng)大且廣泛應(yīng)用于物聯(lián)網(wǎng)(IoT)領(lǐng)域的4G通信模塊。它專為低功耗廣域網(wǎng)(LPWAN)應(yīng)用設(shè)計(jì),兼具高性能和穩(wěn)定性,適用于多種物聯(lián)網(wǎng)終端設(shè)備,包括智能表計(jì)、移動(dòng)支付、智能家居、車載電子等場景。該模塊支持4G LTE Cat 1網(wǎng)絡(luò)制式,是一款具備高性價(jià)比的無線通信解決方案。

Air724UG這款模塊支持LTE FDD網(wǎng)絡(luò),能夠提供穩(wěn)定的語音和數(shù)據(jù)傳輸服務(wù),并向下兼容2G GSM網(wǎng)絡(luò),使得在4G信號(hào)弱或不可用的區(qū)域仍可正常通信。由于其雙網(wǎng)支持能力,這一模塊可以靈活適應(yīng)不同的網(wǎng)絡(luò)環(huán)境,從而更廣泛地滿足客戶需求。

數(shù)據(jù)通信方面,Air724UG模塊支持SMS(短消息服務(wù))、TCP/UDP、HTTP/HTTPS、MQTT等協(xié)議,為用戶開發(fā)與應(yīng)用提供了多種可選方案。其良好的傳輸能力,能夠滿足物聯(lián)網(wǎng)設(shè)備對(duì)數(shù)據(jù)可靠性、響應(yīng)速度等方面的嚴(yán)苛需求。這使其在多種行業(yè)和領(lǐng)域中得到了廣泛應(yīng)用,如工業(yè)自動(dòng)化、智能物流、移動(dòng)支付等。模塊具備高效的數(shù)據(jù)傳輸和低延遲特性,是許多物聯(lián)網(wǎng)解決方案中的理想選擇。

Air724UG模塊在設(shè)計(jì)上注重低功耗特性,這在許多長期依賴電池供電的IoT設(shè)備中顯得尤為重要。模塊支持深度睡眠模式和待機(jī)模式,有效降低功耗,延長設(shè)備的使用壽命。此外,Air724UG的尺寸較為緊湊,提供易于集成的設(shè)計(jì),能夠在有限的空間內(nèi)實(shí)現(xiàn)靈活部署,適應(yīng)各種復(fù)雜應(yīng)用場景。

在接口和硬件配置方面,Air724UG-4G模塊集成了豐富的接口,包括UARTI2C、SPI、ADC、GPIO等,為用戶提供了極大的開發(fā)靈活性。此外,模塊還具備支持多種通信協(xié)議和功能的AT指令集,便于用戶進(jìn)行功能擴(kuò)展和定制。模塊的工作溫度范圍廣,能夠在嚴(yán)苛的環(huán)境下保持穩(wěn)定性能,使其在工業(yè)、戶外和其他環(huán)境條件變化較大的場景中表現(xiàn)出色。

綜合而言,Air724UG模塊是一款兼顧高性能與靈活性的4G模塊,專注于物聯(lián)網(wǎng)應(yīng)用的低功耗和高穩(wěn)定性需求。它的多網(wǎng)絡(luò)支持、強(qiáng)大的數(shù)據(jù)傳輸能力、低功耗特性以及靈活的硬件接口設(shè)計(jì),使其成為物聯(lián)網(wǎng)設(shè)備開發(fā)中備受青睞的選擇。

【2】MQTT協(xié)議

MQTT(Message Queuing Telemetry Transport,消息隊(duì)列遙測傳輸協(xié)議)是一種輕量級(jí)、發(fā)布/訂閱模式的消息傳輸協(xié)議,專為低帶寬、不可靠網(wǎng)絡(luò)環(huán)境設(shè)計(jì)。它最早由IBM提出,現(xiàn)已成為物聯(lián)網(wǎng)(IoT)通信的重要協(xié)議之一。由于其高效、低功耗和實(shí)時(shí)性等特點(diǎn),MQTT在智能家居、工業(yè)自動(dòng)化、遠(yuǎn)程監(jiān)控和車聯(lián)網(wǎng)等領(lǐng)域得到了廣泛應(yīng)用。

MQTT的工作原理基于發(fā)布/訂閱模型。這種模型有別于傳統(tǒng)的客戶端-服務(wù)器模型,通信方不需要直接建立連接。MQTT由三個(gè)核心組件構(gòu)成:客戶端、代理(Broker)和主題(Topic)??蛻舳丝梢宰鳛橄⒌陌l(fā)布者或訂閱者,消息通過代理進(jìn)行路由。代理是一個(gè)中間服務(wù)端,用于接收和分發(fā)來自不同客戶端的消息。發(fā)布者發(fā)送消息到一個(gè)特定的主題上,代理負(fù)責(zé)將這些消息分發(fā)給所有訂閱了該主題的客戶端。通過這種解耦的架構(gòu)設(shè)計(jì),客戶端之間可以實(shí)現(xiàn)松耦合的通信,降低了復(fù)雜性和依賴性。

在MQTT協(xié)議中,消息被分為不同的主題(Topic),例如“home/sensor/temperature”可以用來代表溫度傳感器數(shù)據(jù)??蛻舳丝梢杂嗛嗊@個(gè)主題,當(dāng)發(fā)布者發(fā)送新的數(shù)據(jù)到該主題時(shí),所有訂閱該主題的客戶端都會(huì)收到更新信息。這種靈活的主題結(jié)構(gòu)和層次化的命名規(guī)則,使得MQTT在復(fù)雜場景下也能快速組織和管理消息流。

MQTT協(xié)議支持三種服務(wù)質(zhì)量(QoS)等級(jí),分別為“至多一次”(QoS 0)、“至少一次”(QoS 1)和“僅一次”(QoS 2)。QoS 0表示消息傳輸盡力而為,可能會(huì)丟失或重復(fù);QoS 1確保消息至少送達(dá)一次,但可能會(huì)有重復(fù);QoS 2則確保消息恰好傳輸一次,保證消息的嚴(yán)格可靠性。這種設(shè)計(jì)使MQTT能夠適應(yīng)不同的應(yīng)用場景,用戶可以根據(jù)應(yīng)用需求選擇合適的QoS級(jí)別。

為了保證通信的安全性,MQTT支持用戶名和密碼驗(yàn)證,代理可以對(duì)連接進(jìn)行身份認(rèn)證。此外,許多實(shí)現(xiàn)中還支持TLS/SSL加密通信,確保數(shù)據(jù)在傳輸過程中不會(huì)被竊取或篡改。用戶也可以使用不同的認(rèn)證方式來增強(qiáng)系統(tǒng)的安全性,適應(yīng)物聯(lián)網(wǎng)應(yīng)用中對(duì)安全性的高需求。

MQTT非常注重輕量化和低功耗。它的報(bào)文頭非常小,通信開銷很低,這使其特別適合在資源受限的設(shè)備或不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中使用。MQTT支持“保持連接”和“遺囑消息”功能,客戶端可以在連接斷開時(shí)自動(dòng)向代理發(fā)送遺囑消息,通知其他客戶端連接狀態(tài)的變化。這種特性有助于提高網(wǎng)絡(luò)的健壯性和系統(tǒng)的可用性。

MQTT的典型使用場景包括物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)采集、實(shí)時(shí)監(jiān)控、消息推送和控制命令的發(fā)布。比如在智能家居中,傳感器可以發(fā)布環(huán)境數(shù)據(jù),如溫濕度、煙霧濃度等,控制設(shè)備根據(jù)收到的消息作出響應(yīng),實(shí)現(xiàn)自動(dòng)化操作。在工業(yè)場景中,MQTT可以幫助收集和管理大規(guī)模設(shè)備的運(yùn)行狀態(tài),實(shí)現(xiàn)集中化和高效的設(shè)備監(jiān)控。

總的來說,MQTT協(xié)議憑借其低功耗、高效能、實(shí)時(shí)性強(qiáng)等優(yōu)勢,已成為物聯(lián)網(wǎng)通信的主要協(xié)議之一。它的發(fā)布/訂閱模式簡化了設(shè)備之間的通信,使其特別適合多對(duì)多、低延遲、高可靠性的數(shù)據(jù)傳輸場景。MQTT易于使用、拓展性強(qiáng),為開發(fā)者提供了靈活的解決方案來構(gòu)建各種物聯(lián)網(wǎng)應(yīng)用。

【3】中科微ATGM336H-GPS模塊

中科微ATGM336H-GPS模塊是一款高性能、低功耗的全球定位模塊,專為衛(wèi)星定位導(dǎo)航應(yīng)用設(shè)計(jì)。該模塊集成了GNSS基帶處理器和RF接收器,支持GPS、GLONASS、BDS(北斗)等多種衛(wèi)星系統(tǒng)的定位信號(hào),能夠?qū)崿F(xiàn)快速精準(zhǔn)的定位,并提供穩(wěn)定可靠的位置、速度和時(shí)間數(shù)據(jù)。ATGM336H模塊廣泛應(yīng)用于車輛定位、物流跟蹤、無人機(jī)導(dǎo)航、智能穿戴設(shè)備、戶外運(yùn)動(dòng)設(shè)備和物聯(lián)網(wǎng)等領(lǐng)域。

ATGM336H模塊采用小巧的LCC封裝,尺寸為16mm x 12.2mm x 2.3mm,便于集成到各種緊湊型設(shè)備中。模塊內(nèi)置高靈敏度接收芯片,具有-165dBm的高靈敏度,即使在復(fù)雜環(huán)境下也能快速捕獲和跟蹤衛(wèi)星信號(hào)。其冷啟動(dòng)時(shí)間在開闊地帶一般小于30秒,熱啟動(dòng)時(shí)間約為1秒,重捕獲時(shí)間小于1秒,使其在車輛移動(dòng)和各種快速切換的場景下表現(xiàn)出色,定位精度可達(dá)2.5米。

該模塊支持多種工作模式,以滿足不同應(yīng)用的功耗要求。它不僅可以在普通模式下連續(xù)定位,還支持周期性模式和節(jié)電模式,通過關(guān)閉部分功能或降低數(shù)據(jù)輸出頻率來減少功耗,適合電池供電的便攜式設(shè)備。其最低功耗在微安級(jí)別,能夠顯著延長電池續(xù)航時(shí)間,使其成為移動(dòng)設(shè)備的理想選擇。

ATGM336H-GPS模塊的接口豐富,支持UART、I2C、SPI等多種通信接口,方便與主控MCU進(jìn)行數(shù)據(jù)交換。模塊提供的標(biāo)準(zhǔn)NMEA協(xié)議輸出和二進(jìn)制格式數(shù)據(jù)能夠直接對(duì)接多種導(dǎo)航應(yīng)用程序。此外,模塊還具有內(nèi)置的天線檢測功能和動(dòng)態(tài)干擾抑制技術(shù),有助于在有較強(qiáng)電磁干擾的環(huán)境中保持定位精度,并能實(shí)時(shí)檢測和報(bào)告天線狀態(tài),進(jìn)一步提高定位可靠性。

為了提高用戶體驗(yàn)和簡化開發(fā)過程,中科微為ATGM336H模塊提供了完善的開發(fā)手冊(cè)和技術(shù)支持,便于開發(fā)者快速上手并將其應(yīng)用到多種設(shè)備中。此外,模塊還支持多衛(wèi)星系統(tǒng)協(xié)同定位的功能,通過融合GPS、BDS、GLONASS等衛(wèi)星數(shù)據(jù),提高在市區(qū)、高山、森林等衛(wèi)星信號(hào)受限環(huán)境下的定位精度和穩(wěn)定性,使其適用于復(fù)雜環(huán)境的高精度定位需求。

二、硬件選型(搭建模型參考)

如果大家想自己搭建模型,完成這個(gè)項(xiàng)目的功能測試。

那么可以看參考下面的部分硬件模塊選型。

在本項(xiàng)目中,硬件選型是確保疫苗冷鏈物流監(jiān)測系統(tǒng)穩(wěn)定運(yùn)行的關(guān)鍵。該系統(tǒng)的硬件組成包括主控芯片、傳感器模塊、通信模塊、顯示模塊、控制模塊以及電源模塊等,下面是各個(gè)硬件模塊的詳細(xì)選型和描述:

1. 主控芯片(STM32F103RCT6)

STM32F103RCT6是本系統(tǒng)的核心控制單元,基于ARM Cortex-M3架構(gòu),提供強(qiáng)大的運(yùn)算能力和豐富的外設(shè)接口,能夠支持溫濕度傳感器、震動(dòng)傳感器、顯示屏、4G模塊等多個(gè)設(shè)備的并行工作。其高效的處理能力能夠?qū)崟r(shí)處理傳感器數(shù)據(jù)并進(jìn)行控制輸出,適用于嵌入式物聯(lián)網(wǎng)應(yīng)用。

2. 溫濕度傳感器(SHT30)

SHT30溫濕度傳感器用于實(shí)時(shí)采集運(yùn)輸環(huán)境中的溫度和濕度數(shù)據(jù)。該傳感器具有較高的測量精度,響應(yīng)速度快,適合精確監(jiān)測冷鏈運(yùn)輸環(huán)境的溫濕度,確保疫苗運(yùn)輸過程中環(huán)境條件符合標(biāo)準(zhǔn)。

3. 震動(dòng)傳感器

震動(dòng)傳感器用于監(jiān)測運(yùn)輸過程中的震動(dòng)情況,尤其是當(dāng)運(yùn)輸環(huán)境發(fā)生劇烈震動(dòng)時(shí),系統(tǒng)能夠及時(shí)觸發(fā)警報(bào),提醒駕駛員注意行駛狀態(tài)。這是冷鏈物流監(jiān)控系統(tǒng)中的一個(gè)關(guān)鍵安全功能,避免因過度震動(dòng)影響疫苗的質(zhì)量。

4. 4G通信模塊(Air724UG)

Air724UG 4G模塊用于數(shù)據(jù)的無線傳輸,支持將采集的溫濕度、震動(dòng)等數(shù)據(jù)通過4G網(wǎng)絡(luò)上傳至云平臺(tái)。該模塊支持高速數(shù)據(jù)傳輸,能夠確保系統(tǒng)在任何時(shí)間和地點(diǎn)都能實(shí)時(shí)上傳數(shù)據(jù),并通過APP進(jìn)行遠(yuǎn)程監(jiān)控和控制。

5. GPS定位模塊(中科微ATGM336H-GPS模塊)

GPS模塊提供實(shí)時(shí)的車輛位置數(shù)據(jù),能夠精確地獲取車輛的經(jīng)緯度信息,并上傳到云平臺(tái)。通過GPS定位,系統(tǒng)能夠在地圖上實(shí)時(shí)顯示運(yùn)輸車輛的位置,確保運(yùn)輸過程的可追溯性和監(jiān)控。

6. 顯示屏(1.44寸OLED顯示屏)

1.44寸OLED顯示屏用于在駕駛室內(nèi)實(shí)時(shí)顯示環(huán)境數(shù)據(jù),包括溫度、濕度、震動(dòng)等關(guān)鍵監(jiān)控?cái)?shù)據(jù)。OLED屏具有高亮度和低功耗的優(yōu)點(diǎn),適合在車載環(huán)境中使用,且顯示清晰,駕駛員可以直觀地查看運(yùn)輸環(huán)境狀態(tài)。

7. 蜂鳴器

蜂鳴器用于在系統(tǒng)檢測到異常情況時(shí)發(fā)出警報(bào)。當(dāng)溫度、濕度或震動(dòng)等數(shù)據(jù)超出預(yù)設(shè)的安全范圍時(shí),蜂鳴器將發(fā)出聲音提醒,警告駕駛員或工作人員采取必要的糾正措施。蜂鳴器是系統(tǒng)的重要警報(bào)元件。

8. 加濕器

加濕器用于當(dāng)運(yùn)輸環(huán)境濕度低于設(shè)定值時(shí),自動(dòng)增加環(huán)境濕度。它確保冷鏈運(yùn)輸過程中,尤其是需要特定濕度條件的疫苗能夠得到良好的存儲(chǔ)環(huán)境,從而避免疫苗質(zhì)量受濕度過低的影響。

9. 制冷風(fēng)機(jī)

制冷風(fēng)機(jī)用于當(dāng)溫度超出設(shè)定的安全范圍時(shí),自動(dòng)啟動(dòng)進(jìn)行降溫,確保運(yùn)輸過程中疫苗始終處于適宜的溫度環(huán)境。制冷風(fēng)機(jī)的選擇需要根據(jù)實(shí)際需求,保證能夠在運(yùn)輸過程中快速降低溫度,以適應(yīng)不同環(huán)境的要求。

10. 按鍵模塊

按鍵模塊用于手動(dòng)設(shè)置和調(diào)整溫濕度閾值,允許駕駛員或操作員根據(jù)不同的運(yùn)輸需求,快速修改系統(tǒng)的溫濕度標(biāo)準(zhǔn)。它為系統(tǒng)提供了人工干預(yù)的接口,增加了操作靈活性。

11. 電源模塊

電源模塊為整個(gè)系統(tǒng)提供穩(wěn)定的電力供應(yīng),確保系統(tǒng)在運(yùn)輸過程中持續(xù)可靠地工作。電源模塊需要支持4G模塊、傳感器、蜂鳴器等硬件的功耗需求,并具有良好的電源管理能力。

12. 數(shù)據(jù)存儲(chǔ)模塊(可選)

為了實(shí)現(xiàn)歷史數(shù)據(jù)查詢和分析,本系統(tǒng)可以配備數(shù)據(jù)存儲(chǔ)模塊,如SD卡模塊或EEPROM。數(shù)據(jù)存儲(chǔ)模塊用于存儲(chǔ)重要的環(huán)境數(shù)據(jù),便于后期的查閱和分析,尤其是在網(wǎng)絡(luò)不穩(wěn)定或無信號(hào)的情況下,仍能保證數(shù)據(jù)的本地記錄。

13. 無線通信模塊(MQTT協(xié)議)

為實(shí)現(xiàn)數(shù)據(jù)上傳和遠(yuǎn)程控制,系統(tǒng)采用了MQTT協(xié)議進(jìn)行無線通信。通過4G模塊與華為云物聯(lián)網(wǎng)平臺(tái)進(jìn)行數(shù)據(jù)交換,確保監(jiān)控?cái)?shù)據(jù)能夠及時(shí)上傳至云端,且通過APP實(shí)現(xiàn)遠(yuǎn)程控制和監(jiān)控。

14. 后端服務(wù)器與可視化模塊

后端服務(wù)器用于接收來自4G模塊上傳的數(shù)據(jù),并將其通過API接口與前端網(wǎng)頁進(jìn)行交互。前端網(wǎng)頁采用HTML、CSS和JavaScript等技術(shù)進(jìn)行可視化展示,支持電腦和手機(jī)瀏覽器訪問,用戶可以在網(wǎng)頁上查看實(shí)時(shí)數(shù)據(jù)、歷史數(shù)據(jù)以及控制設(shè)備。

三、部署華為云物聯(lián)網(wǎng)平臺(tái)

華為云官網(wǎng): https://www.huaweicloud.com/

打開官網(wǎng),搜索物聯(lián)網(wǎng),就能快速找到 設(shè)備接入IoTDA

image-20221204193824815

3.1 物聯(lián)網(wǎng)平臺(tái)介紹

華為云物聯(lián)網(wǎng)平臺(tái)(IoT 設(shè)備接入云服務(wù))提供海量設(shè)備的接入和管理能力,將物理設(shè)備聯(lián)接到云,支撐設(shè)備數(shù)據(jù)采集上云和云端下發(fā)命令給設(shè)備進(jìn)行遠(yuǎn)程控制,配合華為云其他產(chǎn)品,幫助快速構(gòu)筑物聯(lián)網(wǎng)解決方案。

使用物聯(lián)網(wǎng)平臺(tái)構(gòu)建一個(gè)完整的物聯(lián)網(wǎng)解決方案主要包括3部分:物聯(lián)網(wǎng)平臺(tái)、業(yè)務(wù)應(yīng)用和設(shè)備。

物聯(lián)網(wǎng)平臺(tái)作為連接業(yè)務(wù)應(yīng)用和設(shè)備的中間層,屏蔽了各種復(fù)雜的設(shè)備接口,實(shí)現(xiàn)設(shè)備的快速接入;同時(shí)提供強(qiáng)大的開放能力,支撐行業(yè)用戶構(gòu)建各種物聯(lián)網(wǎng)解決方案。

設(shè)備可以通過固網(wǎng)、2G/3G/4G/5G、NB-IoT、Wifi等多種網(wǎng)絡(luò)接入物聯(lián)網(wǎng)平臺(tái),并使用LWM2M/CoAP、MQTT、HTTPS協(xié)議將業(yè)務(wù)數(shù)據(jù)上報(bào)到平臺(tái),平臺(tái)也可以將控制命令下發(fā)給設(shè)備。

業(yè)務(wù)應(yīng)用通過調(diào)用物聯(lián)網(wǎng)平臺(tái)提供的API,實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場景。

img

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

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

image-20241028135834377

開通免費(fèi)單元。

image-20241028135935457

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

image-20240117134653452

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

image-20241028140048811

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

image-20241028140129102

下面框起來的就是端口號(hào)域名

image-20241028140229696

點(diǎn)擊實(shí)例名稱,可以查看當(dāng)前免費(fèi)單元的配置情況。

image-20241028140331523

image-20241028140428663

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

image-20241028140511105

總結(jié):

端口號(hào):   MQTT (1883)| MQTTS (8883)    
接入地址: dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

根據(jù)域名地址得到IP地址信息:

打開Windows電腦的命令行控制臺(tái)終端,使用ping 命令。ping一下即可。

Microsoft Windows [版本 10.0.19045.5011]
(c) Microsoft Corporation。保留所有權(quán)利。

C:UsersLenovo>ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com

正在 Ping dab1a1f2c6.st1.iotda-device.cn-north-4.myhuaweicloud.com [117.78.5.125] 具有 32 字節(jié)的數(shù)據(jù):
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44
來自 117.78.5.125 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=44

117.78.5.125 的 Ping 統(tǒng)計(jì)信息:
    數(shù)據(jù)包: 已發(fā)送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計(jì)時(shí)間(以毫秒為單位):
    最短 = 37ms,最長 = 37ms,平均 = 37ms

C:UsersLenovo>

MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書加密端口,單片機(jī)無法加載證書,所以使用1883端口合適。

3.3 創(chuàng)建產(chǎn)品

鏈接:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-dev/all-product?instanceId=03c5c68c-e588-458c-90c3-9e4c640be7af

(1)創(chuàng)建產(chǎn)品

image-20241028141601305

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

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

image-20240612094809689

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

image-20240612095148945

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

image-20240612095134263

(4)添加自定義模型

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

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

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

比如:

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

先點(diǎn)擊自定義模型。

image-20240612095517900

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

image-20240612095542749

接著點(diǎn)擊新增屬性。

image-20240612095648815

image-20240612095711898

3.4 添加設(shè)備

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

(1)注冊(cè)設(shè)備

image-20240425181935561

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

image-20240612100115167

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

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

image-20240612100128061

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

image-20240612100147232

(5)設(shè)備詳情

image-20240612100202960

image-20240612100217236

3.5 MQTT協(xié)議主題訂閱與發(fā)布

(1)MQTT協(xié)議介紹

當(dāng)前的設(shè)備是采用MQTT協(xié)議與華為云平臺(tái)進(jìn)行通信。

MQTT是一個(gè)物聯(lián)網(wǎng)傳輸協(xié)議,它被設(shè)計(jì)用于輕量級(jí)的發(fā)布/訂閱式消息傳輸,旨在為低帶寬和不穩(wěn)定的網(wǎng)絡(luò)環(huán)境中的物聯(lián)網(wǎng)設(shè)備提供可靠的網(wǎng)絡(luò)服務(wù)。MQTT是專門針對(duì)物聯(lián)網(wǎng)開發(fā)的輕量級(jí)傳輸協(xié)議。MQTT協(xié)議針對(duì)低帶寬網(wǎng)絡(luò),低計(jì)算能力的設(shè)備,做了特殊的優(yōu)化,使得其能適應(yīng)各種物聯(lián)網(wǎng)應(yīng)用場景。目前MQTT擁有各種平臺(tái)和設(shè)備上的客戶端,已經(jīng)形成了初步的生態(tài)系統(tǒng)。

MQTT是一種消息隊(duì)列協(xié)議,使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合,相對(duì)于其他協(xié)議,開發(fā)更簡單;MQTT協(xié)議是工作在TCP/IP協(xié)議上;由TCP/IP協(xié)議提供穩(wěn)定的網(wǎng)絡(luò)連接;所以,只要具備TCP協(xié)議棧的網(wǎng)絡(luò)設(shè)備都可以使用MQTT協(xié)議。 本次設(shè)備采用的ESP8266就具備TCP協(xié)議棧,能夠建立TCP連接,所以,配合STM32代碼里封裝的MQTT協(xié)議,就可以與華為云平臺(tái)完成通信。

華為云的MQTT協(xié)議接入幫助文檔在這里: https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

img

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

img

(2)華為云平臺(tái)MQTT協(xié)議使用限制

描述 限制
支持的MQTT協(xié)議版本 3.1.1
與標(biāo)準(zhǔn)MQTT協(xié)議的區(qū)別 支持Qos 0和Qos 1支持Topic自定義不支持QoS2不支持will、retain msg
MQTTS支持的安全等級(jí) 采用TCP通道基礎(chǔ) + TLS協(xié)議(最高TLSv1.3版本)
單帳號(hào)每秒最大MQTT連接請(qǐng)求數(shù) 無限制
單個(gè)設(shè)備每分鐘支持的最大MQTT連接數(shù) 1
單個(gè)MQTT連接每秒的吞吐量,即帶寬,包含直連設(shè)備和網(wǎng)關(guān) 3KB/s
MQTT單個(gè)發(fā)布消息最大長度,超過此大小的發(fā)布請(qǐng)求將被直接拒絕 1MB
MQTT連接心跳時(shí)間建議值 心跳時(shí)間限定為30至1200秒,推薦設(shè)置為120秒
產(chǎn)品是否支持自定義Topic 支持
消息發(fā)布與訂閱 設(shè)備只能對(duì)自己的Topic進(jìn)行消息發(fā)布與訂閱
每個(gè)訂閱請(qǐng)求的最大訂閱數(shù) 無限制

(3)主題訂閱格式

幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html

image-20221207153310037

對(duì)于設(shè)備而言,一般會(huì)訂閱平臺(tái)下發(fā)消息給設(shè)備 這個(gè)主題。

設(shè)備想接收平臺(tái)下發(fā)的消息,就需要訂閱平臺(tái)下發(fā)消息給設(shè)備 的主題,訂閱后,平臺(tái)下發(fā)消息給設(shè)備,設(shè)備就會(huì)收到消息。

如果設(shè)備想要知道平臺(tái)下發(fā)的消息,需要訂閱上面圖片里標(biāo)注的主題。

以當(dāng)前設(shè)備為例,最終訂閱主題的格式如下:
$oc/devices/{device_id}/sys/messages/down
    
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down

(4)主題發(fā)布格式

對(duì)于設(shè)備來說,主題發(fā)布表示向云平臺(tái)上傳數(shù)據(jù),將最新的傳感器數(shù)據(jù),設(shè)備狀態(tài)上傳到云平臺(tái)。

這個(gè)操作稱為:屬性上報(bào)。

幫助文檔地址:https://support.huaweicloud.com/usermanual-iothub/iot_06_v5_3010.html

image-20221207153637391

根據(jù)幫助文檔的介紹, 當(dāng)前設(shè)備發(fā)布主題,上報(bào)屬性的格式總結(jié)如下:

發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
 
最終的格式:
$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report
發(fā)布主題時(shí),需要上傳數(shù)據(jù),這個(gè)數(shù)據(jù)格式是JSON格式。

上傳的JSON數(shù)據(jù)格式如下:

{
  "services": [
    {
      "service_id": <填服務(wù)ID>,
      "properties": {
        "<填屬性名稱1>": <填屬性值>,
        "<填屬性名稱2>": <填屬性值>,
        ..........
      }
    }
  ]
}
根據(jù)JSON格式,一次可以上傳多個(gè)屬性字段。 這個(gè)JSON格式里的,服務(wù)ID,屬性字段名稱,屬性值類型,在前面創(chuàng)建產(chǎn)品的時(shí)候就已經(jīng)介紹了,不記得可以翻到前面去查看。

根據(jù)這個(gè)格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.6 MQTT三元組

MQTT協(xié)議登錄需要填用戶ID,設(shè)備ID,設(shè)備密碼等信息,就像平時(shí)登錄QQ,微信一樣要輸入賬號(hào)密碼才能登錄。MQTT協(xié)議登錄的這3個(gè)參數(shù),一般稱為MQTT三元組。

接下來介紹,華為云平臺(tái)的MQTT三元組參數(shù)如何得到。

(1)MQTT服務(wù)器地址

要登錄MQTT服務(wù)器,首先記得先知道服務(wù)器的地址是多少,端口是多少。

幫助文檔地址:https://console.huaweicloud.com/iotdm/?region=cn-north-4#/dm-portal/home

image-20240509193207359

MQTT協(xié)議的端口支持1883和8883,它們的區(qū)別是:8883 是加密端口更加安全。但是單片機(jī)上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進(jìn)連接的。

根據(jù)上面的域名和端口號(hào),得到下面的IP地址和端口號(hào)信息: 如果設(shè)備支持填寫域名可以直接填域名,不支持就直接填寫IP地址。 (IP地址就是域名解析得到的)

華為云的MQTT服務(wù)器地址:117.78.5.125
華為云的MQTT端口號(hào):1883

如何得到IP地址?如何域名轉(zhuǎn)IP? 打開Windows的命令行輸入以下命令。

ping  ad635970a1.st1.iotda-device.cn-north-4.myhuaweicloud.com

image-20240425182610048

(2)生成MQTT三元組

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

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

下面是打開的頁面:

image-20240425183025893

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

直接得到三元組信息。

image-20240509193310020

得到三元組之后,設(shè)備端通過MQTT協(xié)議登錄鑒權(quán)的時(shí)候,填入?yún)?shù)即可。

ClientId  663cb18871d845632a0912e7_dev1_0_0_2024050911
Username  663cb18871d845632a0912e7_dev1
Password  71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237

3.7 模擬設(shè)備登錄測試

經(jīng)過上面的步驟介紹,已經(jīng)創(chuàng)建了產(chǎn)品,設(shè)備,數(shù)據(jù)模型,得到MQTT登錄信息。 接下來就用MQTT客戶端軟件模擬真實(shí)的設(shè)備來登錄平臺(tái)。測試與服務(wù)器通信是否正常。

MQTT軟件下載地址【免費(fèi)】: https://download.csdn.net/download/xiaolong1126626497/89928772

(1)填入登錄信息

打開MQTT客戶端軟件,對(duì)號(hào)填入相關(guān)信息(就是上面的文本介紹)。然后,點(diǎn)擊登錄,訂閱主題,發(fā)布主題。

image-20240509193457358

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

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

image-20240612100508790

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

image-20240612100529581

到此,云平臺(tái)的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。

(3)MQTT登錄測試參數(shù)總結(jié)

MQTT服務(wù)器:  117.78.5.125
MQTT端口號(hào):  183

//物聯(lián)網(wǎng)服務(wù)器的設(shè)備信息
#define MQTT_ClientID "663cb18871d845632a0912e7_dev1_0_0_2024050911"
#define MQTT_UserName "663cb18871d845632a0912e7_dev1"
#define MQTT_PassWord "71b82deae83e80f04c4269b5bbce3b2fc7c13f610948fe210ce18650909ac237"

//訂閱與發(fā)布的主題
#define SET_TOPIC  "$oc/devices/663cb18871d845632a0912e7_dev1/sys/messages/down"  //訂閱
#define POST_TOPIC "$oc/devices/663cb18871d845632a0912e7_dev1/sys/properties/report"  //發(fā)布


發(fā)布的數(shù)據(jù):
{"services": [{"service_id": "stm32","properties":{"你的字段名字1":30,"你的字段名字2":10,"你的字段名字3":1,"你的字段名字4":0}}]}

3.8 創(chuàng)建IAM賬戶

創(chuàng)建一個(gè)IAM賬戶,因?yàn)榻酉聛黹_發(fā)上位機(jī),需要使用云平臺(tái)的API接口,這些接口都需要token進(jìn)行鑒權(quán)。簡單來說,就是身份的認(rèn)證。 調(diào)用接口獲取Token時(shí),就需要填寫IAM賬號(hào)信息。所以,接下來演示一下過程。

地址: https://console.huaweicloud.com/iam/?region=cn-north-4#/iam/users

**【1】獲取項(xiàng)目憑證 ** 點(diǎn)擊左上角用戶名,選擇下拉菜單里的我的憑證

image-20240509193646253

image-20240509193701262

項(xiàng)目憑證:

28add376c01e4a61ac8b621c714bf459

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

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

image-20240509193729078

點(diǎn)擊左上角創(chuàng)建用戶

image-20240509193744287

image-20240314153208692

image-20240314153228359

image-20240314153258229

創(chuàng)建成功:

image-20240314153315444

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

image-20240509193828289

用戶信息如下:

主用戶名  l19504562721
IAM用戶  ds_abc
密碼     DS12345678

3.9 獲取影子數(shù)據(jù)

幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html

設(shè)備影子介紹:

設(shè)備影子是一個(gè)用于存儲(chǔ)和檢索設(shè)備當(dāng)前狀態(tài)信息的JSON文檔。
每個(gè)設(shè)備有且只有一個(gè)設(shè)備影子,由設(shè)備ID唯一標(biāo)識(shí)
設(shè)備影子僅保存最近一次設(shè)備的上報(bào)數(shù)據(jù)和預(yù)期數(shù)據(jù)
無論該設(shè)備是否在線,都可以通過該影子獲取和設(shè)置設(shè)備的屬性

簡單來說:設(shè)備影子就是保存,設(shè)備最新上傳的一次數(shù)據(jù)。

設(shè)計(jì)的軟件里,如果想要獲取設(shè)備的最新狀態(tài)信息,就采用設(shè)備影子接口。

如果對(duì)接口不熟悉,可以先進(jìn)行在線調(diào)試:https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=ShowDeviceShadow

在線調(diào)試接口,可以請(qǐng)求影子接口,了解請(qǐng)求,與返回的數(shù)據(jù)格式。

調(diào)試完成看右下角的響應(yīng)體,就是返回的影子數(shù)據(jù)。

image-20240509194152229

設(shè)備影子接口返回的數(shù)據(jù)如下:

{
 "device_id": "663cb18871d845632a0912e7_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "DHT11_T": 18,
     "DHT11_H": 90,
     "BH1750": 38,
     "MQ135": 70
    },
    "event_time": "20240509T113448Z"
   },
   "version": 3
  }
 ]
}

調(diào)試成功之后,可以得到訪問影子數(shù)據(jù)的真實(shí)鏈接,接下來的代碼開發(fā)中,就采用Qt寫代碼訪問此鏈接,獲取影子數(shù)據(jù),完成上位機(jī)開發(fā)。

image-20240509194214716

鏈接如下:

https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow

3.10 訪問接口的代碼實(shí)現(xiàn)

(1)配置 Qt 項(xiàng)目

在 Qt 項(xiàng)目的 .pro 文件中,加入對(duì) libcurl 的支持:

QT += core
CONFIG += console
CONFIG -= app_bundle

INCLUDEPATH += /usr/include/curl  # 根據(jù)你的系統(tǒng)設(shè)置 libcurl 的路徑
LIBS += -lcurl  # 鏈接 libcurl 庫

SOURCES += main.cpp

(2)代碼實(shí)現(xiàn)

main.cpp 文件中實(shí)現(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;  // 用于存儲(chǔ)響應(yīng)數(shù)據(jù)

    curl_global_init(CURL_GLOBAL_DEFAULT);
    curl = curl_easy_init();
    if (curl) {
        // 設(shè)置訪問URL
        const QString url = "https://ad635970a1.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/28add376c01e4a61ac8b621c714bf459/devices/663cb18871d845632a0912e7_dev1/shadow";

        // 設(shè)置HTTP請(qǐng)求頭
        struct curl_slist *headers = NULL;
        headers = curl_slist_append(headers, "Authorization: Bearer <Your_Access_Token>"); // 這里需要替換為你的實(shí)際 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請(qǐng)求
        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 (一個(gè)用于解析 JSON 數(shù)據(jù)的輕量級(jí) C 庫) 來解析返回的 JSON 數(shù)據(jù)。

(1)配置 Qt 項(xiàng)目

在 Qt 項(xiàng)目的 .pro 文件中,確保包括了 CJSON 的頭文件,并鏈接 CJSON 的源代碼。

QT += core
CONFIG += console
CONFIG -= app_bundle

SOURCES += main.cpp 
           cJSON.c  # 將 cJSON.c 文件添加到你的項(xiàng)目中

INCLUDEPATH += path/to/cjson/  # 添加 CJSON 頭文件的路徑

LIBS += -lcurl  # 鏈接 libcurl 庫

(2)解析 JSON 數(shù)據(jù)的完整代碼

main.cpp 中,以下代碼展示了如何解析你提供的 JSON 數(shù)據(jù)。

#include <QCoreApplication>
#include <curl/curl.h>
#include <QDebug>
#include <QString>
#include <QByteArray>
#include "cJSON.h"

// 回調(diào)函數(shù),處理libcurl下載數(shù)據(jù)
size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) {
    size_t totalSize = size * nmemb;
    QByteArray *response = static_cast<QByteArray *>(userp);
    response->append(static_cast<char *>(contents), totalSize);
    return totalSize;
}

// 解析 JSON 數(shù)據(jù)
void parseJson(const QByteArray &data) {
    // 將 QByteArray 轉(zhuǎn)換為 char*
    const char* jsonData = data.constData();

    // 解析 JSON
    cJSON *root = cJSON_Parse(jsonData);
    if (root == NULL) {
        qDebug() << "Error parsing JSON.";
        return;
    }

    // 解析 "device_id"
    cJSON *deviceId = cJSON_GetObjectItemCaseSensitive(root, "device_id");
    if (cJSON_IsString(deviceId) && (deviceId->valuestring != NULL)) {
        qDebug() << "Device ID:" << deviceId->valuestring;
    }

    // 解析 "shadow" 數(shù)組
    cJSON *shadow = cJSON_GetObjectItemCaseSensitive(root, "shadow");
    if (cJSON_IsArray(shadow)) {
        cJSON *shadowItem = NULL;
        cJSON_ArrayForEach(shadowItem, shadow) {
            // 解析每個(gè) shadow 項(xiàng)目
            cJSON *serviceId = cJSON_GetObjectItemCaseSensitive(shadowItem, "service_id");
            if (cJSON_IsString(serviceId) && (serviceId->valuestring != NULL)) {
                qDebug() << "Service ID:" << serviceId->valuestring;
            }

            // 解析 "reported" 對(duì)象
            cJSON *reported = cJSON_GetObjectItemCaseSensitive(shadowItem, "reported");
            if (cJSON_IsObject(reported)) {
                // 解析 "properties" 對(duì)象
                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 對(duì)象
    cJSON_Delete(root);
}

int main(int argc, char *argv[]) {
    QCoreApplication a(argc, argv);

    // 模擬獲取到的 JSON 數(shù)據(jù)
    QByteArray jsonData = R"(
    {
        "device_id": "663cb18871d845632a0912e7_dev1",
        "shadow": [
            {
                "service_id": "stm32",
                "desired": {
                    "properties": null,
                    "event_time": null
                },
                "reported": {
                    "properties": {
                        "data1": 18,
                        "data2": 90,
                        "data3": 38,
                        "data4": 70
                    },
                    "event_time": "20240509T113448Z"
                },
                "version": 3
            }
        ]
    })";

    // 調(diào)用解析函數(shù)
    parseJson(jsonData);

    return a.exec();
}

四、STM32設(shè)備端代碼設(shè)計(jì)

以下是一個(gè)示例的 main.c 代碼,將通過 4G 模塊與華為云物聯(lián)網(wǎng)平臺(tái)進(jìn)行通信,實(shí)現(xiàn)溫濕度、震動(dòng)、GPS 數(shù)據(jù)的采集與上傳。

  • 使用 STM32F103RCT6 作為主控芯片。
  • 溫濕度傳感器使用 SHT30。
  • GPS 模塊使用中科微 ATGM336H-GPS 模塊。
  • 震動(dòng)傳感器是一個(gè)簡單的數(shù)字輸入傳感器。
  • 4G 模塊(Air724UG)通過 UART 進(jìn)行通信。
  • 使用 MQTT 協(xié)議將數(shù)據(jù)上傳至華為云物聯(lián)網(wǎng)平臺(tái)。

以下是 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ù)結(jié)構(gòu)
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();

    // 初始化外設(shè)
    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連接到云平臺(tái)
    if (MQTT_Connect(&mqtt_client) != MQTT_SUCCESS) {
        // 連接失敗,進(jìn)入錯(cuò)誤處理流程
        while (1);
    }

    // 主循環(huán)
    while (1)
    {
        // 獲取傳感器數(shù)據(jù)
        get_sensor_data();

        // 將數(shù)據(jù)發(fā)送到云平臺(tái)
        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) {
        // 如果讀取失敗,給默認(rèn)值
        current_data.temperature = 25.0f;
        current_data.humidity = 50.0f;
    }

    // 獲取GPS數(shù)據(jù)
    GPS_ReadData(&huart2, current_data.gps_latitude, current_data.gps_longitude);

    // 獲取震動(dòng)數(shù)據(jù)
    if (Vibration_Sensor_Read() == 1) {
        strcpy(current_data.vibration_status, "High");
    } else {
        strcpy(current_data.vibration_status, "Normal");
    }
}

// 發(fā)送數(shù)據(jù)到云平臺(tái)
void send_data_to_cloud(void)
{
    // 構(gòu)造上傳的數(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ā)送失敗,進(jìn)行錯(cuò)誤處理
    }
}

// 系統(tǒng)時(shí)鐘配置
void SystemClock_Config(void)
{
    // 配置系統(tǒng)時(shí)鐘為 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) {
        // 如果配置失敗,進(jìn)入錯(cuò)誤處理流程
        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) {
        // 如果配置失敗,進(jìn)入錯(cuò)誤處理流程
        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) {
        // 初始化失敗,進(jìn)入錯(cuò)誤處理流程
        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) {
        // 初始化失敗,進(jìn)入錯(cuò)誤處理流程
        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) {
        // 初始化失敗,進(jìn)入錯(cuò)誤處理流程
        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;  // 超時(shí)時(shí)間
    mqtt_client.keep_alive_interval = 60; // 保持連接時(shí)間
    MQTT_Init(&mqtt_client);
}

代碼說明:

初始化外設(shè)MX_I2C1_Init():初始化用于與 SHT30 溫濕度傳感器通信的 I2C 接口。

  • MX_UART1_Init()MX_UART2_Init():初始化 UART 接口,用于與 4G 模塊和 GPS 模塊通信。
  • MX_GPIO_Init():初始化 GPIO,配置其他硬件接口。
  • MX_WiFi_Init():初始化 WiFi 模塊,連接到網(wǎng)絡(luò)。
  • MX_MQTT_Init():初始化 MQTT 客戶端,配置連接到云平臺(tái)。

傳感器數(shù)據(jù)獲取get_sensor_data() 函數(shù)獲取溫濕度、GPS 坐標(biāo)和震動(dòng)狀態(tài)數(shù)據(jù)。

數(shù)據(jù)上傳send_data_to_cloud() 函數(shù)將傳感器數(shù)據(jù)格式化為 JSON 格式,并通過 MQTT 協(xié)議上傳到云平臺(tái)。

MQTT通信:通過配置好的 MQTT 客戶端與云平臺(tái)進(jìn)行通信,發(fā)送實(shí)時(shí)的傳感器數(shù)據(jù)。

五、前端頁面設(shè)計(jì)

這段代碼是一個(gè)基于 HTML、CSS 和 JavaScript 的智慧大屏頁面,用于展示疫苗冷鏈物流監(jiān)測的數(shù)據(jù)。頁面的設(shè)計(jì)目標(biāo)是通過展示環(huán)境數(shù)據(jù)(如溫度、濕度、震動(dòng))和 GPS 定位信息,實(shí)時(shí)監(jiān)控運(yù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>
        /* 設(shè)置全局字體和背景 */
        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;
        }

        /* 左側(cè)卡片區(qū)域 */
        .left-panel {
            display: flex;
            flex-direction: column;
            width: 48%;
            justify-content: flex-start;
            gap: 20px;
        }

        /* 右側(cè)地圖區(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; /* 科技藍(lán) */
        }

        .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;
        }

        /* 控制頁面響應(yīng)式布局 */
        @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>實(shí)時(shí)監(jiān)控運(yùn)輸過程中的環(huán)境數(shù)據(jù),確保疫苗運(yùn)輸過程符合標(biāo)準(zhǔn)</p>
        </div>

        <div class="left-panel">
            <!-- 溫濕度監(jiān)控卡片 -->
            <div class="card" id="temp-card">
                <h3>環(huán)境溫度</h3>
                <p>當(dāng)前溫度</p>
                <div class="value" id="temperature">23°C</div>
            </div>

            <div class="card" id="humidity-card">
                <h3>環(huán)境濕度</h3>
                <p>當(dāng)前濕度</p>
                <div class="value" id="humidity">55%</div>
            </div>

            <div class="card" id="vibration-card">
                <h3>震動(dòng)監(jiān)測</h3>
                <p>當(dāng)前震動(dòng)強(qiáng)度</p>
                <div class="value" id="vibration">正常</div>
            </div>
        </div>

        <div class="right-panel">
            <!-- GPS定位卡片 -->
            <div class="gps-map">
                <div class="map-overlay">
                    <h3>車輛當(dāng)前位置</h3>
                    <p>正在運(yùn)輸疫苗至目標(biāo)地點(diǎn)</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) - 所有權(quán)歸公司所有</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) + "%";

            // 模擬震動(dòng)強(qiáng)度變化
            let vibrationLevels = ["正常", "輕微震動(dòng)", "劇烈震動(dòng)"];
            vibrationElement.innerText = vibrationLevels[Math.floor(Math.random() * vibrationLevels.length)];

            // 模擬GPS坐標(biāo)變化
            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>

以下是詳細(xì)的功能說明:


1. HTML 結(jié)構(gòu)

<div >
  • 作用:是頁面的主要容器,內(nèi)部包含了所有內(nèi)容。使用 flex 布局將頁面內(nèi)容分為左右兩個(gè)部分(左側(cè)為環(huán)境數(shù)據(jù)卡片,右側(cè)為 GPS 地圖卡片)。
<div >
  • 作用:頁面頂部的標(biāo)題區(qū)域,顯示頁面的標(biāo)題 “智慧大屏 - 疫苗冷鏈物流監(jiān)測” 以及副標(biāo)題,簡要描述該頁面的功能。
<div >
  • 作用:該區(qū)域展示環(huán)境數(shù)據(jù)卡片,包含溫度、濕度和震動(dòng)數(shù)據(jù),使用
    flex
    

    布局從上到下排列。

    • 溫度卡片:顯示當(dāng)前溫度。
    • 濕度卡片:顯示當(dāng)前濕度。
    • 震動(dòng)卡片:顯示當(dāng)前震動(dòng)監(jiān)測狀態(tài)。
<div >
  • 作用:該區(qū)域用于顯示 GPS 定位地圖,展示當(dāng)前疫苗運(yùn)輸?shù)慕?jīng)緯度信息。地圖下方顯示當(dāng)前的 GPS 坐標(biāo)(經(jīng)度和緯度)。
<div >
  • 作用:頁腳部分,提供版權(quán)信息或系統(tǒng)歸屬等簡短說明。

2. CSS 樣式

**全局樣式 **body:
  • 設(shè)置了 background 為深色漸變背景,創(chuàng)造出科技感的氛圍。
  • font-family 設(shè)置為 Roboto 字體,保證頁面的簡潔和現(xiàn)代感。
  • 使用 display: flexjustify-content: center 來使頁面內(nèi)容居中顯示。
容器與布局

.container:

  • 設(shè)置了最大寬度 max-width: 1920px,確保頁面寬度適應(yīng)大多數(shù)顯示器,保證在 1080p 屏幕分辨率下全屏顯示。
  • flex-wrap: wrap 使得頁面在小屏幕下可以自動(dòng)換行,適應(yīng)不同尺寸的設(shè)備。
左側(cè)卡片樣式

.left-panel:

  • 使用 flex-direction: column 使得環(huán)境數(shù)據(jù)卡片垂直排列。
  • 設(shè)置了 gap: 20px 來使卡片之間有一定的間距。
右側(cè)地圖樣式

.right-panel:

  • 通過 flex-direction: column 保持地圖區(qū)域的整體布局,確保右側(cè)的地圖區(qū)域與左側(cè)數(shù)據(jù)區(qū)域并排顯示。
  • position: relative 為了定位地圖區(qū)域上的疊加內(nèi)容(如 GPS 坐標(biāo))。
卡片樣式

.card:

  • 設(shè)置了卡片的背景色、內(nèi)邊距、圓角和陰影,使其看起來更為現(xiàn)代化和有層次感。
  • transition 用于設(shè)置卡片的動(dòng)畫效果,卡片在鼠標(biāo)懸停時(shí)會(huì)放大并且增加陰影,增強(qiáng)交互感
  • 卡片內(nèi)容的標(biāo)題、數(shù)值和描述有不同的字體大小和顏色,增強(qiáng)信息的可讀性和視覺層次感。
地圖樣式

.gps-map和 .map-overlay:

  • 地圖區(qū)域使用 flex 居中顯示地圖內(nèi)容,并使用半透明的 map-overlay 覆蓋在地圖上方,顯示 GPS 坐標(biāo)等信息。
響應(yīng)式設(shè)計(jì)
  • 在小屏幕設(shè)備(如手機(jī)、平板)上,通過設(shè)置 @media screen and (max-width: 768px),容器變?yōu)樨Q向布局,左右區(qū)域都占滿整個(gè)屏幕寬度。卡片和地圖則會(huì)依次垂直排列,適配不同尺寸的設(shè)備。

3. JavaScript 動(dòng)態(tài)數(shù)據(jù)更新

模擬數(shù)據(jù)更新

updateData() 函數(shù):

  • 模擬實(shí)時(shí)更新環(huán)境數(shù)據(jù)和 GPS 坐標(biāo)。
  • 溫度:通過 Math.random() 隨機(jī)生成 20°C 到 30°C 之間的溫度值。
  • 濕度:隨機(jī)生成 50% 到 70% 之間的濕度值。
  • 震動(dòng):從 [“正?!? “輕微震動(dòng)”, “劇烈震動(dòng)”] 隨機(jī)選取一個(gè)震動(dòng)狀態(tài)。
  • GPS 坐標(biāo):模擬生成經(jīng)度和緯度,范圍在 116° 到 116.5° 之間,39° 到 39.5° 之間。
數(shù)據(jù)更新間隔

setInterval(updateData, 3000);

  • 每 3 秒鐘調(diào)用一次 updateData 函數(shù),動(dòng)態(tài)更新溫度、濕度、震動(dòng)和 GPS 坐標(biāo),模擬實(shí)時(shí)監(jiān)測數(shù)據(jù)。

總結(jié)

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

六、總結(jié)

本項(xiàng)目設(shè)計(jì)并實(shí)現(xiàn)了一套基于物聯(lián)網(wǎng)技術(shù)的疫苗冷鏈物流監(jiān)測系統(tǒng),保障疫苗在運(yùn)輸過程中的安全性和有效性。通過結(jié)合溫度、濕度、震動(dòng)等環(huán)境監(jiān)測數(shù)據(jù)的實(shí)時(shí)采集與反饋,本系統(tǒng)能夠及時(shí)發(fā)現(xiàn)并響應(yīng)運(yùn)輸過程中可能出現(xiàn)的異常情況,如溫濕度波動(dòng)、劇烈震動(dòng)等,從而采取相應(yīng)的措施,例如開啟制冷風(fēng)機(jī)、加濕器或蜂鳴器警報(bào),確保疫苗始終處于適宜的環(huán)境條件下。

在硬件選型方面,系統(tǒng)采用了STM32F103RCT6作為主控芯片,結(jié)合了SHT30溫濕度傳感器、GPS模塊、震動(dòng)傳感器以及4G模塊等多種外設(shè),以實(shí)現(xiàn)多維度的數(shù)據(jù)采集和遠(yuǎn)程監(jiān)控。4G模塊與華為云物聯(lián)網(wǎng)平臺(tái)的結(jié)合,使得運(yùn)輸過程中的數(shù)據(jù)能夠?qū)崟r(shí)上傳至云端,提供了更加可靠的數(shù)據(jù)存儲(chǔ)與管理手段。

在軟件部分,系統(tǒng)通過移動(dòng)端APP和可視化網(wǎng)頁平臺(tái)進(jìn)行數(shù)據(jù)展示和遠(yuǎn)程控制,用戶可以隨時(shí)查看運(yùn)輸環(huán)境的溫濕度、震動(dòng)狀態(tài)和車輛位置,并獲取歷史數(shù)據(jù)進(jìn)行分析。通過精準(zhǔn)的GPS定位與實(shí)時(shí)數(shù)據(jù)更新,系統(tǒng)能夠有效避免運(yùn)輸過程中可能出現(xiàn)的各類問題,確保疫苗冷鏈物流的穩(wěn)定性和安全性。

通過本項(xiàng)目的實(shí)現(xiàn),我們不僅增強(qiáng)了物聯(lián)網(wǎng)在醫(yī)療物流領(lǐng)域中的應(yīng)用,還為疫苗冷鏈運(yùn)輸提供了智能化、自動(dòng)化的管理工具。未來,隨著技術(shù)的發(fā)展和系統(tǒng)功能的不斷完善,該系統(tǒng)將能夠支持更復(fù)雜的監(jiān)控需求,進(jìn)一步提升疫苗運(yùn)輸過程中的安全性和效率,為全球疫苗供應(yīng)鏈的穩(wěn)定運(yùn)行提供有力保障。

  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載

相關(guān)推薦