ESP8266 SDK開發: 物聯網篇-ESP8266連接MQTT服務器實現通信控制

 

 

 

前言

物聯網是個很廣泛的範疇

其實說白了就是   物 -- 網絡

其中涉及的知識其實是數不勝數,太廣泛了...

但是呢!基本上離不開的就是遠程通信控制

爲了實現設備和手機/上位機/網頁之間通信

而且要做到一對多或者多對一進行通信

那麼必須有個中間件

這個中間件作爲數據的轉發站

那麼使用最爲普遍的有兩個

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章