ESA2GJK1DH1K基礎篇: 移植官方+本人進行二次封裝的MQTT包,讓TCP實現MQTT功能(以GPRS模塊爲例)

 

前言

  該程序須要的基礎知識:  https://www.cnblogs.com/yangfengwu/category/1566194.html   全部源碼開源,請自行學習html

  

 

 

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

 

 

 

 

拷貝第一節測試裏面的MQTT文件夾到當前工程

 

 

 

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

 

 

 

 

添加文件到裏面

 

 

 

 

 

 

 

 

 

 

 

 

 

添加頭文件到 include.h

 

 

 

 

 

設置一下頭文件路徑數組

 

 

 

 

注意,若是不是用的個人工程底板,會報錯一個地方,本身去定義一個數組去數組大小先設置200吧,放到這裏,緩存

這個數組是存放服務器發過來的數據.服務器

具體看我後面的介紹.網絡

 

 

 

 

控制模塊TCP鏈接上MQTT

注意,我是AT指令經過串口控制GPRS鏈接的TCP服務器(MQTT軟件)函數

你們若是用的其它不是經過串口控制鏈接的,請本身寫控制模塊鏈接TCP的函數學習

            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軟件),而後說注意的地方

一,先說明測試

  我設置的模塊是透傳模式,我和GPRS的鏈接是經過串口spa

  我單片機往串口發數據,串口數據發給了GPRS,GPRS就會自動發給TCP服務器3d

  TCP服務器發給GPRS數據,GPRS就會把數據發到本身的串口,而後就發給單片機了

  他們之間的數據不夾雜着亂七八糟的東西,發的什麼就是什麼.

  個人數據所有存到了

  

 

 

 

 

 

如今發送鏈接MQTT協議

 

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

 

 

 

二,我爲了更形象一點,我只用個人底層架子控制模塊鏈接上TCP服務器

  你們根據本身的模塊鏈接上TCP服務器

    

 

 

 

 

 

三,而後主函數裏面把打包的數據發給TCP服務器(我剛纔說了,我串口發送的數據GPRS會自動轉發給TCP服務器)

  你們根據本身的修改,找到本身TCP發送數據的地方,把數據發出去

 

 

 

四,判斷是否鏈接上了

MqttConnectMqttAck

該函數沒有參數,全部的數據是靠 transport_getdata 這個函數提供

先看一下里面的這個函數MQTTPacket_read    這個函數就是處理MQTT數據的

他把從transport_getdata函數裏面提取的數據,拷貝到了 MqttAnalyzeStruct.buff 數組裏面了

最後面的== XXXX是判斷這個數據是什麼類型的數據  CONNACK  就是說是接收的鏈接成功的應答數據

 

 

 

 

實質上就是傳遞函數指針而已,若是你C語言很差,你就先別深究,先學會用

 

 

 

而後看transport_getdata函數, 這個函數是整個MQTT包裏面的重點

 

一,這個函數是固定寫法 ,

 

   

 

 

 

二,全部的MQTT解析數據都是利用這個函數,

  你所作的事情就是,把TCP服務器傳過來的數據緩存到一個數組,而後把數組名字放到那裏

  我設置的個人模塊是串口透傳

  個人數據所有緩存到了Usart1ReadBuff數組,因此我上面才那樣寫的

  

 

  

  因此我直接能夠

  

 

 

三,若是你的模塊接收的數據緩存到別的數組了,可是數據有各類亂七八糟的數據

  那麼你須要先剔除

  你能夠先定義一個數組

  

 

 

 

    而後

      

 

鏈接上之後,訂閱主題

一,訂閱一個主題

 

 

二,訂閱兩個主題

 

三,看一下訂閱主題的封包的那個函數

 

 

判斷是否成功訂閱了主題

一,調用 MqttSubscribeAck函數判斷

 

 

二,程序裏面就是

 

 

 

三,而後呢咱發送一條消息

 

 

 

 

 如今呢我測試下,

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

第一:先鏈接TCP

第二: 調用鏈接MQTT的封包函數,封裝好鏈接的數據,而後把數據用TCP發出去

第三: 判斷服務器返回的是否是鏈接成功

第四: 鏈接之後就能夠訂閱主題了,其實何時均可以訂閱,隨意

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

主要是你們必定要把本身接受的數據傳到這裏

 

 

 

 

 

 

 

 

 

解析接收的MQTT數據 

把接收的數據返回回去

 

 

 

而後稍微動了下

 

 

 

 

 

 

 

 

 

 

 

最後一個心跳包

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

 

 

 

 

 

 

結語

你腦海裏面永遠記得,先鏈接TCP 服務器

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

 

 

 

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

各類平臺的MQTT封包解包

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

 

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

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

這節有些嘮叨....

你們必定要看個人下一篇,

你們必定要看個人下一篇,

你們必定要看個人下一篇,

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

你們必定要看個人下一篇,

你們必定要看個人下一篇,

你們必定要看個人下一篇,

相關文章
相關標籤/搜索