ESA2GJK1DH1K基礎篇
- 2019 年 10 月 31 日
- 筆記
前言
該程式需要的基礎知識: https://www.cnblogs.com/yangfengwu/category/1566194.html 所有源碼開源,請自行學習

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

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

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

添加文件到裡面



添加頭文件到 include.h

設置一下頭文件路徑

注意,如果不是用的我的工程底板,會報錯一個地方,自己去定義一個數組去數組大小先設置200吧,放到這裡,
這個數組是存放伺服器發過來的數據.
具體看我後面的介紹.

控制模組TCP連接上MQTT
注意,我是AT指令通過串口控制GPRS連接的TCP伺服器(MQTT軟體)
大家如果用的其它不是通過串口控制連接的,請自己寫控制模組連接TCP的函數
case 0://關閉移動場景,徹底關閉TCP/IP 連接 SendConfigFunction("AT+CIPSHUTrn",NULL,"SHUT OK",NULL,FunctionParseCompare,CompareValue);break; case 1://讀取SIM狀態正常 SendConfigFunction("AT+CPIN?rn",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 2://GPRS註冊狀態 SendConfigFunction("AT+CGREG?rn",NULL,"+CGREG: 0,1",NULL,FunctionParseCompare,CompareValue);break; case 3://是否附著了GPRS SendConfigFunction("AT+CGATT?rn",NULL,"+CGATT: 1",NULL,FunctionParseCompare,CompareValue);break; case 4://設置為單鏈接 SendConfigFunction("AT+CIPMUX=0rn",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 5://透傳模式 SendConfigFunction("AT+CIPMODE=1rn",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 6://設置APN SendConfigFunction("AT+CSTTrn",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 7://激活移動場景 SendConfigFunction("AT+CIICRrn",NULL,"OK",NULL,FunctionParseCompare,CompareValue);break; case 8://連接TCP 伺服器 SendConfigFunction("AT+CIPSTART="TCP","47.92.31.46",1883rn",NULL,"CONNECT",NULL,FunctionParseCompare,CompareValue);break;

無論如何你必須先用TCP連接上TCP伺服器(MQTT軟體),然後說注意的地方
一,先說明
我設置的模組是透傳模式,我和GPRS的連接是通過串口
我單片機往串口發數據,串口數據發給了GPRS,GPRS就會自動發給TCP伺服器
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伺服器返回的數據寫到那個數組裡面

然後就是連接,判斷,訂閱判斷,發送數據,解析數據啦.最後定時發個心跳包.僅此而已
注意:注意:注意:注意:注意:注意:
我給大家提供的都是網路模組串口透傳的程式碼(8266,Air202,SIM800),後面我會提供個W5500的,不過是用另一塊板子