<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ESA2GJK1DH1K_A/" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>
說明
這節測試一下android使用APUConfig配網綁定ESP8266,並通過MQTT和ESP8266實現遠程通信控制
測試准備工作
1.不同版本的PCB需要做不同的操作
2.x版本需要做如下操作:
使用杜邦線把單片機的串口2和WiFi模塊的串口相連接
(STM32)PA3 -- TX(WiFi)
(STM32)PA2 -- RX(WiFi)
撥碼開關撥動位置如下
3.x版本需要做如下操作:
短接跳線帽,讓單片機的串口2和WiFi模塊的串口相連接
4.x版本需要做如下操作:
只安裝上WiFi模組,不要安裝右上角的模組(模組都是使用單片機串口2連接通信,不能同時安裝,否則會造成通信混亂)
2.打開這節的單片機程序
根據自己的PCB版本修改LED,按鍵,和復位模組的引腳
3.安裝APP軟件
測試
1.打開APP,點擊右上角菜單,選擇添加設備 "APUConfig"
2.手機連接自家的路由器,輸入自家路由器密碼
3.長按開發板上面的單片機按鍵引腳大約3S,直至指示燈快閃
2.x版本按鍵和指示燈
3.x版本按鍵和指示燈
4.x版本按鍵和指示燈
4.點擊 APP 綁定設備按鈕
注:android 10 版本會有如下提示
不要點擊取消,一直等待....
點擊確定,然后還是一直等待...
當出現以下頁面的時候點擊下 wifi_8266_bind
綁定成功以后自動跳轉到主頁面,並添加了一個設備
可以點擊下面的地方連接自己原先連接路由器!
5.點擊設備進入設備控制頁面
整體說明
整個程序就是利用MQTT服務器實現APP和設備之間通信.
APP通過和設備配網綁定,讓設備連接上路由器.
通信過程中,APP也獲取到了設備的MAC地址信息.
設備連接上MQTT服務器以后,設備訂閱的主題是: user/設備的MAC地址 設備發布的主題是: device/設備的MAC地址
APP獲取設備的MAC地址后,APP發布的主題是: user/設備的MAC地址 APP訂閱的主題是: device/設備的MAC地址
APP和設備的發布和訂閱的主題相對應,APP和設備的消息發給MQTT服務器以后,MQTT服務器就為各自的消息互相轉發.
程序綁定過程
1.整體
APP連接WiFi模塊發出的無線信號(ssid:wifi_8266_bind; Password:11223344),然后使用UDP和模組進行通信
APP連接上wifi模塊的無線以后,不停的使用udp把路由器信息發給模組
模組接收到路由器信息以后把自身的MAC地址發給APP
2,啟動綁定
3,在定時器里面輪訓 config8266_loop(); 和綁定時快閃led
4.注意
按常理來講,應該是模塊獲取到路由器信息,然后連接上之后再把自己的MAC傳遞給APP,然后實現綁定.
但是以上程序並沒有這樣做,因為測試發現,如果控制了模組連接路由器,會導致APP斷開和wifi的無線連接.
5.現在看下APP的綁定程序,點擊右上角菜單跳轉到綁定頁面
7.設置連接Wifi模組的熱點,發送和接收UDP數據
注意:在啟動連接wifi熱點的同時就不停的每隔一段時間發送UDP數據(路由器名稱和密碼)
只要是連接上wifi的熱點,信息就會發送給wifi模組.
提示:控制android連接WiFi熱點使用的是
接收到模組返回的mac地址數據,攜帶着數據跳轉到mainactivity
8.其它程序是檢測wifi連接狀態,和獲取鏈接的wifi名稱
9.activity 接收數據並把信息存儲listview和數據庫
10,數據庫操作是使用的郭霖寫的litepel
程序MQTT通信過程
1.關於MQTT解析包
mqtt_msg 文件是最底層的mqtt協議封裝文件, 用戶不需要研究
mqtt 文件是在mqtt_msg之上封裝的一套文件,該文件內部處理了mqtt各種通信流程,用戶也是調用這里面的api函數.
具體使用可以接着往下看.
用戶始終記住:和mqtt服務器通信就是和tcp服務器通信.不過他們之間的通信數據需要按照mqtt協議規定.
2.配置所連接的MQTT服務器的參數
3.初始化MQTT變量,注冊相應的回調函數
我編寫的包是以注冊回調函數的形式使用.
4.先使用TCP連接上TCP服務器(MQTT服務器就是TCP服務器嘛)
控制連接服務器使用的是 ConfigModuleNoBlock 框架
5.發送連接MQTT協議
6.把服務器返回的數據交給mqtt_function_connect_ack 函數處理
如果返回的數據是連接成功,此函數便會調用上面注冊的連接成功回調函數
6.在連接成功回調函數中訂閱主題,發布消息
7.連接成功MQTT服務器以后解析MQTT數據是下面的函數
把數據交給這個函數,函數內部解析之后會調用相應的回調函數
8.接收處理MQTT消息
控制繼電器吸合 {"data":"switch","bit":"1","status":"1"}
控制繼電器斷開 {"data":"switch","bit":"1","status":"0"}
查詢繼電器狀態 {"data":"switch","bit":"1","status":"-1"}
9.發送溫濕度數據
10.提示
只要是連接上MQTT了,用戶只需要在任意地方調用訂閱主題和發布消息就可以.
用戶調用其api函數所打包的數據會存儲在mqtt內部緩存管理里面,然后內部自動把數據通過tcp發送出去.
緩存管理是使用的我編寫的 BufferManage
訂閱主題
發布消息
11.提取緩存數據和發送數據的地方
mqtt.c里面就需要這一個修改,替換自己的實際的tcp發送函數,在移植的時候十分的便捷.
關於下面的 mymqtt.timer_out_send = 0; 這個是預防有的模塊發送數據之后需要等待,按照提示修改就可以
wifi模塊透傳模式下每條數據的時間間隔需要保持在20ms以上,所以我直接設置的20
12,可在此處修改緩存管理大小
13.這里有包的使用流程,了解一下就可以,后面有詳細的移植教程
14,現在看APP端的程序
app使用的jar包為: org.eclipse.paho.client.mqttv3-1.2.0
MyMqttCLient是封裝的mqtt文件,用戶后期通信都是使用這個里面的api函數
用戶可以根據自己的mqtt服務器更改參數
15,連接mqtt只需要在一開始的時候調用下
MyMqttClient.sharedCenter().setConnect();//連接MQTT
然后內部就是自動連接.
16,點擊APP頁面上的設備,攜帶着設備的MAC地址信息跳轉到設備控制頁面
17,控制頁面接收跳轉的數據
18.設置一些回調函數,啟動定時器訂閱主題
19.在handler中處理MQTT數據
20.點擊按鈕發布繼電器控制命令
結語
這節測試了基本的MQTT遠程通信控制,在后面的章節中將學習到整個流程是如何實現的.