1. 参考博客:https://blog.csdn.net/yannanxiu/article/details/53088534
  2. 本文主要讲解如何使用ESP8266 WiFi模块作为MQTT客户端,并在本地电脑搭建MQTT服务器,实现客户端—服务器之间的相互通讯,发布—订阅主题的实验。
  3. MQTTIBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备。

开发环境

首先简单说明一下本博主的开发环境及相关工具:

  • MQTT服务器:Apollo 1.7.1(本地搭建)
  • ESP8266开发环境:ESP8266 IDE 2.0
  • ESP8266 SDK版本:esp8266_nonos_sdk_v2.0.0_16_08_10_0
  • ESP8266开发板:NodeMCU(32Mbit—4MByte Flash)
  • 搭建MQTT服务器

先下载Apollo 1.7.1软件,然后在win7系统的电脑上搭建MQTT服务器。具体的操作方法,详见如下链接:点击打开链接

https://blog.csdn.net/u012377333/article/details/68943416

  • ESP8266 IDE 2.0 开发环境搭建
    可以到安可信的官网下载对应的IDE开发工具,这里提供百度网盘下载链接:

https://pan.baidu.com/s/1G-ws30ETc5QYmsieEp1qSw

ESP8266 IDE 2.0安装配置参数,看参考如下官网链接:

http://wiki.ai-thinker.com/ai_ide_install

ESP8266 SDK版本:esp8266_nonos_sdk_v2.0.0_16_08_10_0 源码包下载,可以到乐鑫或安信可网站去下载,如下提供百度云下载链接:

https://pan.baidu.com/s/11NZKeh0zf6x5c0k_H2cdGw

如何使用安信可 ESP 系列一体化开发环境,详细的讲解见如下官网链接:点击打开链接

http://wiki.ai-thinker.com/ai_ide_use

  1. 简单介绍一下导入步骤:
  • 在IDE环境中通过「File」->「Import」;
  • 弹窗中选择「C/C++」->「Existing Code as Makefile project」;
  • 下一步「Browse…」,编译器选择「Cygwin GCC」;
  • 之后导入的工程目录如上图,其中给「dirver_lib」文件下面的Makeflie添加bak后缀或删除掉,防止编译通不过。
  • 从「example」文件夹中拷贝esp_mqtt_proj文件夹到主目录,点击编译按钮,如果成功就完成这一步骤了。
    工程目录

工程目录图。注意红色方块内的文件。

MQTT代码使用简析

mqtt例程目录

示例工程中最重要的是这两个文件:user目录下的user_main.c和inlcude目录下的mqtt_config.h。

其中user_main.c不用说了,玩过ESP8266的朋友都知道这是放主代码的地方,其中user_init函数是SDK提供开发者放置初始化代码的地方。下面主要分析mqtt_config.h。

mqtt_config.h代码清单

  1. #ifndef __MQTT_CONFIG_H__
  2. #define __MQTT_CONFIG_H__
  3. #define CFG_HOLDER 0x00FF55A4 /* Change this value to load default configurations */
  4. #define CFG_LOCATION 0x79 /* Please don't change or if you know what you doing */
  5. #define MQTT_SSL_ENABLE
  6. /*DEFAULT CONFIGURATIONS*/
  7. #define MQTT_HOST "192.168.1.100" //or "mqtt.yourdomain.com"
  8. #define MQTT_PORT 1883
  9. #define MQTT_BUF_SIZE 1024
  10. #define MQTT_KEEPALIVE 120 /*second*/
  11. #define MQTT_USER "DVES_USER"
  12. #define STA_SSID "DVES_HOME"
  13. #define STA_PASS "yourpassword"
  14. #define STA_TYPE AUTH_WPA2_PSK
  15. #define MQTT_RECONNECT_TIMEOUT 5 /*second*/
  16. #define DEFAULT_SECURITY 0
  17. #define QUEUE_BUFFER_SIZE 2048
  18. #define PROTOCOL_NAMEv31 /*MQTT version 3.1 compatible with Mosquitto v0.15*/
  19. //PROTOCOL_NAMEv311 /*MQTT version 3.11 compatible with https://eclipse.org/paho/clients/testing/*/
  20. #endif // __MQTT_CONFIG_H__
  • 在这个文件中,有几个宏定义可能需要修改的:
  • MQTT_HOST:MQTT服务器地址
  • MQTT_PORT:MQTT服务器端口
  • MQTT_USER:MQTT服务器用户名
  • MQTT_PASS:MQTT服务器密码
  • STA_SSID:WI-FI帐号
  • STA_PASS:WI-FI密码
注意 还有一个最重要的宏定义——CFG_HOLDER,因为这个MQTT示例在ESP8266运行过一次后会把这些信息保存到FLASH中,如果要继续修改这些信息,记得要修改CFG_HOLDER这个宏定义,改成另一个数值即可。

CFG_HOLDER作的用是:在CFG_Load函数中,如果发现从FLASH读取出来的CFG_HOLDER数值和宏定义的不一样,则会更新这些信息,并保存到FLASH中。不修改CFG_HOLDER的话可能会发觉明明用户名和密码都正确但是就是连接不上去。

修改代码及测试

修改代码

根据上面分析,下面我们就可以修改示例代码:

  • 把STA_SSID和STA_PASS修改为自己的WiFI名和密码;
  • 修改MQTT_USER和MQTT_PASS为对应的MQTT服务器的用户名和密码,Apollo服务器默认是admin和password;
  • 修改MQTT_HOST和MQTT_PORT为MQTT服务器IP和PORT,目前是使用本地的MQTT服务器,所以是修改为自己电脑的IP和61613端口,PORT是整型值;
  • 根据MQTT服务器的协议不同,可能需要使用MQTT v3.1.1版本,所以把PROTOCOL_NAMEv31注释掉,使用PROTOCOL_NAMEv311。源码的PROTOCOL_NAMEv311前面没有#define,自己加上就行。
  • 最后,修改CFG_HOLDER,以让这些配置生效,直接给原来CFG_HOLDER定义的数值加1即可。
    代码编译,查看Console窗口信息,如果输出下图所示信息,说明代码已经编译成功。

如果Problems窗口报Errors的,只要Console窗口编译通过,就可以不用管。

编译输出

另外需要注意,ESP8266 SDK v2.0版本生成的eagle.irom0text.bin烧写起始地址是0x10000,而之前的版本烧写地址是0x40000;eagle.flash.bin还是0x00000。

烧录工具的下载链接:https://pan.baidu.com/s/1CWgpkI9wzpD5HyLMk-eqtA

烧录工具软件的配置,可参考如下图设置:

基于ESP8266的MQTT客户端-服务器搭建、通讯测试 - 图4

注意:不同的Flash大小,blank.bin和default.bin烧写地址可能不同。另外,给NodeMCU烧写固件的时候,SPI MODE选项可能要选DIO,其他的ESP8266开发板一般则选择默认的QIO就行了。详细细节参考这里点击打开链接

上电测试

如果前面一切顺利,打开串口,设置波特率为115200,上电后前面的乱码不用管,之后串口打印信息如下,省略了一部分信息:

  1. load ...
  2. MQTT_InitConnection
  3. MQTT_InitClient
  4. WIFI_INIT
  5. System started ...
  6. mode : sta(68:c6:3a:90:f3:77)
  7. add if0
  8. STATION_IDLE
  9. STATION_IDLE
  10. STATION_IDLE
  11. scandone
  12. state: 0 -> 2 (b0)
  13. STATION_IDLE
  14. state: 2 -> 3 (0)
  15. state: 3 -> 5 (10)
  16. add 0
  17. aid 4
  18. cnt
  19. connected with Sky.Ye, channel 1
  20. dhcp client start...
  21. STATION_IDLE
  22. STATION_IDLE
  23. STATION_IDLE
  24. STATION_IDLE
  25. STATION_IDLE
  26. ip:192.168.137.48,mask:255.255.255.0,gw:192.168.137.1
  27. TCP: Connect to ip 192.168.1.183:61613
  28. MQTT: Connected to broker 192.168.1.183:61613
  29. MQTT: Sending, type: 1, id: 0000
  30. TCP: Sent
  31. TCP: data received 4 bytes
  32. MQTT: Connected to 192.168.1.183:61613
  33. MQTT: Connected
  34. MQTT: queue subscribe, topic"/mqtt/topic/0", id: 1
  35. MQTT: queue subscribe, topic"/mqtt/topic/1", id: 2
  36. MQTT: queue subscribe, topic"/mqtt/topic/2", id: 3
  37. MQTT: queuing publish, length: 23, queue size(66/2048)
  38. MQTT: queuing publish, length: 25, queue size(91/2048)
  39. MQTT: queuing publish, length: 25, queue size(118/2048)
  40. MQTT: Sending, type: 8, id: 0001
  41. TCP: Sent
  42. TCP: data received 5 bytes
  43. MQTT: Subscribe successful
  44. MQTT: Sending, type: 8, id: 0002
  45. TCP: Sent
  46. TCP: data received 5 bytes
  47. MQTT: Subscribe successful
  48. MQTT: Sending, type: 8, id: 0003
  49. TCP: Sent
  50. TCP: data received 5 bytes
  51. MQTT: Subscribe successful
  52. MQTT: Sending, type: 3, id: 0000
  53. TCP: Sent
  54. MQTT: Published
  55. TCP: data received 22 bytes
  56. Receive topic: mqtt/topic/0, data: hello0
  57. MQTT: Sending, type: 3, id: 0004
  58. TCP: Sent
  59. MQTT: Published
  60. TCP: data received 26 bytes
  61. Receive topic: mqtt/topic/1, data: hello1
  62. Get another published message
  63. TCP: data received 4 bytes
  64. MQTT: received MQTT_MSG_TYPE_PUBACK, finish QoS1 publish
  65. MQTT: Sending, type: 3, id: 0005
  66. TCP: Sent
  67. MQTT: Published
  68. TCP: data received 26 bytes
  69. Receive topic: mqtt/topic/2, data: hello2
  70. Get another published message
  71. TCP: data received 4 bytes
  72. MQTT: Sending, type: 6, id: 0005
  73. TCP: Sent
  74. TCP: data received 4 bytes
  75. pm open,type:2 0
  76. MQTT: Send keepalive packet to 192.168.1.183:61613!
  77. MQTT: Sending, type: 12, id: 0000
  78. TCP: Sent
  79. TCP: data received 2 bytes

同时看源码和串口信息可知,ESP8266向MQTT服务器订阅了三个主题,假设使用的是本地搭建的MQTT服务器,那么查看MQTT服务器后台就可以看到:

基于ESP8266的MQTT客户端-服务器搭建、通讯测试 - 图5

同时在后台的Connects页面也可以看到ESP8266的链接:

基于ESP8266的MQTT客户端-服务器搭建、通讯测试 - 图6

到此,

原文:

https://blog.csdn.net/baidu_17220503/article/details/80365322