esp8266 mqtt 源代码分析

前言 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字段,否则可能连接不上。

迈来芯推出第二代隔离式集成电流传感器MLX912209
到2025年全球医用温度传感器市场价值或有83.6亿美元
这款系统可以将智能手机变成抬头显示屏
基于ARM7处理器和MX618芯片实现无中心呼叫控制协议数字化系统设计
高通骁龙8cx企业级计算平台将助力现代化企业打造移动办公环境
esp8266 mqtt 源代码分析
摩托罗拉edge S开售两分钟销量突破万台
收妥这份逛展大全,11月3日深圳见!(内含福利)
基士得耶2007RE静电复印机故障自动诊断
一种双双余度的汇流条功率控制装置的设计与研究
显示屏或是三星Galaxy S III最大短板
中国汽车芯片产业创新战略联盟正式在京成立
音频编码的分类
常用CD系列计数器
锂电池外观缺陷检测技术有效提高了检测效率
基于LED的显微镜照明器提高检测效率
二次供水物联网(数据采集及监控报警)解决方案
智能机器人将是智能手机之后的下一个大事件
个人存储类产品的几大分类
恩特龙Ntron氧气分析仪用于喷雾干燥机氧含量监测