• 方案介紹
    • 一、項(xiàng)目介紹
    • 二、硬件選型
    • 三、系統(tǒng)設(shè)計(jì)思路
    • 四、華為云物聯(lián)網(wǎng)平臺(tái)部署
    • 五、代碼設(shè)計(jì)
    • 六、總結(jié)
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

基于STM32+華為云IOT設(shè)計(jì)的智能車庫管理系統(tǒng)

4小時(shí)前
203
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

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

共1個(gè)文件

一、項(xiàng)目介紹

隨著城市化進(jìn)程和汽車擁有率的不斷提高,停車難的問題也日益凸顯。在城市中,停車場是一個(gè)非常重要的基礎(chǔ)設(shè)施,但是傳統(tǒng)的停車場管理方式存在很多問題,比如車位難以管理、停車費(fèi)用不透明等。為了解決這些問題,智能車庫管理系統(tǒng)應(yīng)運(yùn)而生。

本項(xiàng)目基于STM32+華為云IOT設(shè)計(jì)的智能車庫管理系統(tǒng),通過紅外感應(yīng)傳感器檢測(cè)停車位的占用情況,將數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái),并通過微信小程序展示車庫的實(shí)時(shí)停車位情況,包括總停車數(shù)量、當(dāng)前剩余空位數(shù)量和車位的編號(hào),并在二維立體圖中標(biāo)注出空閑停車位,方便用戶快速找到空閑停車位進(jìn)行停車。

本系統(tǒng)還包括車牌識(shí)別自動(dòng)計(jì)費(fèi)部分,通過車牌識(shí)別技術(shù)識(shí)別車輛進(jìn)出停車場的時(shí)間,并自動(dòng)計(jì)算停車費(fèi)用,提高了停車場的管理效率和用戶體驗(yàn)。

本項(xiàng)目的實(shí)現(xiàn)將大大提高停車場的管理效率和客戶體驗(yàn),為城市交通管理和用戶出行提供了更加便捷和高效的解決方案。

二、硬件選型

在本項(xiàng)目中,需要選擇合適的硬件來實(shí)現(xiàn)智能車庫管理系統(tǒng)。根據(jù)項(xiàng)目需求,需要選取能夠完成以下功能的硬件:

【1】檢測(cè)停車位是否有車輛存在的傳感器模塊

【2】能夠?qū)鞲衅鲾?shù)據(jù)上傳到云平臺(tái)通信模塊

【3】控制整個(gè)系統(tǒng)運(yùn)行的主控芯片

【4】提供電源支持的電源模塊

基于以上需求,最終采用以下硬件:

【1】傳感器模塊:紅外傳感器模塊,例如紅外障礙傳感器模塊,能夠檢測(cè)車輛是否在停車位上。

【2】通信模塊:EC20-4G模塊,支持 4G LTE 網(wǎng)絡(luò),能夠?qū)鞲衅鲾?shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái)。

【3】主控芯片:STM32F103ZET6,具有較高的性能和穩(wěn)定性,能夠滿足系統(tǒng)的實(shí)時(shí)性需求。

【4】電源模塊:直流穩(wěn)壓電源模塊,能夠提供穩(wěn)定的電源支持,保證系統(tǒng)的正常運(yùn)行。

三、系統(tǒng)設(shè)計(jì)思路

【1】硬件設(shè)計(jì)

  • 使用STM32F103ZET6作為主控芯片,連接紅外感應(yīng)傳感器進(jìn)行車輛檢測(cè)。
  • 配置EC20-4G模塊與STM32進(jìn)行通信,通過AT指令或相關(guān)協(xié)議將檢測(cè)到的數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái)。

【2】云平臺(tái)配置:

  • 在華為云物聯(lián)網(wǎng)平臺(tái)創(chuàng)建設(shè)備實(shí)例,將EC20-4G模塊作為設(shè)備接入。
  • 配置數(shù)據(jù)流轉(zhuǎn)規(guī)則,使得上傳的數(shù)據(jù)能夠正確地傳輸?shù)皆破脚_(tái)并且存儲(chǔ)。

【3】微信小程序開發(fā):

  • 使用微信小程序開發(fā)框架,通過調(diào)用華為云物聯(lián)網(wǎng)平臺(tái)提供的API接口,獲取上傳的數(shù)據(jù)。
  • 對(duì)返回的數(shù)據(jù)進(jìn)行解析和處理,計(jì)算當(dāng)前車庫總停車數(shù)量和剩余空位數(shù)量。
  • 根據(jù)數(shù)據(jù)繪制二維立體圖,并標(biāo)注出空閑停車位的位置和編號(hào)。
  • 實(shí)現(xiàn)用戶界面顯示,展示當(dāng)前車庫狀態(tài)和方便用戶找到空閑停車位。

整體流程如下: 紅外感應(yīng)傳感器通過STM32進(jìn)行車輛檢測(cè),檢測(cè)結(jié)果實(shí)時(shí)上傳到華為云物聯(lián)網(wǎng)平臺(tái)。微信小程序通過API接口獲取上傳的數(shù)據(jù),并進(jìn)行分析和處理,計(jì)算出車庫總停車數(shù)量和剩余空位數(shù)量。 然后,在界面上繪制二維立體圖并標(biāo)注空閑停車位。用戶可以通過微信小程序查看當(dāng)前車庫的狀態(tài),從而快速找到空閑停車位進(jìn)行停車操作。

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

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

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

image-20230801151116995

4.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ù)場景。

image-20230801151124332

image-20230801151130369

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

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

image-20230801151136153

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

image-20230801151202953

總結(jié):

端口號(hào):   MQTT (1883)| MQTTS (8883)   
接入地址: a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

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

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

C:Users11266>ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com

正在 Ping a161a58a78.iot-mqtts.cn-north-4.myhuaweicloud.com [121.36.42.100] 具有 32 字節(jié)的數(shù)據(jù):
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=38ms TTL=94
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=37ms TTL=94
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=38ms TTL=94
來自 121.36.42.100 的回復(fù): 字節(jié)=32 時(shí)間=36ms TTL=94

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

C:Users11266>

image-20230801151212765

MQTT協(xié)議接入端口號(hào)有兩個(gè),1883是非加密端口,8883是證書加密端口,單片機(jī)無法加載證書,所以使用1883端口比較合適。 接下來的ESP8266就采用1883端口連接華為云物聯(lián)網(wǎng)平臺(tái)。

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

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

點(diǎn)擊產(chǎn)品頁,再點(diǎn)擊左上角創(chuàng)建產(chǎn)品。

image-20230801151220860

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

根據(jù)自己產(chǎn)品名字填寫。

image-20230801151228433

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

image-20230801151234528

(4)添加自定義模型

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

這個(gè)模型就是定義自己設(shè)備接下來需要向服務(wù)器上傳那些數(shù)據(jù)類型。根據(jù)自己的數(shù)據(jù)類型進(jìn)行編寫。

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

image-20230801151243343

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

image-20230801151250227

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

image-20230801151255512

image-20230801151300240

4.4 添加設(shè)備

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

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

image-20230801151308625

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

image-20230801151315386

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

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

image-20230801151322328

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

可以點(diǎn)擊設(shè)備進(jìn)入到設(shè)備詳情頁面。

image-20230801151331651

4.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

image-20230801151337395

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

image-20230801151342879

(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-20230801151350067

image-20230801151355027

對(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/6419627e40773741f9fbdac7_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-20230801151401246

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

發(fā)布的主題格式:
$oc/devices/{device_id}/sys/properties/report
 
最終的格式:
$oc/devices/6419627e40773741f9fbdac7_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":{"DS18B20":18,"motor_water":1,"motor_oxygen":1,"temp_max":10,"water_hp":130,"motor_food":0,"time_food":0,"oxygen_food":3}}]}

4.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ù)器地址:114.116.232.138
域名:7445c6bcd3.st1.iotda-device.cn-north-4.myhuaweicloud.com
華為云的MQTT端口號(hào):1883

注意?。。?! 具體要看這里:

image-20230801151408871

(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-20230801151418248

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

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

ClientId 6419627e40773741f9fbdac7_dev1_0_0_2023032108
Username 6419627e40773741f9fbdac7_dev1
Password 861ac9e6a579d36888b2aaf97714be7af6c77017b017162884592bd68b086a6e

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

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

(1)填入登錄信息

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

image-20230801151429390

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

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

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

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

五、代碼設(shè)計(jì)

5.1 EC20-4G模塊AT指令介紹

EC20模塊是一種常用的無線通信模塊,支持MQTT協(xié)議。

下面MQTT相關(guān)的AT指令:

【1】AT+QMTCONN:用于建立與MQTT服務(wù)器的連接。

  • 功能:通過指定MQTT服務(wù)器的地址、端口、客戶端ID、用戶名和密碼等參數(shù),建立與MQTT服務(wù)器的連接。

【2】AT+QMTDISC:用于斷開與MQTT服務(wù)器的連接。

  • 功能:斷開與MQTT服務(wù)器的連接。

【3】AT+QMTPUB:用于發(fā)布MQTT消息。

  • 功能:指定MQTT主題和消息內(nèi)容,將消息發(fā)布到MQTT服務(wù)器。

【4】AT+QMTSUB:用于訂閱MQTT主題。

  • 功能:訂閱指定的MQTT主題,接收該主題下的消息。

【5】AT+QMTUNS:用于取消訂閱MQTT主題。

  • 功能:取消對(duì)指定MQTT主題的訂閱。

【6】AT+QMTRECV:用于接收MQTT消息。

  • 功能:接收從MQTT服務(wù)器發(fā)送的消息。

這些是EC20模塊MQTT協(xié)議相關(guān)的AT指令。使用這些指令,可以在EC20模塊上實(shí)現(xiàn)MQTT設(shè)備的登錄、主題訂閱、主題發(fā)布以及消息接收等功能。

5.2 EC20連接IOT平臺(tái)

以下是使用STM32和EC20通過MQTT協(xié)議連接物聯(lián)網(wǎng)平臺(tái)并實(shí)現(xiàn)主題訂閱和發(fā)布的實(shí)現(xiàn)代碼:

#include "stm32f10x.h"
#include "stdio.h"
#include "string.h"

// 定義串口波特率
#define BAUD_RATE 115200

// 定義UART接收緩沖區(qū)大小
#define UART_RX_BUFFER_SIZE 256

// 定義MQTT服務(wù)器地址和端口號(hào)
#define MQTT_SERVER_ADDRESS "mqtt.example.com"
#define MQTT_SERVER_PORT 1883

// 定義MQTT客戶端ID
#define MQTT_CLIENT_ID "example_client"

// 定義MQTT訂閱的主題
#define MQTT_SUB_TOPIC "example_topic"

// 定義MQTT發(fā)布的主題
#define MQTT_PUB_TOPIC "example_topic"

// 定義UART接收緩沖區(qū)和索引
char uartRxBuffer[UART_RX_BUFFER_SIZE];
volatile uint16_t uartRxBufferIndex = 0;

// UART中斷處理函數(shù)
void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        // 讀取接收到的數(shù)據(jù)
        char data = USART_ReceiveData(USART1);

        // 將數(shù)據(jù)存入接收緩沖區(qū)
        uartRxBuffer[uartRxBufferIndex] = data;
        uartRxBufferIndex++;

        // 處理接收到的數(shù)據(jù)
        // 這里可以根據(jù)需要進(jìn)行相關(guān)操作,例如解析MQTT消息等

        // 清除接收中斷標(biāo)志位
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

// 初始化UART1配置
void UART1_Config(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能USART1和GPIOA時(shí)鐘
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

    // 配置USART1引腳
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;     // TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;    // RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART1
    USART_InitStructure.USART_BaudRate = BAUD_RATE;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART1, &USART_InitStructure);

    // 配置USART1中斷
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // 使能USART1接收中斷
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    // 使能USART1
    USART_Cmd(USART1, ENABLE);
}

// 向UART1發(fā)送數(shù)據(jù)
void UART1_SendData(char *data)
{
    while (*data)
    {
        // 發(fā)送數(shù)據(jù)
        USART_SendData(USART1, *data++);
        
        // 等待發(fā)送完成
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
    }
}

// 連接MQTT服務(wù)器
void MQTT_Connect(void)
{
    // 構(gòu)造MQTT CONNECT報(bào)文
    char connectPacket[256];
    sprintf(connectPacket,
            "x10x12x00x04MQTTx04x02x00x3Cx00%s",
            MQTT_CLIENT_ID);

    // 發(fā)送MQTT CONNECT報(bào)文
    UART1_SendData(connectPacket);
}

// 訂閱MQTT主題
void MQTT_Subscribe(void)
{
    // 構(gòu)造MQTT SUBSCRIBE報(bào)文
    char subscribePacket[256];
    sprintf(subscribePacket,
            "x82x0Fx00x01x00x0C"MQTT_SUB_TOPIC"x00x00");

    // 發(fā)送MQTT SUBSCRIBE報(bào)文
    UART1_SendData(subscribePacket);
}

// 發(fā)布MQTT消息
void MQTT_Publish(char *message)
{
    // 構(gòu)造MQTT PUBLISH報(bào)文
    char publishPacket[256];
    sprintf(publishPacket,
            "x30x10x00x0D"MQTT_PUB_TOPIC"%s",
            message);

    // 發(fā)送MQTT PUBLISH報(bào)文
    UART1_SendData(publishPacket);
}

int main(void)
{
    // 初始化UART1配置
    UART1_Config();
    
    // 連接MQTT服務(wù)器
    MQTT_Connect();
    
    // 訂閱MQTT主題
    MQTT_Subscribe();
    
    while (1)
    {
        // 處理其他任務(wù)
        
        // 發(fā)布MQTT消息
        MQTT_Publish("Hello, world!");
        
        // 等待一段時(shí)間
        delay_ms(1000);
    }
}

在代碼中,通過UART1與EC20進(jìn)行通信,并實(shí)現(xiàn)了MQTT的連接、訂閱和發(fā)布功能。UART1_SendData函數(shù)用于向UART1發(fā)送數(shù)據(jù),MQTT_Connect函數(shù)用于連接MQTT服務(wù)器,MQTT_Subscribe函數(shù)用于訂閱MQTT主題,MQTT_Publish函數(shù)用于發(fā)布MQTT消息。

5.3 獲取設(shè)備影子數(shù)據(jù)(API接口)

幫助文檔: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ù)。

我們?cè)O(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ù)格式。

image-20230801151441245

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

{
 "device_id": "6419627e40773741f9fbdac7_dev1",
 "shadow": [
  {
   "service_id": "stm32",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "DS18B20": 18,
     "motor_water": 1,
     "motor_oxygen": 1,
     "temp_max": 10,
     "water_hp": 130,
     "motor_food": 0,
     "time_food": 0,
     "oxygen_food": 3
    },
    "event_time": "20230321T081126Z"
   },
   "version": 0
  }
 ]
}

5.4 修改設(shè)備屬性(API接口)

地址: https://support.huaweicloud.com/api-iothub/iot_06_v5_0034.html

接口說明

設(shè)備的產(chǎn)品模型中定義了物聯(lián)網(wǎng)平臺(tái)可向設(shè)備下發(fā)的屬性,應(yīng)用服務(wù)器可調(diào)用此接口向指定設(shè)備下發(fā)屬性。平臺(tái)負(fù)責(zé)將屬性以同步方式發(fā)送給設(shè)備,并將設(shè)備執(zhí)行屬性結(jié)果同步返回。

修改設(shè)備屬性的接口,可以讓服務(wù)器給設(shè)備下發(fā)指令,如果需要控制設(shè)備。

在線調(diào)試地址:

https://apiexplorer.developer.huaweicloud.com/apiexplorer/doc?product=IoTDA&api=UpdateProperties

修改設(shè)備屬性是屬于同步命令,需要設(shè)備在線才可以進(jìn)行調(diào)試,先使用MQTT客戶端登錄服務(wù)器,模擬設(shè)備上線。

然后進(jìn)行調(diào)試,測(cè)試數(shù)據(jù)遠(yuǎn)程下發(fā)給設(shè)備。

【1】利用MQTT客戶端先登錄設(shè)備 (這是同步命令,必須在線才能調(diào)試)

image-20230801151450774

【2】點(diǎn)擊調(diào)試

image-20230801151457386

{"services":{"temp_max":100}}

【4】可以看到,MQTT客戶端軟件上已經(jīng)收到了服務(wù)器下發(fā)的消息

image-20230801151505222

由于是同步命令,服務(wù)器必須要收到設(shè)備的響應(yīng)才能順利完成一個(gè)流程,設(shè)備響應(yīng)了服務(wù)器才能確定數(shù)據(jù)下發(fā)成功。

六、總結(jié)

基于STM32和華為云IOT的智能車庫管理系統(tǒng)可以實(shí)現(xiàn)停車位智能展示功能,方便用戶快速找到空閑停車位。系統(tǒng)的核心部分是主控芯片STM32F103ZET6和紅外傳感器,通過紅外傳感器檢測(cè)停車位是否有車輛存在,并實(shí)時(shí)將檢測(cè)數(shù)據(jù)上傳到華為云物聯(lián)網(wǎng)平臺(tái)。

在物聯(lián)網(wǎng)平臺(tái)上,可以創(chuàng)建一個(gè)設(shè)備模型,包括車庫總停車數(shù)量、當(dāng)前剩余空位數(shù)量和車位的編號(hào)等屬性。每個(gè)停車位對(duì)應(yīng)一個(gè)設(shè)備,通過紅外傳感器的檢測(cè)結(jié)果更新對(duì)應(yīng)停車位的狀態(tài)。EC20-4G模塊負(fù)責(zé)將這些數(shù)據(jù)發(fā)送到華為云物聯(lián)網(wǎng)平臺(tái),實(shí)現(xiàn)與云端的通信。

微信小程序作為用戶界面,通過調(diào)用華為云物聯(lián)網(wǎng)平臺(tái)提供的接口,獲取設(shè)備上傳的數(shù)據(jù)并進(jìn)行處理分析,在界面上顯示當(dāng)前車庫總停車數(shù)量、當(dāng)前剩余空位數(shù)量和車位的編號(hào)??梢允褂枚S立體圖的形式,將停車位的狀態(tài)進(jìn)行展示,標(biāo)注出空閑的停車位,方便用戶快速找到空位進(jìn)行停車。

通過紅外傳感器和EC20模塊實(shí)時(shí)上傳數(shù)據(jù)到華為云物聯(lián)網(wǎng)平臺(tái),微信小程序通過調(diào)用接口獲取數(shù)據(jù)并展示在界面上,實(shí)現(xiàn)停車位智能展示功能。這種系統(tǒng)可以提高停車場的利用率,提供用戶友好的體驗(yàn),同時(shí)也為停車場管理者提供了實(shí)時(shí)監(jiān)控和數(shù)據(jù)分析的便利。

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

相關(guān)推薦

方案定制

去合作
方案開發(fā)定制化,2000+方案商即時(shí)響應(yīng)!