一、項目介紹
在游樂場、商場、景區(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)流程框架圖:
做好的柜子效果如下: (柜子不帶屏幕的,全部操作在微信小程序上進行)
二、軟硬件選型
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)組件:儲物柜外殼。
采用主控板:
采用的電磁鎖:
采用的柜子:
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
點擊總覽
,查看接入信息。 我們當(dāng)前設(shè)備準(zhǔn)備采用MQTT協(xié)議接入華為云平臺,這里可以看到MQTT協(xié)議的地址和端口號等信息。
總結(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>
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)品。
(2)填寫產(chǎn)品信息
根據(jù)自己產(chǎn)品名字填寫。
(3)產(chǎn)品創(chuàng)建成功
(4)添加自定義模型
產(chǎn)品創(chuàng)建完成之后,點擊進入產(chǎn)品詳情頁面,翻到最下面可以看到模型定義。
這個模型就是定義自己設(shè)備接下來需要向服務(wù)器上傳那些數(shù)據(jù)類型。根據(jù)自己的數(shù)據(jù)類型進行編寫。
先點擊自定義模型。
再創(chuàng)建一個服務(wù)ID。
接著點擊新增屬性。
設(shè)置屬性。
屬性添加成功。
3.4 添加設(shè)備
產(chǎn)品是屬于上層的抽象模型,接下來在產(chǎn)品模型下添加實際的設(shè)備。添加的設(shè)備最終需要與真實的設(shè)備關(guān)聯(lián)在一起,完成數(shù)據(jù)交互。
(1)注冊設(shè)備
(2)根據(jù)自己的設(shè)備填寫
設(shè)備標(biāo)識碼、密碼這些根據(jù)自己情況認(rèn)真填寫。
(3)保存設(shè)備信息
創(chuàng)建完畢之后,點擊保存并關(guān)閉,得到創(chuàng)建的設(shè)備密匙信息。該信息在后續(xù)生成MQTT三元組的時候需要使用。
創(chuàng)建之后,得到的設(shè)備信息如下:
{
"device_id": "65113d05a559fd7cd41435f8_lock1",
"secret": "12345678"
}
(4)設(shè)備創(chuàng)建完成
可以點擊設(shè)備進入到設(shè)備詳情頁面。
3.5 MQTT協(xié)議主題訂閱與發(fā)布
(1)主題訂閱格式
幫助文檔地址:https://support.huaweicloud.com/devg-iothub/iot_02_2200.html
對于設(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
根據(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
注意! 具體要看這里:
(2)生成MQTT三元組
華為云提供了一個在線工具,用來生成MQTT鑒權(quán)三元組: https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/
打開這個工具,填入設(shè)備的信息(也就是剛才創(chuàng)建完設(shè)備之后保存的信息),點擊生成,就可以得到MQTT的登錄信息了。
下面是打開的頁面:
填入設(shè)備的信息: (上面兩行就是設(shè)備創(chuàng)建完成之后保存得到的)
得到三元組之后,設(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ā)布主題。
(2)打開網(wǎng)頁查看
完成上面的操作之后,打開華為云網(wǎng)頁后臺,可以看到設(shè)備已經(jīng)在線了。
點擊詳情頁面,可以看到上傳的數(shù)據(jù)。
到此,云平臺的部署已經(jīng)完成,設(shè)備已經(jīng)可以正常上傳數(shù)據(jù)了。
3.8 添加控制命令(云端控制設(shè)備)
在產(chǎn)品頁面,添加控制命令。
根據(jù)自己設(shè)備的情況填寫需要發(fā)送的控制命令。
3.9 云端發(fā)送控制命令
在設(shè)備頁面測試剛才添加的命令。
點擊確定之后,在MQTT客戶端上就能收到云端下發(fā)的控制命令。
說明:當(dāng)前的MQTT客戶端實際就是模擬的真實設(shè)備。 真實設(shè)備收到控制命令就可以判斷,完成鎖的開關(guān)控制。
這個下發(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軟件里這樣填:
MQTT回應(yīng)之后,可以在云端的發(fā)送命令界面,看到右上角有彈窗提示,命令下發(fā)成功。
四、微信小程序開發(fā)
一般有兩種需求。
(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)試的時候,可以選擇只填必填項)
設(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
在線調(diào)試地址:https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/debug?api=CreateCommand
填寫需要發(fā)送給設(shè)備的消息。
{"lock":1}
設(shè)備端可以收到下發(fā)的命令
設(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
鼠標(biāo)點擊自己昵稱,點擊統(tǒng)一身份認(rèn)證。
點擊左上角創(chuàng)建用戶
。
創(chuàng)建成功:
用戶創(chuàng)建成功。
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
請求地址:
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ī)則
填充規(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ī)則
(3)添加轉(zhuǎn)發(fā)規(guī)則
可以根據(jù)自己的需求設(shè)置目的地址。
如果自己有私有服務(wù)器,創(chuàng)建轉(zhuǎn)發(fā)規(guī)則即可。
五、硬件端代碼開發(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)用,提升用戶體驗和管理效率。