一、前言
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)用前景。
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)界面的。
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模塊集成了豐富的接口,包括UART、I2C、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
。
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ù)場景。
3.2 開通物聯(lián)網(wǎng)服務(wù)
地址: https://www.huaweicloud.com/product/iothub.html
開通免費(fèi)單元。
點(diǎn)擊立即創(chuàng)建
。
正在創(chuàng)建標(biāo)準(zhǔn)版實(shí)例,需要等待片刻。
創(chuàng)建完成之后,點(diǎn)擊詳情。 可以看到標(biāo)準(zhǔn)版實(shí)例的設(shè)備接入端口和地址。
下面框起來的就是端口號(hào)
和域名
點(diǎn)擊實(shí)例名稱,可以查看當(dāng)前免費(fèi)單元
的配置情況。
開通之后,點(diǎn)擊接入信息
,也能查看接入信息。 當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺(tái),這里可以看到MQTT協(xié)議的地址和端口號(hào)等信息。
總結(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)品
(2)填寫產(chǎn)品信息
根據(jù)自己產(chǎn)品名字填寫,下面的設(shè)備類型選擇自定義類型。
(3)產(chǎn)品創(chuàng)建成功
創(chuàng)建完成之后點(diǎn)擊查看詳情。
(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)擊自定義模型。
再創(chuàng)建一個(gè)服務(wù)ID。
接著點(diǎn)擊新增屬性。
3.4 添加設(shè)備
產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實(shí)際的設(shè)備。添加的設(shè)備最終需要與真實(shí)的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊(cè)設(shè)備
(2)根據(jù)自己的設(shè)備填寫
(3)保存設(shè)備信息
創(chuàng)建完畢之后,點(diǎn)擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時(shí)候需要使用。
(4)設(shè)備創(chuàng)建完成
(5)設(shè)備詳情
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
業(yè)務(wù)流程:
(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
對(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
根據(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
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
(2)生成MQTT三元組
華為云提供了一個(gè)在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開這個(gè)工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點(diǎn)擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)
直接得到三元組信息。
得到三元組之后,設(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ā)布主題。
(2)打開網(wǎng)頁查看
完成上面的操作之后,打開華為云網(wǎng)頁后臺(tái),可以看到設(shè)備已經(jīng)在線了。
點(diǎn)擊詳情頁面,可以看到上傳的數(shù)據(jù):
到此,云平臺(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)擊左上角用戶名,選擇下拉菜單里的我的憑證
項(xiàng)目憑證:
28add376c01e4a61ac8b621c714bf459
【2】創(chuàng)建IAM用戶
鼠標(biāo)放在左上角頭像上,在下拉菜單里選擇統(tǒng)一身份認(rèn)證
。
點(diǎn)擊左上角創(chuàng)建用戶
。
創(chuàng)建成功:
【3】創(chuàng)建完成
用戶信息如下:
主用戶名 l19504562721
IAM用戶 ds_abc
密碼 DS12345678
3.9 獲取影子數(shù)據(jù)
幫助文檔:https://support.huaweicloud.com/api-iothub/iot_06_v5_0079.html
設(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ù)。
設(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ā)。
鏈接如下:
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, ¤t_data.temperature, ¤t_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)境狀況。
下面是靜態(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: flex
和justify-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é)
- 頁面布局:
- 頁面通過
flex
布局實(shí)現(xiàn)了左側(cè)環(huán)境監(jiān)測數(shù)據(jù)區(qū)域和右側(cè) GPS 地圖區(qū)域的并排展示。 - 使用響應(yīng)式設(shè)計(jì),確保頁面能夠自適應(yīng)不同設(shè)備和屏幕分辨率,特別是在 1080p 屏幕分辨率下能夠全屏顯示。
- 頁面通過
- 動(dòng)態(tài)數(shù)據(jù)展示:
- 使用 JavaScript 定時(shí)更新數(shù)據(jù),模擬溫濕度、震動(dòng)監(jiān)測和 GPS 坐標(biāo)的實(shí)時(shí)變化。
- 科技感設(shè)計(jì):
- 通過深色背景、漸變效果、現(xiàn)代化卡片樣式和動(dòng)態(tài)交互設(shè)計(jì),提升了頁面的科技感和現(xiàn)代感,適合展示智慧監(jiān)控、物聯(lián)網(wǎng)等科技類內(nèi)容。
- 可擴(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)行提供有力保障。