• 方案介紹
    • 一、項目介紹
    • 二、軟硬件選型
    • 三、華為云物聯(lián)網(wǎng)服務(wù)器部署
    • 四、微信小程序開發(fā)
    • 五、硬件端代碼開發(fā)
    • 六、總結(jié)
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

基于物聯(lián)網(wǎng)設(shè)計的智能儲物柜(4G+華為云IOT+微信小程序)

18小時前
452
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

共1個文件

一、項目介紹

在游樂場、商場、景區(qū)等人流量較大的地方,往往存在用戶需要臨時存放物品的情況,例如行李箱、外套、購物袋等。為了滿足用戶的儲物需求,并提供更加便捷的服務(wù)體驗,當(dāng)前設(shè)計了一款物聯(lián)網(wǎng)智能儲物柜。

該智能儲物柜通過與華為云物聯(lián)網(wǎng)服務(wù)器的連接,實現(xiàn)了數(shù)據(jù)的傳輸和管理,讓用戶可以通過微信小程序輕松查看儲物柜的可用狀態(tài)和選擇合適的儲物柜進行解鎖。通過使用4G聯(lián)網(wǎng)模塊E29 Cat-1,儲物柜實現(xiàn)了穩(wěn)定的網(wǎng)絡(luò)連接,確保了用戶可以隨時隨地查看和使用儲物柜。

主控芯片采用STC12C5A60S2,具有低功耗、高性能和豐富的外設(shè)接口等特點,能夠滿足儲物柜的控制需求。而儲物柜的鎖則采用了電磁鎖,能夠快速、安全地實現(xiàn)儲物柜的解鎖和上鎖操作。

用戶在解鎖儲物柜后,會扣除相應(yīng)的押金(預(yù)付金),然后根據(jù)使用時間進行計費。用戶可以隨時存取自己的物品,并且在使用完成后可以通過微信小程序完成訂單結(jié)算,使整個使用過程更加便捷和透明。

這款4G智能儲物柜為用戶提供了一種靈活、安全、便捷的儲物解決方案,能夠有效滿足人們?nèi)粘I钪械膬ξ镄枨?,并提供良好的用戶體驗。

智能儲物柜支持的主要功能:

(1)遠程查看儲物柜狀態(tài):用戶可以通過微信小程序?qū)崟r查看儲物柜的可用狀態(tài),包括儲物柜數(shù)量、剩余可用儲物柜數(shù)量等信息。這使得用戶在選擇儲物柜時可以提前了解儲物柜的可用性,避免不必要的等待。

(2)指定儲物柜解鎖:用戶可以在微信小程序上選擇需要使用的儲物柜,并進行解鎖操作。當(dāng)用戶選擇指定儲物柜后,儲物柜會自動解鎖,方便用戶存放物品。

(3)押金扣除和計費:在解鎖儲物柜時,系統(tǒng)會自動扣除用戶的押金(預(yù)付金)。智能儲物柜根據(jù)使用時間進行計費,用戶只需根據(jù)實際使用時間支付相應(yīng)費用。

(4)存取物品:一旦用戶成功解鎖儲物柜,他們就可以將物品存放或取出。用戶可以隨時存取自己的物品,并享受到安全可靠的儲物體驗。

(5)臨時解鎖功能:如果用戶需要頻繁存取物品,儲物柜提供了臨時解鎖功能。用戶可以選擇設(shè)置一段時間內(nèi)的臨時解鎖,無需重復(fù)進行解鎖操作,方便快捷。

(6)訂單結(jié)算:用戶在使用完成后,可以通過微信小程序完成訂單結(jié)算。系統(tǒng)會根據(jù)實際使用時間和費率進行計算,并生成相應(yīng)的費用清單供用戶支付。

整體系統(tǒng)流程框架圖:

image-20230925153026023

做好的柜子效果如下: (柜子不帶屏幕的,全部操作在微信小程序上進行)

image-20230925151722754

二、軟硬件選型

2.1 硬件選型

智能儲物柜所需的硬件主要包括下面幾個部分:

(1)主控芯片:采用STC12C5A60S2主控芯片,具有低功耗、高性能和豐富的外設(shè)接口,能夠滿足儲物柜的控制需求。

(2)4G聯(lián)網(wǎng)模塊:采用華為云IOT提供的4G聯(lián)網(wǎng)模塊E29 Cat-1,確保儲物柜具備穩(wěn)定的網(wǎng)絡(luò)連接功能,實現(xiàn)遠程數(shù)據(jù)傳輸和管理。

(3)電磁鎖(每個小柜子一個電磁鎖):儲物柜采用電磁鎖作為解鎖和上鎖的裝置,能夠快速、安全地實現(xiàn)儲物柜的開關(guān)操作。電磁鎖具有較高的穩(wěn)定性和安全性。

(4)電源系統(tǒng):儲物柜需要一個可靠的電源系統(tǒng)來供電,以確保儲物柜的正常運行。

(5)外殼和結(jié)構(gòu)組件:儲物柜外殼。

采用主控板:

image-20230925150325217

采用的電磁鎖:

image-20230925150848200

采用的柜子:

image-20230925151803556

2.2 軟件選型

軟件包含了4個部分。

(1)設(shè)備端的程序開發(fā),智能儲物柜設(shè)備端的程序。

(2)華為云IOT物聯(lián)網(wǎng)服務(wù)器的配置。設(shè)備注冊、消息轉(zhuǎn)發(fā)。

(3)智能鎖的后臺云服務(wù)器搭建。

(4)小程序、公眾號程序開發(fā)。

在這里插入圖片描述

三、華為云物聯(lián)網(wǎng)服務(wù)器部署

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

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

image-20230801151136153

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

image-20230925155200396

image-20230925155233810

總結(jié):

端口號:   MQTT (1883)  
接入地址: e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com

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

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

C:Users11266>ping e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com

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

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

C:Users11266>

image-20230925155314730

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

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

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

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

image-20230925155450476

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

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

image-20230925155543528

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

image-20230925155557999

(4)添加自定義模型

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

image-20230925155634106

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

先點擊自定義模型。

image-20230925155710677

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

image-20230925155738113

接著點擊新增屬性。

image-20230925155908114

設(shè)置屬性。

image-20230925155933814

屬性添加成功。

image-20230925155956728

3.4 添加設(shè)備

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

(1)注冊設(shè)備

image-20230925160050686

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

設(shè)備標(biāo)識碼、密碼這些根據(jù)自己情況認(rèn)真填寫。

image-20230925160152785

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

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

image-20230925160232066

創(chuàng)建之后,得到的設(shè)備信息如下:

{
    "device_id": "65113d05a559fd7cd41435f8_lock1",
    "secret": "12345678"
}

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

可以點擊設(shè)備進入到設(shè)備詳情頁面。

image-20230925160613806

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

(1)主題訂閱格式

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

image-20230801151350067

image-20230801151355027

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

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

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

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

最終的格式:
$oc/devices/65113d05a559fd7cd41435f8_lock1/sys/messages/down

?

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

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

這個操作稱為:屬性上報。

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

image-20230925160939978

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

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

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

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

根據(jù)這個格式,組合一次上傳的屬性數(shù)據(jù):
{"services": [{"service_id": "lock","properties":{"lock":1}}]}

3.6 MQTT三元組

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

接下來介紹,華為云平臺的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 是加密端口更加安全。但是單片機上使用比較困難,所以當(dāng)前的設(shè)備是采用1883端口進連接的。

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

華為云的MQTT服務(wù)器地址:117.78.5.125
域名:e244e6efb9.st1.iotda-device.cn-north-4.myhuaweicloud.com
華為云的MQTT端口號:1883

注意! 具體要看這里:

image-20230925161111346

(2)生成MQTT三元組

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

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

下面是打開的頁面:

image-20230801151418248

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

image-20230925161154059

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

ClientId 65113d05a559fd7cd41435f8_lock1_0_0_2023092508
Username 65113d05a559fd7cd41435f8_lock1
Password 1a3e7f486aa551bca7b6ff5c19c29d2006e940ec1f98ab416e10be1288106953

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

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

(1)填入登錄信息

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

image-20230925161345360

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

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

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

image-20230925161426088

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

3.8 添加控制命令(云端控制設(shè)備)

在產(chǎn)品頁面,添加控制命令。

image-20230925162251674

根據(jù)自己設(shè)備的情況填寫需要發(fā)送的控制命令。

image-20230925162418179

image-20230925162526196

3.9 云端發(fā)送控制命令

在設(shè)備頁面測試剛才添加的命令。

image-20230925162711916

image-20230925162751673

點擊確定之后,在MQTT客戶端上就能收到云端下發(fā)的控制命令。

說明:當(dāng)前的MQTT客戶端實際就是模擬的真實設(shè)備。 真實設(shè)備收到控制命令就可以判斷,完成鎖的開關(guān)控制。

image-20230925162830773

這個下發(fā)的命令是有反饋。設(shè)備端收到之后,可以向服務(wù)器反饋狀態(tài),這樣服務(wù)器才能知道剛才的控制命令確實發(fā)送成功了。

設(shè)備收到信息之后,上傳回應(yīng)給服務(wù)器的主題和內(nèi)容格式:

Topic:$oc/devices/{device_id}/sys/commands/response/request_id={request_id}
數(shù)據(jù)格式:  
{
    "result_code": 0,
    "response_name": "COMMAND_RESPONSE",
    "paras": {
        "result": "success"
    }
}

云端發(fā)送控制命令之后,設(shè)備收到的消息如下:

$oc/devices/65113d05a559fd7cd41435f8_lock1/sys/commands/request_id=d49f0bb9-ba87-4c9b-b915-98a1f0fcf689{"paras":{"lock":true},"service_id":"lock","command_name":"鎖開關(guān)控制"}

其中request_id=d49f0bb9-ba87-4c9b-b915-98a1f0fcf689 就是本次的請求ID?;貞?yīng)的時候需要加上請求ID。服務(wù)器才好對應(yīng)。

以當(dāng)前設(shè)備為例:

發(fā)布的主題這樣填: $oc/devices/65113d05a559fd7cd41435f8_lock1/sys/commands/response/request_id=ce49181e-7636-4b24-946d-c034ca083c1c
    
發(fā)布的內(nèi)容這樣填:
{"result_code":0,"response_name":"COMMAND_RESPONSE","paras":{"result":"success"}}

在MQTT軟件里這樣填:

image-20230925163506474

MQTT回應(yīng)之后,可以在云端的發(fā)送命令界面,看到右上角有彈窗提示,命令下發(fā)成功。

image-20230925163208848

四、微信小程序開發(fā)

如果要開發(fā)自己的上位機,遠程控制設(shè)備。

一般有兩種需求。

(1)獲取設(shè)備的狀態(tài)。

(2)給設(shè)備發(fā)送控制指令。

那么下面就介紹這兩種接口如何使用,就是標(biāo)準(zhǔn)的HTTPS接口。

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

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

設(shè)備影子介紹:

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

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

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

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

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

(調(diào)試的時候,可以選擇只填必填項)

image-20230925161642973

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

{
 "device_id": "65113d05a559fd7cd41435f8_lock1",
 "shadow": [
  {
   "service_id": "lock",
   "desired": {
    "properties": null,
    "event_time": null
   },
   "reported": {
    "properties": {
     "lock": 1
    },
    "event_time": "20230925T081357Z"
   },
   "version": 0
  }
 ]
}

4.2 控制命令發(fā)送(API接口)

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

image-20230925164327371

在線調(diào)試地址:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/debug?api=CreateCommand

填寫需要發(fā)送給設(shè)備的消息。

image-20230925164546678

{"lock":1}

設(shè)備端可以收到下發(fā)的命令

image-20230925164631704

設(shè)備端收到下發(fā)命令之后,也可以向服務(wù)器反饋狀態(tài),反饋的方式在前面的3.9小節(jié)已經(jīng)介紹過了。

4.3 創(chuàng)建IAM賬戶

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

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

獲取Token時,除了AIM賬號外,還需要項目憑證:

9254586ba43841e6bf4995dc24023d6b

image-20230925165102886

鼠標(biāo)點擊自己昵稱,點擊統(tǒng)一身份認(rèn)證。

點擊左上角創(chuàng)建用戶。

image-20230313175315289

image-20221207161209880

image-20221207161308917

image-20221207161327200

創(chuàng)建成功:

image-20221212174359962

image-20221212174412097

用戶創(chuàng)建成功。

image-20230925165154324

4.4 TOKEN動態(tài)獲取

調(diào)用服務(wù)器的API接口都需要填寫token,下面介紹如何通過賬號信息動態(tài)獲取token(正常的token時效性是24小時)。

幫助文檔:https://support.huaweicloud.com/api-iam/iam_30_0001.html#section4

image-20230925170016192

請求地址:

POST https://iam.<服務(wù)ID>.myhuaweicloud.com/v3/auth/tokens

請求參數(shù):

{
    "auth": {
        "identity": {
            "methods": [
                "password"
            ],
            "password": {
                "user": {
                    "domain": {
                        "name": "IAMDomain"        //IAM用戶所屬帳號名(華為云的主賬號)
                    },
                    "name": "IAMUser",             //IAM用戶名(剛才創(chuàng)建的)
                    "password": "IAMPassword"      //IAM用戶密碼(剛才創(chuàng)建的)
                }
            }
        },
        "scope": {
            "project": {
                "name": "cn-north-1"               //服務(wù)ID(創(chuàng)建產(chǎn)品時創(chuàng)建的)
            }
        }
    }
}

Qt編寫的示例代碼:

/*
功能: 獲取token
*/
void Widget::GetToken()
{
    QString requestUrl;
    QNetworkRequest request;

    //設(shè)置請求地址
    QUrl url;

    //獲取token請求地址
    requestUrl = QString("https://iam.%1.myhuaweicloud.com/v3/auth/tokens")
                 .arg(SERVER_ID);

    //自己創(chuàng)建的TCP服務(wù)器,測試用
    //requestUrl="http://10.0.0.6:8080";

    //設(shè)置數(shù)據(jù)提交格式
    request.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/json;charset=UTF-8"));

    //構(gòu)造請求
    url.setUrl(requestUrl);

    request.setUrl(url);

    QString text =QString("{"auth":{"identity":{"methods":["password"],"password":"
    "{"user":{"domain": {"
    ""name":"%1"},"name": "%2","password": "%3"}}},"
    ""scope":{"project":{"name":"%4"}}}}")
            .arg(MAIN_USER)
            .arg(IAM_USER)
            .arg(IAM_PASSWORD)
            .arg(SERVER_ID);

    //發(fā)送請求
    manager->post(request, text.toUtf8());
}

4.5 規(guī)則轉(zhuǎn)發(fā)

為了能讓自己的私有服務(wù)器收到設(shè)備的狀態(tài)變化,可以在華為云物聯(lián)網(wǎng)服務(wù)器上創(chuàng)建轉(zhuǎn)發(fā)規(guī)則。

(1)創(chuàng)建規(guī)則

image-20230925170635632

填充規(guī)則轉(zhuǎn)發(fā)的信息:

參數(shù)名 參數(shù)說明
規(guī)則名稱 自定義,如: led_obs。
規(guī)則描述 自定義,如數(shù)據(jù)轉(zhuǎn)發(fā)至OBS服務(wù)。
數(shù)據(jù)來源 選擇“設(shè)備屬性”。
觸發(fā)事件 自動匹配“設(shè)備屬性上報”。
資源空間 和上一步創(chuàng)建的產(chǎn)品所在的資源空間保持一致。

(2)創(chuàng)建屬性:設(shè)備上報消息時觸動轉(zhuǎn)發(fā)規(guī)則

image-20230925170830858

image-20230925170914880

image-20230925170929848

(3)添加轉(zhuǎn)發(fā)規(guī)則

可以根據(jù)自己的需求設(shè)置目的地址。

image-20230925170959685

如果自己有私有服務(wù)器,創(chuàng)建轉(zhuǎn)發(fā)規(guī)則即可。

image-20230925171126233

五、硬件端代碼開發(fā)

5.1 E29 Cat-1模塊

全網(wǎng)通E29 Cat-1 支持多種協(xié)議基于4G網(wǎng)絡(luò),具有速度快,延遲低等特點,Cat-1相比于4G有具有更低的功耗。
    
全網(wǎng)通E29Cat-1模塊的特點:
1.TAS-E29 Cat-1全網(wǎng)通芯片
2.4G全網(wǎng)通Cat-1芯片
3.支持TCP/UDP/MQTT/HTTP等多種協(xié)議
4.基于4G網(wǎng)絡(luò),網(wǎng)絡(luò)速度快
5.功耗比4G芯片低40%
6.支持標(biāo)準(zhǔn)AT指令、短信透傳
7.中英文短信透傳/配置
8.支持LBS基站定位
9.modbus輪詢技術(shù)、自定義心跳包、注冊包。

5.2 4G模塊與MQTT服務(wù)器交互常用的AT指令

AT:檢查模塊是否正常工作并響應(yīng)AT指令。

AT+CGATT:激活或取消激活GPRS附著。在使用EC20模塊進行網(wǎng)絡(luò)通信之前,需要先激活GPRS附著。

AT+CIPSHUT:關(guān)閉移動場景TCP/IP連接。使用該指令可以關(guān)閉之前建立的TCP連接。

AT+CIPSTART:建立TCP或UDP連接到遠程服務(wù)器。對于MQTT協(xié)議,首先需要使用AT+CIPSTART建立到MQTT服務(wù)器的TCP連接。

AT+CIPSEND:發(fā)送數(shù)據(jù)到TCP或UDP連接。對于MQTT協(xié)議,您可以使用該指令發(fā)送MQTT數(shù)據(jù)包,例如訂閱主題、發(fā)布消息等。

AT+CIPCLOSE:關(guān)閉TCP或UDP連接。

AT+CMQTTUSR:設(shè)置MQTT連接的用戶名。

AT+CMQTTPASS:設(shè)置MQTT連接的密碼。

AT+CMQTTACCQ:設(shè)置MQTT連接的客戶端ID。

AT+CMQTTCONN:連接到MQTT服務(wù)器。在設(shè)置好MQTT連接參數(shù)后,使用該指令進行連接。

AT+CMQTTPUB:發(fā)布MQTT消息。使用該指令發(fā)布消息到指定的主題。

AT+CMQTTSUB:訂閱MQTT主題。使用該指令訂閱感興趣的主題,當(dāng)有消息發(fā)布到該主題時,EC20模塊會收到相應(yīng)的回調(diào)。

AT+CMQTTUNS:取消訂閱MQTT主題。使用該指令取消已經(jīng)訂閱的主題。

5.3 MQTT連接主要代碼

核心代碼模板:

// 引入必要的庫
#include <reg51.h>
#include <string.h>

// 定義串口通信相關(guān)的寄存器地址
#define UART_BAUD_RATE_H 0xFD // 波特率高位
#define UART_BAUD_RATE_L 0xFE // 波特率低位
#define UART_CONTROL_REG 0x98 // 控制寄存器地址

// 定義MQTT服務(wù)器信息
#define MQTT_SERVER "mqtt.example.com" // MQTT服務(wù)器地址
#define MQTT_PORT "1883" // MQTT端口號

// 定義設(shè)備ID和認(rèn)證信息
#define DEVICE_ID "your_device_id" // 設(shè)備ID
#define USERNAME "your_username" // 用戶名
#define PASSWORD "your_password" // 密碼

// 定義訂閱和發(fā)布的主題
#define SUBSCRIBE_TOPIC "your_subscribe_topic" // 訂閱主題
#define PUBLISH_TOPIC "your_publish_topic" // 發(fā)布主題

// 定義MQTT協(xié)議相關(guān)指令
#define CONNECT_CMD "AT+CMQTTCONN="" MQTT_SERVER "","" MQTT_PORT "","" DEVICE_ID "","" USERNAME "","" PASSWORD ""rn" // 連接指令
#define SUBSCRIBE_CMD "AT+CMQTTSUB="" SUBSCRIBE_TOPIC "",1rn" // 訂閱指令
#define PUBLISH_CMD "AT+CMQTTPUB="" PUBLISH_TOPIC "",0,0,0,"your_message"rn" // 發(fā)布指令

// 定義串口發(fā)送函數(shù)
void UART_SendString(char *str) {
    while (*str) {
        SBUF = *str;
        while (!TI);
        TI = 0;
        str++;
    }
}

// 主函數(shù)
void main() {
    // 配置串口通信波特率為9600bps
    PCON = 0x00;
    TMOD = 0x20;
    TH1 = UART_BAUD_RATE_H;
    TL1 = UART_BAUD_RATE_L;
    TR1 = 1;
    SCON = UART_CONTROL_REG;

    // 連接MQTT服務(wù)器
    UART_SendString(CONNECT_CMD);

    // 等待連接成功的回復(fù)
    // 編寫等待回復(fù)的代碼

    // 訂閱主題
    UART_SendString(SUBSCRIBE_CMD);

    // 等待訂閱成功的回復(fù)
    // 編寫等待回復(fù)的代碼

    // 設(shè)備登錄成功,進入循環(huán)
    while (1) {
        // 定時上報數(shù)據(jù),可以根據(jù)需求設(shè)置時間間隔
        // 這里使用延時函數(shù)模擬時間間隔
        delay(5000); 

        // 上報數(shù)據(jù)到指定主題
        UART_SendString(PUBLISH_CMD);
        
        // 等待上報完成的回復(fù)
        // 編寫等待回復(fù)的代碼
    }
}

4.4 鎖控制代碼

// 引入必要的庫
#include <reg51.h>
#include <string.h>

// 定義串口通信相關(guān)的寄存器地址
#define UART_BAUD_RATE_H 0xFD // 波特率高位
#define UART_BAUD_RATE_L 0xFE // 波特率低位
#define UART_CONTROL_REG 0x98 // 控制寄存器地址

// 定義MQTT服務(wù)器信息
#define MQTT_SERVER "mqtt.example.com" // MQTT服務(wù)器地址
#define MQTT_PORT "1883" // MQTT端口號

// 定義設(shè)備ID和認(rèn)證信息
#define DEVICE_ID "your_device_id" // 設(shè)備ID
#define USERNAME "your_username" // 用戶名
#define PASSWORD "your_password" // 密碼

// 定義訂閱主題
#define SUBSCRIBE_TOPIC "your_subscribe_topic" // 訂閱主題

// 定義電磁鎖的IO口連接圖紙
#define LOCK_1 P2_0 // 電磁鎖1的控制IO口
#define LOCK_2 P2_1 // 電磁鎖2的控制IO口
#define LOCK_3 P2_2 // 電磁鎖3的控制IO口
#define LOCK_4 P2_3 // 電磁鎖4的控制IO口
#define LOCK_5 P2_4 // 電磁鎖5的控制IO口
#define LOCK_6 P2_5 // 電磁鎖6的控制IO口
#define LOCK_7 P2_6 // 電磁鎖7的控制IO口
#define LOCK_8 P2_7 // 電磁鎖8的控制IO口
#define LOCK_9 P3_0 // 電磁鎖9的控制IO口
#define LOCK_10 P3_1 // 電磁鎖10的控制IO口
#define LOCK_11 P3_2 // 電磁鎖11的控制IO口
#define LOCK_12 P3_3 // 電磁鎖12的控制IO口


// 定義MQTT協(xié)議相關(guān)指令
#define CONNECT_CMD "AT+CMQTTCONN="" MQTT_SERVER "","" MQTT_PORT "","" DEVICE_ID "","" USERNAME "","" PASSWORD ""rn" // 連接指令
#define SUBSCRIBE_CMD "AT+CMQTTSUB="" SUBSCRIBE_TOPIC "",1rn" // 訂閱指令

// 定義串口發(fā)送函數(shù)
void UART_SendString(char *str) {
    while (*str) {
        SBUF = *str;
        while (!TI);
        TI = 0;
        str++;
    }
}

// 電磁鎖控制函數(shù)
void controlLock(int lockNumber, int lockState) {
    switch (lockNumber) {
    case 3:
        // 控制電磁鎖3
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_3 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_3 = 0;
        }
        break;
    case 4:
        // 控制電磁鎖4
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_4 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_4 = 0;
        }
        break;
    case 5:
        // 控制電磁鎖5
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_5 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_5 = 0;
        }
        break;
    case 6:
        // 控制電磁鎖6
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_6 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_6 = 0;
        }
        break;
    case 7:
        // 控制電磁鎖7
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_7 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_7 = 0;
        }
        break;
    case 8:
        // 控制電磁鎖8
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_8 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_8 = 0;
        }
        break;
    case 9:
        // 控制電磁鎖9
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_9 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_9 = 0;
        }
        break;
    case 10:
        // 控制電磁鎖10
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_10 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_10 = 0;
        }
        break;
    case 11:
        // 控制電磁鎖11
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_11 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_11 = 0;
        }
        break;
    case 12:
        // 控制電磁鎖12
        if (lockState == 1) {
            // 打開電磁鎖
            LOCK_12 = 1;
        } else {
            // 關(guān)閉電磁鎖
            LOCK_12 = 0;
        }
        break;
    default:
        // 鎖編號無效
        break;
}

}

// 主函數(shù)
void main() {
    // 配置串口通信波特率為9600bps
    PCON = 0x00;
    TMOD = 0x20;
    TH1 = UART_BAUD_RATE_H;
    TL1 = UART_BAUD_RATE_L;
    TR1 = 1;
    SCON = UART_CONTROL_REG;

    // 連接MQTT服務(wù)器
    UART_SendString(CONNECT_CMD);

    // 等待連接成功的回復(fù)
    // 編寫等待回復(fù)的代碼

    // 訂閱主題
    UART_SendString(SUBSCRIBE_CMD);

    // 等待訂閱成功的回復(fù)
    // 編寫等待回復(fù)的代碼

    // 設(shè)備登錄成功,進入循環(huán)
    while (1) {
        // 接收到MQTT消息后,解析并控制對應(yīng)的電磁鎖
        // 編寫接收和解析MQTT消息的代碼
        // 設(shè)備接收到的消息格式為 "LOCK_X_ON" 或 "LOCK_X_OFF",其中 X 為電磁鎖編號

        // 解析消息,并提取電磁鎖編號和狀態(tài)
        int lockNumber; // 電磁鎖編號
        int lockState; // 電磁鎖狀態(tài),0表示關(guān)閉,1表示打開
        if (strncmp(receivedMessage, "LOCK_", 5) == 0) {
            lockNumber = receivedMessage[5] - '0'; // 提取鎖編號
            if (strstr(receivedMessage, "ON") != NULL) {
                lockState = 1; // 提取鎖狀態(tài),ON表示打開
            } else if (strstr(receivedMessage, "OFF") != NULL) {
                lockState = 0; // 提取鎖狀態(tài),OFF表示關(guān)閉
            }

            // 控制對應(yīng)的電磁鎖
            controlLock(lockNumber, lockState);
        }
    }
}

六、總結(jié)

這款基于單片機設(shè)計的智能儲物柜是一種應(yīng)用于游樂場、商場和景區(qū)等場所的便捷儲物解決方案。用戶可以通過微信小程序?qū)崟r查看儲物柜的可用狀態(tài),并選擇指定柜子進行解鎖。

該智能儲物柜支持4G聯(lián)網(wǎng),采用主控芯片STC12C5A60S2和4G聯(lián)網(wǎng)模塊E29 Cat-1來實現(xiàn)與網(wǎng)絡(luò)的連接。用戶在解鎖儲物柜時需要支付押金(預(yù)付金),隨后系統(tǒng)開始計時并按照使用的時間進行收費。儲物柜也支持臨時解鎖和存取物品功能。用戶完成使用后,可以通過微信小程序完成訂單結(jié)算。

儲物柜的鎖采用電磁鎖技術(shù),通過控制相應(yīng)的IO口來實現(xiàn)開鎖或關(guān)鎖。整體而言,該智能儲物柜以單片機為核心,集成了4G通信模塊、電磁鎖和華為云物聯(lián)網(wǎng)服務(wù)器等技術(shù),提供方便、安全的儲物服務(wù)。每個儲物柜都是一個獨立的設(shè)備,通過華為云物聯(lián)網(wǎng)服務(wù)器實現(xiàn)數(shù)據(jù)傳輸和管理。

基于單片機設(shè)計的智能儲物柜在不同場所為用戶提供便捷的儲物解決方案,通過技術(shù)的融合和應(yīng)用,提升用戶體驗和管理效率。

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

相關(guān)推薦