当前位置:首页 > 物联网 > 网络协议
[导读]   前言   MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分。   ESP8266是一款物

  前言

  MQTT是IBM开发的一个即时通讯协议,面向M2M和物联网的连接,采用轻量级发布和订阅消息传输机制,并且有可能成为物联网的重要组成部分。

  ESP8266是一款物美价廉的Wi-Fi芯片,集成Tensilica L106 钻石系列的32 位处理器和片上SRAM,多达17 个GPIO口,并拥有IIC、IIS、UART、PWM、IR遥控等片上资源。

  ESP8266还提供官方的软件开发开发包(SDK),目前最新版本是「ESP8266 NONOS SDK V2.0.0」。

  这篇文章主要讲解如何使用ESP8266(基于NONS_SDK_v2.0)作为MQTT客户端,并连上在本地电脑搭建的MQTT服务器。

  开发环境

  首先简单说明一下博主的开发环境:

  ESP8266开发环境:ESP8266 IDE 2.0

  ESP8266 SDK版本:esp8266_nonos_sdk_v2.0.0_16_08_10_0

  MQTT服务器:Apollo 1.7.1(本地搭建)

  操作系统:64位 Win10系统

  ESP8266开发板:NodeMCU(4MB Flash)

  阅读本教程时,如果有使用esp8266_nonos_sdk_v2.0.0的开发经验,会更轻松的使用本教程。如果遇到代码编译出错、烧写下载不行以及下载后出现异常的问题,请先参考其他资料再继续本文。

  导入工程

  本教程基于ESP8266 IDE 2.0,如果读者使用一样的环境,那么步骤1~4就好理解了,不是的话直接看图片和步骤5:

  在IDE环境中通过「File」-》「Import」;

  弹窗中选择「C/C++」-》「ExisTIng Code as Makefile project」;

  下一步「Browse…」,编译器选择「Cygwin GCC」;

  之后导入的工程目录如上图,其中给「dirver_lib」文件下面的Makeflie添加bak后缀或删除掉,免得编译通不过。

  从「example」文件夹中拷贝esp_mqtt_proj文件夹到主目录,点击编译按钮,如果成功就完成这一步骤了。

  

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

  MQTT代码使用简析

  

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

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

  mqtt_config.h代码清单

  #ifndef __MQTT_CONFIG_H__

  #define __MQTT_CONFIG_H__

  #define CFG_HOLDER 0x00FF55A4 /* Change this value to load default configuraTIons */

  #define CFG_LOCATION 0x79 /* Please don‘t change or if you know what you doing */

  #define MQTT_SSL_ENABLE

  /*DEFAULT CONFIGURATIONS*/

  #define MQTT_HOST “192.168.1.100” //or “mqtt.yourdomain.com”

  #define MQTT_PORT 1883

  #define MQTT_BUF_SIZE 1024

  #define MQTT_KEEPALIVE 120 /*second*/

  #define MQTT_CLIENT_ID “DVES_%08X”

  #define MQTT_USER “DVES_USER”

  #define MQTT_PASS “DVES_PASS”

  #define STA_SSID “DVES_HOME”

  #define STA_PASS “yourpassword”

  #define STA_TYPE AUTH_WPA2_PSK

  #define MQTT_RECONNECT_TIMEOUT 5 /*second*/

  #define DEFAULT_SECURITY 0

  #define QUEUE_BUFFER_SIZE 2048

  #define PROTOCOL_NAMEv31 /*MQTT version 3.1 compatible with Mosquitto v0.15*/

  //PROTOCOL_NAMEv311 /*MQTT version 3.11 compatible with https://eclipse.org/paho/clients/testing/*/

  #endif // __MQTT_CONFIG_H__12345678910111213141516171819202122232425262728293031

  在这个文件中,有几个宏定义可能需要修改的:

  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窗口,如果输出

  

  那说明代码已经编译成功。另外要注意,ESP8266 SDK v2.0版本生成的eagle.irom0text.bin烧写起始地址是0x10000,而之前的版本烧写地址是0x40000;eagle.flash.bin还是0x00000。由于博主使用的是4MB Flash的ESP8266,所以也建议读者先确定手头的ESP8266是不是4MB Flash(即32Mbit Flash,注意单位!4MB=32Mbit,Flash一般是以bit计算!)

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

  下载配置,仅供参考:

  

  提醒

  blank.bin和default.bin烧写一次就行,另外也要留意不同的Flash大小,blank.bin和default.bin烧写地址也不同。

  另外,给NodeMCU烧写固件的时候,SPI MODE选项可能要选DIO。详细细节参考这里。

  其他的ESP8266开发板一般则选择默认的QIO就行了。

  上电测试

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

  load 。。.

  default configuration

  MQTT_InitConnection

  MQTT_InitClient

  WIFI_INIT

  ……(省略)

  connected with 《WiFi名》, channel 6

  dhcp client start.。。

  STATION_IDLE

  STATION_IDLE

  ip:《ESP8266的IP》,mask:255.255.255.0,gw:《WiFi网关IP》

  TCP: Connect to ip 《MQTT服务器IP:PORT》

  MQTT: Connected to broker 《MQTT服务器IP:PORT》

  MQTT: Sending, type: 1, id: 0000

  TCP: Sent

  TCP: data received 4 bytes

  MQTT: Connected to 《MQTT服务器IP:PORT》

  MQTT: Connected

  MQTT: queue subscribe, topic“/mqtt/topic/0”, id: 1

  MQTT: queue subscribe, topic“/mqtt/topic/1”, id: 2

  MQTT: queue subscribe, topic“/mqtt/topic/2”, id: 3

  MQTT: queuing publish, length: 23, queue size(66/2048)

  MQTT: queuing publish, length: 25, queue size(91/2048)

  MQTT: queuing publish, length: 25, queue size(118/2048)

  ……123456789101112131415161718192021222324252627

  其中带尖括号的字段根据测试环境不同而不同。

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

  

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

  

  MQTT本地服务器搭建教程Windows版链接在后面。

  另外博主已经用ESP8266的MQTT连接上了OneNET云,连接该云需要注释掉下面这条语句,在user_init函数下。

  MQTT_InitLWT(&mqttClient, “/lwt”, “offline”, 0, 0);1

  原因是OneNET不支持MQTT协议的Will字段,否则可能连接不上。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭