微信物聯網生態主要分在微信硬件開發平台與騰訊物聯開發平台,前者已經停止維護,但依然有着很大的學習價值,而后者作為主推的平台,集成很多功能,包括從微信小程序實現配網到控制;
為了兼顧更多的朋友和自己的學習筆記,我將會一直更新此專題筆記,歡迎關注本人CSDN半顆心臟,帶你走進前沿領域,學習前沿技術!
自搭微信服務器&&微信硬件開發平台
【微信小程序控制硬件第1篇 】 全網首發,借助 emq 消息服務器帶你如何搭建微信小程序的mqtt服務器,輕松控制智能硬件!
【微信小程序控制硬件第2篇 】 開始微信小程序之旅,導入小程序Mqtt客戶端源碼,實現簡單的驗證和通訊於服務器!
【微信小程序控制硬件第3篇 】 從軟件到硬件搭建一個微信小程序控制esp8266的項目,自定義通訊協議,為面試職位和比賽項目加分!
【微信小程序控制硬件第4篇 】 深度剖析微信公眾號配網 Airkiss 原理與過程,esp8266如何自定義回調參數給微信,實現綁定設備第一步!
【微信小程序控制硬件第5篇 】理清接下來必須走的架構思想,學習下 JavaScript 的觀察者模式,在微信小程序多頁面同時接收到設備推送事件!
【微信小程序控制硬件第6篇 】服務器如何集成七牛雲存儲SDK,把用戶自定義設備圖片存儲在第三方服務器!
【微信小程序控制硬件第7篇 】動起來做一個微信小程序Mqtt協議控制智能硬件的框架,為自己心里全棧工程師夢想澆水!!
【微信小程序控制硬件第8篇 】微信小程序以 websocket 連接阿里雲IOT物聯網平台mqtt服務器,封裝起來使用就是這么簡單!
【微信小程序控制硬件第9篇 】巧借阿里雲物聯網平台的免費連接,從微信小程序顏色采集控制 esp8266 輸出七彩燈效果,中秋節來個直播如何?!
【微信公眾號控制硬件 第10篇 】如何在微信公眾號網頁實現連接mqtt服務器教程!!
【微信小程序控制硬件 第11篇 】全網首發,微信小程序ble藍牙控制esp32,實現無需網絡也可以控制亮度開關。
【微信小程序控制硬件 第12篇 】微信小程序藍牙控制硬件應如何開發?為您全面解析微信小程序藍牙API的使用。
【微信小程序控制硬件 第13篇 】安信可B站直播學習總結,微信小程序MQTT遠程控制ESP8266 NodeMCU,談談微信生態那些事。
騰訊物聯開發平台
【騰訊連連 - 騰訊物聯開發平台 第1篇 】騰訊官方靜雞雞發布的“騰訊連連”終於來了,按照官方教程教你在微信小程序實現配網、控制 ESP8266啦!
【騰訊連連 - 騰訊物聯開發平台 第2篇 】深度解析微信小程序smartconfig配網原理,安信可ESP-12S直連騰訊物聯開發平台!!
文章目錄
前言
終於更新了跨平台的騰訊小程序控制ESP8266的第二篇了,因為我這里已經做好了全部工作,這幾篇先給大家做些理論的知識,對往后的開發埋下扎實的基礎;
因為現在的騰訊小程序已經支持ESP8266的一鍵配網了,即smartconfig! 是不是感覺國內物聯網正在慢慢前進?跟着我的筆記慢慢學習吧!
一 SmartConfig配網簡介及交互流程
1.1 WiFi配網是什么
WiFi
配網指的是,由外部向WiFi設備提供SSID
和密碼(PSW),讓WiFi設備可以連接指定的熱點或路由器並加入后者所建立的WiFi網絡。對於具備豐富人機界面包括屏幕/鍵盤的設備比如電腦或者手機,可以直接輸入SSID/PSW
來進行連接,而對於不具備豐富人機交互界面的物聯網WiFi設備比如智能燈、掃地機器人等,則可以借助手機等智能設備,以某種配網方式將SSID/PSW
告訴該設備。
1.2 SmartConfig配網及設備綁定
SmartConfig
方式配網的基本原理是先讓設備進入WiFi
混雜模式(promiscuous mode)以監聽捕獲周圍的WiFi報文,由於設備還沒有聯網,而WiFi
網絡的數據幀是通過加密的,設備無法知道payload
的內容,但是可以知道報文的某些特征數據比如每個報文的長度,同時對於某些數據幀比如UDP
的廣播包或多播包,其報文的幀頭結構比較固定,可以很容易的識別出來。
這個時候在手機app或者小程序測,就可以通過發送UDP
的廣播包或者多播包,聰明的開發者利用報文的特征比如長度變化來進行編碼,將目標WiFi路由器的SSID/PSW
字符以約定的編碼方式發送出去,設備端在捕獲到UDP報文后按約定的方式進行解碼就可以得到目標WiFi路由器的相關信息並進行聯網。
SmartConfig
方式配網,在編碼方式和報文選擇上面,每個廠商有自己的協議,對於ESP8266
,采用的是樂鑫ESP-TOUCH協議。
基於該協議,設備端在連接WiFi路由器成功之后,會告知手機端自己的IP地址,這個時候手機端可以通過數據通道比如TCP/UDP
通訊將后台提供的配網token
發送給設備,並由設備轉發至物聯網后台,依據token可以進行設備綁定。
目前騰訊連連小程序已經支持采用ESP-TOUCH
協議進行SmartConfig配網,並提供了相應的小程序SDK.
下面是騰訊連連小程序SmartConfig方式配網及設備綁定的示例流程圖:
二 SmartConfig配網設備端與騰訊連連小程序及后台交互的數據協議
-
騰訊連連小程序進入配網模式后,會從物聯網開發平台服務獲取到當次配網的token,小程序相關操作可以參考 生成Wi-Fi設備配網Token
-
使WiFi設備進入SmartConfig配網模式,看到設備有指示燈在快閃,則說明進入配網模式成功。
-
小程序按照提示依次獲取WiFi列表,輸入家里目標路由器的SSID/PSW,按下一步之后就會通過SmartConfig方式發送報文。
-
設備端通過監聽捕獲SmartConfig報文,解析出目標路由器的SSID/PSW並進行聯網,聯網成功之后設備會告知小程序自己的IP地址,同時開始連接物聯網后台。
-
小程序作為UDP客戶端會連接WiFi設備上面的UDP服務(默認端口為8266),給設備發送配網token,JSON格式為:
{"cmdType":0,"token":"6ab82618a9d529a2ee777bf6e528a0fd"}
發送完了之后等待設備UDP回復設備信息及配網協議版本號:
{"cmdType":2,"productId":"OSPB5ASRWT","deviceName":"dev_01","protoVersion":"2.0"}
-
如果2秒之內沒有收到設備回復,則重復步驟5,UDP客戶端重復發送配網token。
如果重復發送5次都沒有收到回復,則認為配網失敗,WiFi設備有異常。 -
如果步驟5收到設備回復,則說明設備端已經收到token,並准備上報token。這個時候小程序會開始通過token輪詢物聯網后台來確認配網及設備綁定是否成功。小程序相關操作可以參考 查詢配網Token狀態
-
設備端在成功連接WiFi路由器之后,需要通過MQTT連接物聯網后台,並將小程序發送來的配網token通過下面MQTT報文上報給后台服務:
topic: $thing/up/service/ProductID/DeviceName
payload: {"method":"app_bind_token","clientToken":"client-1234","params": {"token":"6ab82618a9d529a2ee777bf6e528a0fd"}}
設備端也可以通過訂閱主題 $thing/down/service/ProductID/DeviceName 來獲取token上報的結果
- 在以上5-7步驟中,如果小程序收到設備UDP服務發送過來的錯誤日志,且deviceReply字段的值為"Current_Error",則表示當前配網綁定過程中出錯,需要退出配網操作。如果deviceReply字段是"Previous_Error",則為上一次配網的出錯日志,只需要上報,不影響當此操作。
錯誤日志JSON格式例子:
{"cmdType":2,"deviceReply":"Current_Error","log":"ESP WIFI connect error! (10, 2)"}
-
如果設備成功上報了token,物聯網后台服務確認了token有效性,小程序會提示配網完成,設備添加成功。
-
設備端會記錄配網的詳細日志,如果配網或者添加設備失敗,還可以讓設備端創建一個特殊的
softAP
和UDP
服務,通過小程序可以從設備端獲取更多日志用於錯誤分析。
三 ESP8266使用SmartConfig配網接口
先上開源倉庫:https://github.com/Ai-Thinker-Open/Ai-Thinker-Open-qcloud-esp-wifi
騰訊雲IoT AT指令ESP8266定制固件
如果ESP-12S模組燒寫了騰訊雲IoT AT指令ESP8266定制固件,則只要通過指令AT+TCDEVINFOSET配置好設備信息,再通過下面的指令啟動SmartConfig配網就可以
AT+TCSTARTSMART
關於AT指令的詳細說明,請參考qcloud-iot-at-esp8266目錄文檔
配網代碼示例
在qcloud-iot-esp8266-demo/main/wifi_config
目錄下,提供了SmartConfig
配網在ESP8266上面的參考實現,用戶可以使用qcloud-iot-esp8266-demo
工程進行體驗。
使用示例,配網接口說明請查看wifi_config/qcloud_wifi_config.h
,可以按照下面方式使用:
/* to use WiFi config and device binding with Wechat mini program */
int wifi_config_state;
int ret = start_smartconfig();
if (ret) {
Log_e("start wifi config failed: %d", ret);
} else {
/* max waiting: 150 * 2000ms */
int wait_cnt = 150;
do {
Log_d("waiting for wifi config result...");
HAL_SleepMs(2000);
wifi_config_state = query_wifi_config_state();
} while (wifi_config_state == WIFI_CONFIG_GOING_ON && wait_cnt--);
}
wifi_connected = is_wifi_config_successful();
if (!wifi_connected) {
Log_e("wifi config failed!");
// setup a softAP to upload log to mini program
start_log_softAP();
}
另外,不要把我的博客作為學習標准,我的只是筆記,難有疏忽之處,如果有,請指出來,也歡迎留言哈!
- 玩轉
esp8266
帶你飛、加群QQ
群,不喜的朋友勿噴勿加:434878850 - 個人郵箱:xuhongv@yeah.net 24小時在線,有發必回復!
- esp8266源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代碼學習匯總(持續更新,歡迎star):https://github.com/xuhongv/StudyInEsp32
- 關注下面微信公眾號二維碼,干貨多多,第一時間推送!