系統環境: ubuntu 16.04 64bit
SDK版本: esp_iot_sdk_v1.3.0
記錄時間: 2016年10月13日
聯系方式: yexiaopeng1992@126.com
背景:在Esp8266上實現Mqtt,使之可以和Mqtt服務器進行數據通訊,代替原本項目中使用的socket通訊。
一、Mqtt在esp8266上的移植
使用開源工程 esp_mqtt https://github.com/tuanpmt/esp_mqtt
1.下載esp_mqtt 代碼
#git clone https://github.com/tuanpmt/esp_mqtt.git
2.將esp_mqtt中關於Mqtt需要的代碼添加到自己工程
相關代碼:esp_mqtt/mqtt 和 esp_mqtt/modules 下除 Makefile的文件
我將其中的 .h 和 .c 文件分別添加到 項目的 esp_iot_sdk_v1.3.0/app/driver 和 esp_iot_sdk_v1.3.0/app/include/driver下
在將esp_mqtt/include 下的user_config.sample.h文件中的有關配置信息的宏定義復制粘貼到 /esp_iot_sdk_v1.3.0/app/include下
的user_config.h 文件中即可。
3.添加mqtt的頂層代碼
將 esp_mqtt/user 下的user_main.c 中除user_init之外的代碼復制粘貼到自己的文件中。
4.修改平台相關代碼
esp_mqtt項目和網絡上的其他一些項目關於Mqtt&esp8266基本是基於NONOS_SDK的,與我項目中使用的esp_iot_sdk不同,因此在esp_mqtt
的代碼中會有部分函數是esp_iot_sdk沒有的,需要修改為esp_iot_sdk中相同功能的函數。
如將 mqtt_tcpclient_delete() 函數中 espconn_abort 替換為 espconn_disconnect,兩者的功能皆為斷開TCP連接
再將新添加的 mqtt相關代碼的 頭文件路徑做修改后就能正常編譯了。
二、Mqtt服務器搭建(僅測試)
http://makerpro.cc/2016/02/use-esp8266-and-mqtt-to-transfer-iot-data/ 或者
http://regishsu.blogspot.tw/2016/02/study-esp8266-notemcu-mqtt-study02xx.html
參考其關於服務器的搭建和測試方式即可
三、修改esp8266關於Mqtt的配置
user_config.h中,原始配置
#define MQTT_HOST "192.168.0.101" //or "mqtt.yourdomain.com" #define MQTT_PORT 1883 #define MQTT_BUF_SIZE 1024 #define MQTT_KEEPALIVE 120 /*second*/ #define MQTT_CLIENT_ID "CLIENT_1234" #define MQTT_USER "USER" #define MQTT_PASS "PASS" #define MQTT_CLEAN_SESSION 1 #define MQTT_KEEPALIVE 120 #define STA_SSID "SSID" #define STA_PASS "PASS" #define MQTT_RECONNECT_TIMEOUT 5 /*second*/ #define DEFAULT_SECURITY 0 #define QUEUE_BUFFER_SIZE 2048 #define PROTOCOL_NAMEv31
其中主要修改 MQTT_HOST 為 Mqtt 服務器地址, STA_SSID 和STA_PASS 為 wifi的名稱和密碼即可,其他配置根據自己情況修改。
四、修改esp8266中與Mqtt服務器的數據接收和發送
就兩個函數
MQTT_Publish():發送消息到Mqtt 服務器
mqttDataCb(): 接收到Mqtt消息的回調函數
說明:一開始esp8266和服務器可以正常連接,但按照 Mqtt服務器測試參考的鏈接(見上文)中的提供的方式,esp8266無法和服務器做數據通訊,回來將 esp_mqtt 中 /mqtt/topic/0 改為 和鏈接中一樣為 hello/world 后可以數據通訊了(具體原因應該和Mqtt有關,此時未學習mqtt,故不知道原因)
例子
MQTT_Publish(&mqttClient, "hello/world", "mhjjs7", 6, 0, 0);
