ESA2GJK1DH1K基礎篇: 移植MQTT底層包到自己的項目(V0.1)


 

前言

 

這節代碼將在這一節的基礎上實現

 

 

 

 

拷貝MQTT文件夾到當前工程

 

 

 

 

 

 

 

 

 

 

當前工程建個MQTT的文件夾,用於存放那個MQTT文件夾里面的內容

 

 

 

 

添加文件到里面

 

 

 

 

 

 

 

 

 

 

 

 

注意::::

實際源碼拷貝位置

 

 

 

 

 

 

 

 

 

為了便於移植到各個模塊上使用,我再次封裝了一下

添加了 ConfigMqtt文件

 

 

 

 

添加頭文件到 include.h

 

 

 

 

 

設置一下頭文件路徑

 

 

 

 

注意,如果不是用的我的工程底板,會報錯一個地方

該函數是用來處理MQTT的數據.官方源碼解析的固定寫法.

 這個Usart1ReadBuff 是緩存串口1數據的數組

 

 

 

 注:我的模塊是使用單片機串口和它通信

單片機程序會配置模塊作為透傳模式

單片機串口發送的數據傳給模塊,模塊自動發給服務器

模塊從服務器接收的數據直接通過串口傳給單片機

如果大家使用的模塊不是把數據直接傳到了Usart1ReadBuff

可以定義一個新的數組

 

 

 

 

 

 

 

這節就使用這個定義的數組操作下鏈接MQTT實現通信

因為這樣的話,大家無論使用的什么模塊都可以參考

 

控制模塊TCP連接上MQTT

自行根據自己的模塊設置模塊連接TCP    (MQTT服務器軟件)

            case 0://關閉移動場景,徹底關閉TCP/IP 連接
                SendConfigFunction("AT+CIPSHUT\r\n",NULL,"SHUT OK",NULL,FunctionParseCompare,CompareValue);break;
            case 1://讀取SIM狀態正常
                SendConfigFunction("AT+CPIN?\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
            case 2://GPRS注冊狀態            
                SendConfigFunction("AT+CGREG?\r\n",NULL,"+CGREG: 0,1",NULL,FunctionParseCompare,CompareValue);break;
            case 3://是否附着了GPRS  
                SendConfigFunction("AT+CGATT?\r\n",NULL,"+CGATT: 1",NULL,FunctionParseCompare,CompareValue);break;            
            case 4://設置為單鏈接
                SendConfigFunction("AT+CIPMUX=0\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;            
            case 5://透傳模式 
                SendConfigFunction("AT+CIPMODE=1\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
            case 6://設置APN
                SendConfigFunction("AT+CSTT\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
            case 7://激活移動場景
                SendConfigFunction("AT+CIICR\r\n",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break;
            case 8://連接TCP 服務器
                SendConfigFunction("AT+CIPSTART=\"TCP\",\"47.92.31.46\",1883\r\n",NULL,"CONNECT",NULL,FunctionParseCompare,CompareValue);break;

 

 

 

 

 

 

無論如何你必須先用TCP連接上TCP服務器(MQTT軟件)

 

 

 

 

現在發送連接MQTT協議

 

一,調用MqttConnectMqtt函數,我注釋已經寫的很明白了哈...

 

 

 

二,打包連接數據,然后發給TCP服務器(我剛才說了,我串口發送的數據GPRS會自動轉發給TCP服務器)

  大家根據自己的修改,找到自己TCP發送數據的地方,把數據發出去

  

 

 

 

三,判斷是否連接上了

MqttConnectMqttAck

  

 

連接上以后,訂閱主題

  一,訂閱一個主題

   

 

 

  注:實際訂閱的時候可用一個數組存儲訂閱的主題

  假設是 char SubTopic[20]="wwwww"

  

 

 

二,訂閱兩個主題

 

 

 

 

 

 

判斷是否成功訂閱了主題

一,調用 MqttSubscribeAck函數判斷

 

  

 

 

 

 

二,然后呢咱發送一條消息

 

 

 

 

 

 

 

 注:以后發布消息

可直接

MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//組合發送的消息,消息:"online",消息個數6個
UsartOutStr(MqttSendData,MainLen);//發送MQTT協議數據(根據自己的TCP發送函數更改)

 

如果想改變消息等級為1

MqttPublishTopicStruct.qos = 1;

MainLen = MqttPublish(MqttPublishTopicStruct,"online",6);//組合發送的消息,消息:"online",消息個數6個
UsartOutStr(MqttSendData,MainLen);//發送MQTT協議數據(根據自己的TCP發送函數更改)

 

 

 

 現在呢我測試下,

注意哈,實際上沒有什么難的,

第一:先連接TCP

第二: 調用連接MQTT的封包函數,封裝好連接的數據,然后把數據用TCP發出去

第三: 判斷服務器返回的是不是連接成功

第四: 連接以后就可以訂閱主題了,其實什么時候都可以訂閱,隨意

第五 根據服務器返回的數據,判斷下是不是訂閱成功了

注:這節代碼不一定會測試通過,這節代碼只是為了說明怎么讓大家的模塊連接MQTT的流程而已

 

 

 

 

 

 

解析接收的MQTT數據 

把接收的數據返回回去

 

 

 

 

 

 

 

 

 

 

 

最后一個心跳包

你設置的心跳包多少時間,你就多少時間發送一次心跳包!

 

 

 

 

 

 

 

 

 

結語

你腦海里面永遠記得,先連接TCP 服務器

必須把TCP服務器返回的數據寫到那個數組里面

 

 

 

然后就是連接,判斷,訂閱判斷,發送數據,解析數據啦.最后定時發個心跳包.僅此而已

各種平台的MQTT封包解包

https://docs.emqx.io/sdk_tools?category=MQTT_Clients

 

注意:注意:注意:注意:注意:注意:

我給大家提供的都是網絡模塊串口透傳的代碼(8266,Air202,SIM800),后面我會提供個W5500的,不過是用另一塊板子

這節有些嘮叨....

大家一定要看我的下一篇,

大家一定要看我的下一篇,

大家一定要看我的下一篇,

要想做的穩定,沒有這么簡單,我這節只是說說流程.

大家一定要看我的下一篇,

大家一定要看我的下一篇,

大家一定要看我的下一篇,

 


免責聲明!

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



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