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