一、 前言
筆者在這先簡單介紹一下自己的整個系統(tǒng),以好讓各位朋友能夠快速了解這篇文章對自己是否有幫助。
1.1 OntNET+硬件方面: STM32F103C8T6 + ESP01S
通過MQTT協(xié)議(筆者是直接給ESP01S刷了MQTT的AT固件,這種方法簡單方便)將采集到的光照、設(shè)備電量和開鎖信息上傳到OneNET平臺(這個過程就是向云平臺你所創(chuàng)建設(shè)備發(fā)布主題),并且也要訂閱云平臺你所創(chuàng)建設(shè)備的主題,這樣你的STM32才能收到云平臺下發(fā)的指令。
教程
視頻教程可參考:新版onenet利用stm32+esp8266接入指南 筆者這部分也是參考這位老師的,她這個接入的視頻教程沒有問題,她這個系列還有其它的視頻,有部分采用的是http協(xié)議的并且是老版OneNET,但其思想是相通的可借鑒。
注意: 她的微信小程序連接云平臺的教程和云平臺下發(fā)指令的教程,實踐有問題,我會在后續(xù)部分詳細說明。云平臺創(chuàng)建設(shè)備,和數(shù)據(jù)上云參考此up,微信小程序連接云平臺和指令下發(fā)建議參考下面博主的教程。
文本教程 可參考下面這位博主的文章,
1.使用新版OneNET創(chuàng)建MQTT設(shè)備遠程控制單片機,OneNET創(chuàng)建設(shè)備,我是跟著上面up做的,但這個文章看后感覺沒有問題。
2.ESP8266-01s入門:AT指令講解、上云與MQTT通信教程,AT指令部分很詳細。
3.使用微信小程序和OneNET平臺MQTT實現(xiàn)51/STM32單片機遠程智能控制和數(shù)據(jù)通信教程 ,他這個教程里ESP8266指令接收與處理ESP8266_ReceiveCmd() 函數(shù)我在實踐時有問題,后續(xù)在相應部分會詳細說明。
1.2 微信小程序方面
4.通過微信小程序獲取oneNET設(shè)備數(shù)據(jù)教程,這部分我也是參考了上面up和這位博主的教程,實踐發(fā)現(xiàn)up的教程有點小問題主要是獲取和推送所用的API方面在新版不適用,,這里用到的API都可以O(shè)neNET的官方文檔和API調(diào)試頁面找到。小程序效果如下圖。
二、STM32代碼部分修改
- 首先要在esp01s的初始化里,加入對云平臺設(shè)備主題進行訂閱的命令。即第7條命令,命令里要修改產(chǎn)品ID和設(shè)備名稱,具體的文本教程有。
注意 不先進行訂閱,后續(xù)小程序進行POST時就會報錯。
/**
* @brief 初始化ESP8266
* @param 無
* @retval 無
*/
void ESP8266_Init(void)
{
ESP8266_Clear();
delay_xms(100);
/* 確認AT命令可以正確發(fā)送并得到響應 */
printf("0. AT\r\n");
while (ESP8266_SendCmd("AT\r\n", "OK"))
delay_xms(100);
/* 重啟ESP8266 */
printf("1. AT+RST\r\n");
while (ESP8266_SendCmd("AT+RST\r\n", ""))
delay_xms(100);
/* 設(shè)置Wi-Fi模式 */
printf("2. CWMODE 設(shè)置Wi-Fi模式\r\n");
while (ESP8266_SendCmd("AT+CWMODE=1\r\n", "OK"))
delay_xms(100);
/* 打開DHCP */
printf("3. AT+CWDHCP 打開DHCP\r\n");
while (ESP8266_SendCmd("AT+CWDHCP=1,1\r\n", "OK"))
delay_xms(100);
/* 配置Wi-Fi連接 */
printf("4. CWJAP 配置Wi-Fi連接\r\n");
while (ESP8266_SendCmd(ESP8266_WIFI_INFO, "GOT IP"))
delay_xms(100);
/* 設(shè)置MQTT登錄用戶信息 */
printf("5. MQTTUSERCFG 設(shè)置MQTT登錄用戶信息\r\n");
while (ESP8266_SendCmd(ESP8266_USERCFG_INFO, "OK"))
delay_xms(100);
/* 發(fā)起向指定MQTT服務器的連接 */
printf("6. MQTTCONN 發(fā)起向指定MQTT服務器的連接\r\n");
while (ESP8266_SendCmd(ESP8266_ONENET_INFO, "OK"))
delay_xms(100);
/* 訂閱指定的MQTT主題 */
printf("7. MQTTSUB 訂閱指定Topic\r\n");
while (ESP8266_SendCmd("AT+MQTTSUB=0,\"$sys/78peC*h6uT/l*ck/thing/property/set\",0\r\n", "OK"))
delay_xms(100);
printf("7. ESP8266 Init OK\r\n");
}
- 要修改文本教程博主extractJsonValue()函數(shù) 該函數(shù)主要是從接收的字符串里提取我們需要的信息。如果碰到錯誤可以把里面的變量值都打印出來看一下,很容易就可以找出問題所在。
/**
* @brief 從JSON字符串中提取出指定鍵的值
* @param *buffer 包含JSON的字符串
* @param *key 指定查找的鍵值
* @param *value 儲存查找的鍵值
* @param valueMaxLen 變量緩沖區(qū)的最大長度
* @retval 無
*/
void extractJsonValue(const char *buffer, const char *key, char *value, size_t valueMaxLen)
{
const char *jsonStart, *jsonEnd, *keyStart, *keyValueEnd;
size_t keyValueLength;
size_t keyLength = strlen(key);
char keyPattern[20]; /* 預留足夠的空間存儲 key 和查找格式串 */
sprintf(keyPattern, "\"%s\"", key); /* 構(gòu)建查找模式串,即 "key": */
/* 查找JSON字符串的開頭 */
jsonStart = strchr(buffer, '{');
if (jsonStart == NULL)
return;
/* 查找JSON字符串的結(jié)尾 */
jsonEnd = strrchr(jsonStart, '}');
if (jsonEnd == NULL)
return;
/* 查找鍵 */
keyStart = strstr(jsonStart, keyPattern);
if (keyStart == NULL)
return;
/* 查找鍵值的結(jié)束 括號 ,確定鍵值的結(jié)束位置 */
keyValueEnd = strchr(keyStart, '}');
if (keyValueEnd == NULL || keyValueEnd > jsonEnd)
return;
/* 根據(jù)鍵值的起始和結(jié)束位置,計算鍵值的長度 */
keyValueLength = keyValueEnd - keyStart;
/* 拷貝鍵值到value緩沖區(qū)中 */
if (keyValueLength < valueMaxLen)
{
strncpy(value, keyStart, keyValueLength);
value[keyValueLength] = '\0'; /* 添加字符串終止字符\0 */
}
else
{
/* 如果提供的緩沖區(qū)不夠大,那么可以根據(jù)實際情況處理,這里簡單地截斷字符串 */
strncpy(value, keyStart, valueMaxLen - 1);
value[valueMaxLen - 1] = '\0'; /* 添加字符串終止字符\0 */
}
}
三、微信小程序修改的部分
- 獲取云平臺數(shù)據(jù)時要使用以下API,并且要把產(chǎn)品ID和設(shè)備名稱都放進去** url: “https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=你的產(chǎn)品ID&device_name=設(shè)備名稱”**
/* 獲取OneNET云平臺設(shè)備數(shù)據(jù) */
get_info() {
/* 發(fā)起 HTTPS 網(wǎng)絡請求 獲取設(shè)備參數(shù) */
wx.request({
/* 網(wǎng)址、產(chǎn)品ID、設(shè)備名 */
url: "https://iot-api.heclouds.com/thingmodel/query-device-property?product_id=78pevkh6uT&device_name=lck",
header: {
/* 用戶鑒權(quán)信息 */
"authorization": "你的鑒權(quán)信息"
},
method: "GET", /* HTTP 請求方法:獲取 */
success: res => {
// console.log("獲取成功", res)
this.setData({
LockState: res.data.data[0].value,
battery_state: res.data.data[1].value,
sunlight: res.data.data[3].value,
})
// console.log("LockState:", this.data.LockState)
// console.log("battery_state:", this.data.battery_state)
// console.log("sunlight:", this.data.sunlight)
}
});
- 使用微信小程序向云平臺推送數(shù)據(jù),并下發(fā)到設(shè)備時,要使用以下API,同時要確保設(shè)備在線,并訂閱了此主題??梢允褂迷破脚_的設(shè)備調(diào)試進行模擬。url: ‘https://iot-api.heclouds.com/thingmodel/set-device-desired-property’
// 以下數(shù)據(jù)和URL應根據(jù)實際情況進行修改
wx.request({
url: 'https://iot-api.heclouds.com/thingmodel/set-device-desired-property',
method: 'POST',
header: {
/* 用戶鑒權(quán)信息 */
"authorization": "鑒權(quán)信息"
},
data: {
"product_id": "產(chǎn)品ID",
"device_name": "設(shè)備名稱",
"params": {
"屬性標識符": 1 /* 使用傳入的ledValue設(shè)置LED的狀態(tài) */
}
},
success: res =>{
console.log("成功",res)
}
});
如果有問題可以在評論區(qū)進行交流、討論。
四、小筆記(個人雜記)
4.1 OneNETOneNET物聯(lián)網(wǎng)開放平臺
OneNET物聯(lián)網(wǎng)開放平臺是中國移動打造的面向產(chǎn)業(yè)互聯(lián)和智慧生活應用的物聯(lián)網(wǎng)PaaS平臺,OneNET支持適配各種網(wǎng)絡環(huán)境和協(xié)議類型,可實現(xiàn)各種傳感器和智能硬件的快速接入,提供豐富的API和應用模板以支撐各類行業(yè)應用和智能硬件的開發(fā),有效降低物聯(lián)網(wǎng)應用開發(fā)和部署成本,滿足物聯(lián)網(wǎng)領(lǐng)域設(shè)備連接、智能化改造、協(xié)議適配、數(shù)據(jù)存儲、數(shù)據(jù)安全以及大數(shù)據(jù)分析等等平臺級服務需求。
產(chǎn)品優(yōu)勢
- 設(shè)備快速開發(fā)
支持MQTT、CoAP、LwM2M、HTTP等多種行業(yè)主流標準協(xié)議及私有協(xié)議接入;支持2G、4G、NB-IoT、Wi-Fi、藍牙、Thread等多種通訊模組接入能力,提供設(shè)備端SDK及基于模組的接入能力,幫助開發(fā)者快速實現(xiàn)設(shè)備接入和產(chǎn)品智能化開發(fā)。 - 一站式應用開發(fā)
提供通用領(lǐng)域服務和行業(yè)業(yè)務建?;A(chǔ)模型,幫助開發(fā)者在線快速構(gòu)建云上應用和進行應用托管;提供和物APP,用戶不必關(guān)注底層實現(xiàn),只需通過配置專屬交互控制界面,即可完成智能家居場景APP應用開發(fā),提高應用開發(fā)效率。 - 高效數(shù)據(jù)處理
提供高可靠的實時消息云服務,保障開發(fā)者業(yè)務穩(wěn)定運行,提供規(guī)則引擎、場景聯(lián)動等能力,幫助開發(fā)者靈活定義設(shè)備數(shù)據(jù)的解析過濾規(guī)則、存儲、輸出等,降低用戶數(shù)據(jù)處理成本。 - 增值服務升級
提供遠程升級OTA、位置定位LBS、消息隊列MQ、數(shù)字可視化View、人工智能AI等增值能力,助力開發(fā)者產(chǎn)品升級;以強大的OneNET生態(tài)為基礎(chǔ),打通國內(nèi)外產(chǎn)品線上線下渠道,助力產(chǎn)品快速出貨和流量變現(xiàn)。以上引自官方文檔。
4.2 MQTT協(xié)議
MQTT(Message Queuing Telemetry Transport) 是一個輕量級的、基于發(fā)布/訂閱模型的消息協(xié)議,專為低帶寬和不穩(wěn)定網(wǎng)絡環(huán)境設(shè)計,廣泛用于物聯(lián)網(wǎng)設(shè)備之間的通信。
在MQTT中,設(shè)備可以作為發(fā)布者發(fā)送消息,或者作為訂閱者接收特定主題(Topic)的消息。這個模型允許多個設(shè)備共享特定的數(shù)據(jù)點并響應相應的變化。
MQTT設(shè)備使用這一協(xié)議,通過輕量級的消息交換,實現(xiàn)設(shè)備間的有效通訊和數(shù)據(jù)傳輸。文章來源:http://www.zghlxwxcb.cn/news/detail-856900.html
- 在OneNET平臺上使用MQTT進行設(shè)備通信時,設(shè)備充當MQTT客戶端,通過發(fā)布(publish)消息到平臺,或者訂閱(subscribe)平臺消息來實現(xiàn)與云端的雙向通信。
- 利用MQTT設(shè)備進行數(shù)據(jù)上傳的步驟通常包括:
- 設(shè)備注冊:在OneNET平臺注冊設(shè)備,獲取設(shè)備ID等必要信息。
- MQTT連接:設(shè)備使用MQTT協(xié)議與OneNET建立連接,完成認證。
- 數(shù)據(jù)上傳:設(shè)備發(fā)布消息到指定的Topic,將數(shù)據(jù)上傳到云平臺。
- 命令下發(fā)及控制:云平臺可發(fā)布消息給設(shè)備,設(shè)備訂閱對應Topic以接收命令或控制信息。
- 實時監(jiān)控:開發(fā)者或用戶利用平臺提供的應用程序接口(API),實現(xiàn)數(shù)據(jù)監(jiān)控和設(shè)備管理。
OneNET的MQTT服務使得IoT設(shè)備能夠以一種穩(wěn)定且高效的方式與云端資源進行交互,使得管理和操作變得更加簡單靈活。
4.3 MQTT與HTTP區(qū)別
MQTT設(shè)備與HTTP設(shè)備在連接OneNET云平臺時使用的協(xié)議不同,各自有著不同的特點和適用場景。以下是兩者的主要區(qū)別:文章來源地址http://www.zghlxwxcb.cn/news/detail-856900.html
MQTT:
- 輕量級協(xié)議:MQTT設(shè)計簡潔,數(shù)據(jù)包小,適用于帶寬有限的情況。
- 節(jié)省能源:設(shè)備可以長時間保持連接狀態(tài),但不會頻繁發(fā)送數(shù)據(jù),適合用電池供電的設(shè)備。
- 支持離線消息:通過“遺囑消息”等機制,即使設(shè)備離線也能保證一定程度的消息傳遞。
- 低延遲:基于發(fā)布/訂閱機制,可以快速響應和分發(fā)消息,幾乎實時的通訊體驗。
- 支持多對一和一對多通訊:一個主題可以有多個訂閱者,適用于廣播和分布式消息通訊。
HTTP:
- 基于請求/響應模式:客戶端發(fā)起請求,服務器回應請求,沒有長期連接狀態(tài)。
- 更加通用和普遍:HTTP作為互聯(lián)網(wǎng)的基礎(chǔ)協(xié)議,被絕大多數(shù)網(wǎng)絡應用支持。
- 連接簡單:HTTP的無狀態(tài)特性使得每次通信簡潔明了,但每次交互都需要重新建立連接。
- 相對較高的功耗和延遲:因為需要頻繁的連接建立和斷開,對能量消耗和通信延遲有影響。
在物聯(lián)網(wǎng)應用中,選擇MQTT還是HTTP通常取決于特定的需求和場景。如果需要低功耗、持續(xù)連接、低延遲及大量設(shè)備間通信的應用,MQTT是更好的選擇。而對于偶爾傳送數(shù)據(jù)或者和現(xiàn)有Web服務進行交互的應用,HTTP可能更為合適。
OneNET云平臺提供了對這兩種協(xié)議的支持,以滿足不同物聯(lián)網(wǎng)項目的需求。開發(fā)者可以根據(jù)具體情況選擇最適合的通信方式。
到了這里,關(guān)于【OneNET】_01_使用微信小程序通過新版OneNET平臺獲取STM32設(shè)備信息并進行控制的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!