前言
物聯網是個很廣泛的範疇
其實說白了就是 物 -- 網絡
其中涉及的知識其實是數不勝數,太廣泛了...
但是呢!基本上離不開的就是遠程通信控制
爲了實現設備和手機/上位機/網頁之間通信
而且要做到一對多或者多對一進行通信
那麼必須有個中間件
這個中間件作爲數據的轉發站
那麼使用最爲普遍的有兩個
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/10547024.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