【002:ESP8266 移植 Mqtt 】


系統環境: 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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM