<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和模塊進行的通信
修改 mqtt_send_function里面的發送過程
如果接收到 > 清零接收超時
如果 接收到 SEND OK 清零發送超時
接收的數據直接提取有效數據,然后交於 mqtt_read_function函數處理
4.如果內存允許,建議采用下面的方式處理接收數據
5.如果客戶發現自己當前的版本和細節介紹的有出入
請用戶直接把此節的文件移植替換當前使用的文件
隨着時間的推移,我可能會發現並修改完善許多細節
我會盡量做到版本兼容!
如若有不兼容的地方,我將在文件說明中做詳細說明.