該程序須要的基礎知識: https://www.cnblogs.com/yangfengwu/category/1566194.html 全部源碼開源,請自行學習html
設置一下頭文件路徑數組
注意,若是不是用的個人工程底板,會報錯一個地方,本身去定義一個數組去數組大小先設置200吧,放到這裏,緩存
這個數組是存放服務器發過來的數據.服務器
具體看我後面的介紹.網絡
注意,我是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;
一,先說明測試
我設置的模塊是透傳模式,我和GPRS的鏈接是經過串口spa
我單片機往串口發數據,串口數據發給了GPRS,GPRS就會自動發給TCP服務器3d
TCP服務器發給GPRS數據,GPRS就會把數據發到本身的串口,而後就發給單片機了
他們之間的數據不夾雜着亂七八糟的東西,發的什麼就是什麼.
個人數據所有存到了
一,調用MqttConnectMqtt函數,我註釋已經寫的很明白了哈...
二,我爲了更形象一點,我只用個人底層架子控制模塊鏈接上TCP服務器
你們根據本身的模塊鏈接上TCP服務器
三,而後主函數裏面把打包的數據發給TCP服務器(我剛纔說了,我串口發送的數據GPRS會自動轉發給TCP服務器)
你們根據本身的修改,找到本身TCP發送數據的地方,把數據發出去
四,判斷是否鏈接上了
MqttConnectMqttAck
該函數沒有參數,全部的數據是靠 transport_getdata 這個函數提供
先看一下里面的這個函數MQTTPacket_read 這個函數就是處理MQTT數據的
他把從transport_getdata函數裏面提取的數據,拷貝到了 MqttAnalyzeStruct.buff 數組裏面了
最後面的== XXXX是判斷這個數據是什麼類型的數據 CONNACK 就是說是接收的鏈接成功的應答數據
實質上就是傳遞函數指針而已,若是你C語言很差,你就先別深究,先學會用
一,這個函數是固定寫法 ,
二,全部的MQTT解析數據都是利用這個函數,
你所作的事情就是,把TCP服務器傳過來的數據緩存到一個數組,而後把數組名字放到那裏
我設置的個人模塊是串口透傳
個人數據所有緩存到了Usart1ReadBuff數組,因此我上面才那樣寫的
因此我直接能夠
三,若是你的模塊接收的數據緩存到別的數組了,可是數據有各類亂七八糟的數據
那麼你須要先剔除
你能夠先定義一個數組
而後
一,訂閱一個主題
二,訂閱兩個主題
三,看一下訂閱主題的封包的那個函數
一,調用 MqttSubscribeAck函數判斷
二,程序裏面就是
三,而後呢咱發送一條消息
如今呢我測試下,
注意哈,實際上沒有什麼難的,
第一:先鏈接TCP
第二: 調用鏈接MQTT的封包函數,封裝好鏈接的數據,而後把數據用TCP發出去
第三: 判斷服務器返回的是否是鏈接成功
第四: 鏈接之後就能夠訂閱主題了,其實何時均可以訂閱,隨意
第五 根據服務器返回的數據,判斷下是否是訂閱成功了
主要是你們必定要把本身接受的數據傳到這裏
把接收的數據返回回去
而後稍微動了下
你設置的心跳包多少時間,你就多少時間發送一次心跳包!完了沒有了
你腦海裏面永遠記得,先鏈接TCP 服務器
必須把TCP服務器返回的數據寫到那個數組裏面
而後就是鏈接,判斷,訂閱判斷,發送數據,解析數據啦.最後定時發個心跳包.僅此而已
各類平臺的MQTT封包解包
https://docs.emqx.io/sdk_tools?category=MQTT_Clients
我給你們提供的都是網絡模塊串口透傳的代碼(8266,Air202,SIM800),後面我會提供個W5500的,不過是用另外一塊板子
這節有些嘮叨....
你們必定要看個人下一篇,
你們必定要看個人下一篇,
你們必定要看個人下一篇,
要想作的穩定,沒有這麼簡單,我這節只是說說流程.
你們必定要看個人下一篇,
你們必定要看個人下一篇,
你們必定要看個人下一篇,