前言
這節代碼將在這一節的基礎上實現
拷貝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的,不過是用另一塊板子
這節有些嘮叨....
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,
要想做的穩定,沒有這么簡單,我這節只是說說流程.
大家一定要看我的下一篇,
大家一定要看我的下一篇,
大家一定要看我的下一篇,