1. 程式人生 > 其它 >STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-功能測試-Android使用組播繫結CH395Q,並通過MQTT和模組實現遠端通訊控制

STM32+CH395Q(乙太網)基本控制篇(自建物聯網平臺)-功能測試-Android使用組播繫結CH395Q,並通過MQTT和模組實現遠端通訊控制

<p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/CH395Q/my.html" frameborder="0" scrolling="auto" width="100%" height="1500"></iframe></p>

說明

這節測試一下Android使用組播繫結CH395Q,,並通過MQTT和模組實現遠端通訊控制

測試

1.下載這節程式到微控制器程式

2.微控制器工程目錄

3.Hex檔案位置

4.把模組用網線和路由器或者交換機

注意,連線路由器或者交換機的時候是連線其LAN口.

5.開啟串列埠除錯助手,檢視程式執行日誌

程式中使用串列埠1作為日誌列印口

6.正常情況下會列印

7.安裝手機APP(android)

8.手機APP安裝包位置

9.點選APP右上方的選單欄,選擇 新增乙太網裝置

10.長按開發板上的繫結按鈕3秒左右,直至指示燈快閃

11.在APP上點選繫結裝置

12,繫結成功以後將會在主頁面新增一個裝置

注:顯示的內容為模組的MAC地址

13.點選裝置進入控制頁面

裝置會顯示當前溫溼度資料,也可以點選按鈕控制開發板上的繼電器

關於MQTT協議

請使用者認真閱讀並自己親自測試一下!

請使用者認真閱讀並自己親自測試一下!

請使用者認真閱讀並自己親自測試一下!

使用者在文章裡面只需要知道MQTT伺服器就是一個TCP伺服器.

MQTT伺服器其實就是安裝一個軟體,後面章節咱們會告訴使用者安裝步驟.

使用者不必研讀文章裡面的MQTT協議,使用者要做的是學會使用!我之所以去研究是因為我需要讓使用者瞭解MQTT是什麼!

使用者不必研讀文章裡面的MQTT協議,使用者要做的是學會使用!我之所以去研究是因為我需要讓使用者瞭解MQTT是什麼!

使用者不必研讀文章裡面的MQTT協議,使用者要做的是學會使用!我之所以去研究是因為我需要讓使用者瞭解MQTT是什麼!

然後其它的能瞭解多少就瞭解多少就可以.

我封裝的C語言版本的MQTT協議包,在後面的教程中會詳細的告訴使用者如何使用,

如何移植到使用者的工程裡面,使用者只需要按部就班的學習就可以.

請使用者認真閱讀上面的文章並自己親自測試一下!

請使用者認真閱讀上面的文章並自己親自測試一下!

請使用者認真閱讀上面的文章並自己親自測試一下!

整體說明

整個程式就是利用MQTT伺服器實現APP和裝置之間通訊.

APP和裝置一開始通過組播通訊的方式進行通訊.

通訊過程中,APP獲取到了裝置的MAC地址資訊.

裝置連線上MQTT伺服器以後,裝置訂閱的主題是: user/裝置的MAC地址 裝置釋出的主題是: device/裝置的MAC地址

APP獲取裝置的MAC地址後,APP釋出的主題是:user/裝置的MAC地址 APP訂閱的主題是:device/裝置的MAC地址

APP和裝置的釋出和訂閱的主題相對應,APP和裝置的訊息發給MQTT伺服器以後,MQTT伺服器就為各自的訊息互相轉發.

程式繫結過程

1.提示

APP和裝置就是在局域網裡面使用組播通訊.

APP點選繫結以後,不停的向組播地址傳送"{"data":"bind","msg":"hello"}"

裝置收到資訊以後把裝置的MAC地址和IP地址傳送給APP,然後二者便完成了繫結.

如果沒有使用過組播,可先學習組播通訊部分.

組播通訊其實就是UDP通訊,只不過ip地址是在一定範圍內.

2.組播的基本情況(我在基本的組播通訊下封裝了繫結流程)

使用socket 0 通訊; 組播地址為:224.1.1.1; 組播埠號為:5558

2,啟動繫結

3,在socket 中斷事件裡面處理接收的資料

4.如果接收到APP傳送的 "{"data":"bind","msg":"hello"}" 就把裝置的MAC地址和IP地址發給APP

5,在定時器裡面輪訓 mubind_loop(); 和繫結時快閃led

6.其它

獲取裝置MAC地址

獲取裝置IP地址

注:MQTT通訊其實用不到IP地址,把IP地址也傳遞給APP是預防後期專案或產品需要用到區域網通訊

7.現在看下APP的程式,點選右上角選單跳轉到繫結頁面

8.設定自己的UDP埠號,註冊接收資料回撥函式

8.點選按鈕以後每隔一段時間傳送 "{"data":"bind","msg":"hello"}" 資訊到組播地址

9.接收到資訊以後,攜帶著資訊跳轉到 activity

10.activity 接收資料並把資訊儲存listview和資料庫

11,其它

在繫結裡面有其它一些程式是判斷app有麼有連線路由器

資料庫操作是使用的郭霖寫的litepel

程式MQTT通訊過程

1.關於MQTT解析包

mqtt_msg 檔案是最底層的mqtt協議封裝檔案, 使用者不需要研究

mqtt 檔案是在mqtt_msg之上封裝的一套檔案,該檔案內部處理了mqtt各種通訊流程,使用者也是呼叫這裡面的api函式.

具體使用可以接著往下看.

使用者始終記住:和mqtt伺服器通訊就是和tcp伺服器通訊.不過他們之間的通訊資料需要按照mqtt協議規定.

2.配置所連線的MQTT伺服器的引數

3.如果使用域名連線,先進行域名解析

使用的socket1進行的域名解析,解析出來的ip地址儲存到 mqtt_ip裡

如果想單獨瞭解模組域名解析可看以下資料

4.先使用TCP連線上TCP伺服器(MQTT伺服器就是TCP伺服器嘛)

程式中使用的socket2作為tcp通訊

處理TCP接收的資料

TCP伺服器接收的資料全部儲存到了rb_t_usart1_send 這個環形佇列裡面了

如果想單獨瞭解模組tcp通訊可以看下面的部分

5.初始化mqtt使用到的一些變數和函式

我封裝的mqtt這個檔案是依照高階語言模式封裝的

6.傳送連線MQTT協議

下面是打包mqtt連線協議函式

7.如果連線上MQTT伺服器,則呼叫註冊的連接回調函式

在連接回調函式中呼叫訂閱主題和釋出訊息api

8.提示

只要是連線上MQTT了,使用者只需要在需要釋出訊息的地方呼叫釋出函式就可以.

使用者呼叫其api函式所打包的資料會儲存在mqtt內部快取裡面,然後內部自動把資料通過tcp傳送出去.

繼電器和感測器資料格式為json格式資料

傳送繼電器狀態 {"data":"switch","bit":"1","status":"1"} 繼電器吸合 {"data":"switch","bit":"1","status":"0"} 繼電器斷開

傳送溫溼度資料{"data":"sensor","type":"th","temperature":溫度,"humidity":溼度}

9.實際控制傳送協議資料的地方

mqtt.c裡面就需要這一個修改,替換自己的實際的tcp傳送函式,在移植的時候十分的便捷.

關於下面的mymqtt.timer_out_send = 0; 這個是預防有的模組傳送資料之後需要等待,按照提示修改就可以

我是按照模組本身的功能這樣子修改的,

10.關於內部使用的快取管理

內部使用的快取管理是在環形佇列基礎上封裝的一套資料管理程式

可在此處修改快取管理大小

接收處理MQTT資料

1.我們一般都是在mqtt資料回撥函式裡面處理接收的資料

接收到APP傳送的 {"data":"switch","bit":"1","status":"1"} 控制繼電器吸合

接收到APP傳送的{"data":"switch","bit":"1","status":"0"} 控制繼電器斷開

2.實際解析資料的地方

這個函式內部處理細節使用者不需要了解,只是按照mqtt協議進行解析

3.其實整個使用流程就是按照說明去做

4,現在看APP端的程式

app使用的jar包為:org.eclipse.paho.client.mqttv3-1.2.0

MyMqttCLient是封裝的mqtt檔案,使用者後期通訊都是使用這個裡面的api函式

使用者可以根據自己的mqtt伺服器更改引數

5,連線mqtt只需要在一開始的時候呼叫下

MyMqttClient.sharedCenter().setConnect();//連線MQTT

然後內部就是自動連線.

5,點選APP頁面上的裝置,攜帶著裝置的MAC地址資訊跳轉到裝置控制頁面

6,控制頁面接收跳轉的資料

7.設定訂閱主題回撥和訂閱主題

8.設定接收資料回撥,並把資料傳遞給handler

9.點選按鈕釋出繼電器控制命令

結語

這節測試了基本的MQTT遠端通訊控制,在後面的章節中將學習到整個流程是如何實現的.