前言
物聯網是個很廣泛的范疇
其實說白了就是 物 -- 網絡
其中涉及的知識其實是數不勝數,太廣泛了...
但是呢!基本上離不開的就是遠程通信控制
為了實現設備和手機/上位機/網頁之間通信
而且要做到一對多或者多對一進行通信
那么必須有個中間件
這個中間件作為數據的轉發站
那么使用最為普遍的有兩個
1. WebSocket
2.MQTT
其實這兩個家伙都是在 TCP的基礎上再進行的封裝
其實就是TCP通信
不過WebSocket是這樣來的
TCP -- http -- WebSocket
而MQTT就是個TCP服務器
TCP -- MQTT
如果想深入了解MQTT,請看看下面的文章鏈接
https://www.cnblogs.com/yangfengwu/p/11762642.html
安裝MQTT軟件
我給大家准備好了安裝在Windows上的安裝包
請參考這篇文章安裝到自己的本地電腦
https://www.cnblogs.com/yangfengwu/p/13208248.html
注意:文章上是安裝到了我的雲端電腦上
大家測試安裝到自己本地電腦上就可以
這是我安裝的
我就用控制台模式啟動,然后測試
測試MQTT軟件是否可以通信
1.查看本機IP地址
2.打開調試助手測試
只要能自己發自己收,就可以了
讓8266連接MQTT
注:我是用的這個工程里面的文件
這是官方提供的,不過有個錯誤
大家看沒看我寫的
ESA2GJK1DH1K基礎篇: 來吧! 徹底了解一下MQTT
在訂閱時如果訂閱失敗返回的標識不變,只是消息等級會是0x80
故:官方那樣做即使訂閱時失敗的,還是會認為是成功!
修改如下:
1.把 "包"里面的文件按照下面拷貝
2.添加頭文件,定義一個mqtt結構體變量
#include "driver/mqtt.h" MQTT_Client mqttClient;
3.編寫連接,還有設置一些回調函數
MQTT_InitConnection(&mqttClient, "192.168.191.1", 1883, 0);//MQTT服務器IP地址,端口號,是否SSL MQTT_InitClient(&mqttClient, "client_id", "yang", "11223344", 3, 1);//ClientID,用戶名,密碼,心跳包時間,清除連接信息 MQTT_InitLWT(&mqttClient, "/lwt", "offline", 0, 0);//遺囑 MQTT_OnConnected(&mqttClient, mqttConnectedCb);//設置連接回調 MQTT_OnDisconnected(&mqttClient, mqttDisconnectedCb);//設置斷開回調 MQTT_OnPublished(&mqttClient, mqttPublishedCb);//設置發送完消息回調 MQTT_OnData(&mqttClient, mqttDataCb);//接收數據回調
//連接上MQTT void mqttConnectedCb(uint32_t *args){ MQTT_Client* client = (MQTT_Client*)args; os_printf("MQTT: Connected\r\n"); MQTT_Subscribe(client, "111111", 0);//訂閱主題:111111 } //連接斷開 void mqttDisconnectedCb(uint32_t *args){ MQTT_Client* client = (MQTT_Client*)args; os_printf("MQTT: Disconnected\r\n"); } //發送完消息 void mqttPublishedCb(uint32_t *args){ MQTT_Client* client = (MQTT_Client*)args; os_printf("MQTT: Published\r\n"); } //接收到數據 void mqttDataCb(uint32_t *args, const char* topic, uint32_t topic_len, const char *data, uint32_t data_len) { char *topicBuf = (char*)os_zalloc(topic_len+1), *dataBuf = (char*)os_zalloc(data_len+1);//用來緩存主題和消息 MQTT_Client* client = (MQTT_Client*)args; os_memcpy(topicBuf, topic, topic_len); topicBuf[topic_len] = 0; os_memcpy(dataBuf, data, data_len); dataBuf[data_len] = 0; MQTT_Publish(client, "222222", dataBuf, data_len, 0, 0);//轉發接收的消息:發布的主題222222 os_printf("Receive topic: %s, data: %s \r\n", topicBuf, dataBuf);//打印接收的消息 os_free(topicBuf); os_free(dataBuf); }
4.讓模塊連接上路由器以后,在執行連接MQTT程序
void wifiConnectCb(uint8_t status) { if(status == STATION_GOT_IP){ MQTT_Connect(&mqttClient); } else { MQTT_Disconnect(&mqttClient); } }
測試
擴展
如果用戶想知道官方是具體是怎么封裝的MQTT
請用戶先看我這兩篇文章以后再去了解官方是怎么做的
https://www.cnblogs.com/yangfengwu/p/12536382.html
https://www.cnblogs.com/yangfengwu/p/12540710.html