201-STM32+BC26基本控制篇-移植使用-移植單片機MQTT底層包到自己的工程項目


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

 

說明

這節詳細說明一下如何把我工程里面的MQTT包移植到用戶自己的工程.

注意:首先確定自己已經實現了使用TCP連接服務器!

該底層包適用於所有的單片機,和所有的網絡模塊.

該教程以STM32工程為例子說明移植過程.

文件夾說明

1.移植使用的是下面兩個文件夾里面的文件

我准備了一個空模板程序,然后在這個模板上演示移植過程.

 

 

 

2.MQTT文件夾

 

 

 

mqtt_msg 文件作為最底層的最直接的MQTT協議處理文件.

mqtt.c 文件 是我在mqtt_msg的基礎上又封裝了一層

這一層增加了數據緩存管理,緩存管理采用環形隊列實現,所有的數據都儲存在緩存里面

另一方面還有處理消息等級1,2的消息,心跳包自動發送等.

有了這一層的封裝,用戶只需簡單的配置即可實現穩定可靠的MQTT通信.

 

3.mem文件夾

 

 

 

mem文件夾里面是我寫的緩存管理程序

 

開始移植 

1.把文件添加到工程,設置下.h路徑

 

2.編譯一下工程,打開這個錯誤

 

 

 

3.替換自己的TCP發送函數

 

 

 

4.把 mqtt_time_data(&mymqtt); 放到1ms定時器中斷中.

 

 

 

 

 

 

 

5.初始化和注冊MQTT幾個函數,訂閱,發布等函數

 

 

6.連接TCP服務器,發送連接MQTT協議

 

 

 

把上面的協議發給MQTT服務器以后,MQTT服務器會返回數據

需要把返回的數據交給 int  mqtt_connect_ack(unsigned char *buff) 函數處理

如果該函數返回 0 說明連接上了MQTT服務器,然后調用 mymqtt.connectCb();執行連接回調函數

 

 

 

 

 

 

7.加上需要不停輪訓的函數和處理MQTT消息的函數

 

 

 

 

8.按照上面的步驟已經移植完成(述說下執行流程)

1.首先控制模塊以TCP方式連接服務器,連接上以后發送MQTT連接協議

 

 

 

2.判斷服務器返回的數據,如果連接上MQTT服務器,調用連接成功回調函數

並在連接成功回調函數中訂閱主題.

 

 

 

 

 

 

 

3.訂閱主題的協議都打包進了緩存,從緩存提取並發送出去.

注:后面發布消息,發送心跳包數據也是全部打包進了緩存!

 

 

 

 

 

 

 

 

4.MQTT服務器返回數據以后,解析處理MQTT返回的數據

 

 

 

 

 

 

 

 

 

5.如果接收到普通的通信消息,將會調用接收數據回調函數

 

 

 

6.發布消息

只要判斷成功連接了MQTT,發送消息的函數可以寫到任意地方 .

 

 

 

 

 

 

 

注意事項

 

1.在mqtt.h里面 有一個 mqtt_send_buff_len 500

該變量控制着發送協議的最大長度,用戶需要根據自己的情況修改該值.

為防止提取緩存時導致內存溢出,我編寫底層的時候設置了默認超過該值的打包協議將被丟棄.

 

 

 

 

 

2.發布消息成功函數只有在消息等級1和消息等級2的時候才會進入

消息等級1和消息等級2服務器只要應答便會進入此函數.說明服務器確實接收到了數據.

 

 

 

 

3.假設自己的網絡模塊並非透傳模式

假設使用的串口2和模塊進行的通信

1.發送數據,假設發送66個數據
1.1 首先發送 AT+CIPSEND=66\r\n    66:為要發送的數據個數
1.2 等待模塊返回 >
1.3 發送要發送的數據給模塊
1.4 模塊返回 Recv 66 bytes  
1.5 模塊發送完成返回 SEND OK
2.接收數據
2.1 接收數據格式: +IPD,XXXX:真實數據    XXXX 為接收的數據個數
 

修改 mqtt_send_function里面的發送過程

 

 

 

如果接收到 > 清零接收超時

如果 接收到 SEND OK 清零發送超時

 

 

 

接收的數據直接提取有效數據,然后交於 mqtt_read_function函數處理

 

 

 

4.如果內存允許,建議采用下面的方式處理接收數據

 

 

 

5.如果客戶發現自己當前的版本和細節介紹的有出入

請用戶直接把此節的文件移植替換當前使用的文件

隨着時間的推移,我可能會發現並修改完善許多細節

我會盡量做到版本兼容!

如若有不兼容的地方,我將在文件說明中做詳細說明.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM