ESP8266 MQTT

准备东西:
一块单片机开发板(我用的原子的stm32的mini板子)
一块esp-12F(esp-12E,esp-12S均可)
一台云主机(没有也可以用虚拟机来玩局域网控制)
单片机只需要消耗一个串口和一个定时器


先搭建环境
硬件连接服务器一般是socket,tcp,udp,mqtt,websocket之类的
物联网里用得较多的是mqtt,这里我用的是mqtt,服务器端我用的emq,一个mqtt的server端
tcp和udp缺点就不说了,看到很多esp群里怕丢包一个数据发十几次的都有
而mqtt可以说是改良的tcp,mqtt基于主题和消息内容来通讯,客户端订阅主题,有人推送一个主题,只有订阅了这个主题的人才能收到消息
ssh软件连接自己的云主机进入交互式shell界面(怎么连云主机自己摸索)
我的主机是64位centos6.9,ssh软件我用的xshell(xshell老版本被曝被人恶意植入后门,已经安装过的赶紧升级吧)


上图下面linux里命令我直接复制,图里的cat /etc/issue就是命令,那个绿色[root@localhost ~]#的是PS1,俩PS1之间夹的就是命令输出,PS1右侧就是命令,接下来我直接复制命令
---安装基本命令
[[email protected] ~]# yum install -y unzip wget &>/dev/null
---下载emq压缩包并以名字保存(-O选项后面接存为啥名字)
[[email protected] ~]# wget http://emqtt.com/downloads/2070/centos6 -O emqttd-centos6.8-v2.2.0.zip
这里我下的不是最新版本,原因后面讲
---解压压缩包
[[email protected] ~]# unzip emqttd-centos6.8-v2.2.0.zip
---启动emq
[[email protected] ~]# emqttd/bin/emqttd start
emqttd 2.0.7 is started successfully!
---打开浏览器界面输入你的ip:18083
!!进不去的话看看防火墙加了规则没,没加就加上,不过现在云主机都是安全组规则来控制,云主机的防火墙可以不用开,一般去登陆云主机供应商的网站的控制面板那里改下安全组的规则加端口号允许就行了,用到的端口有18083 8083 8084 1883


进去web后台会有登陆的窗口,默认用户名是admin密码public
登陆进去自行改密码
然后再plugins插件里把这个emq_auth_username给开启了,不然任何人使用mqtt协议都能连接你的server端


---然后在emq里增加用户名为test密码为test123456 (随意填写你开心就好)
[[email protected] ~]# emqttd/bin/emqttd_ctl users add test test123
ok
然后进web后台的websocket(网页的mqtt客户端,方便调试啥的)输入你添加的用户名和密码点击connect
然后下面的subscribe订阅输入一个主题消息名字点击subscribe


图里我输入的是hello


emq的官方文档里写着推送消息有http接口
在服务器上我们测试下推送一个hello主题,消息内容是ON的消息
[[email protected] ~]# curl -v --basic -u test:test123456 -d "qos=2&retain=0&topic=hello&message=ON" -k http://localhost:8083/mqtt/publish
(输出信息省略)


后台面板可以看到收到了一条消息为ON的
可以看到环境OK
---写个shell来接收主题名字和消息内容方便不用每次来输入一大串的curl
[[email protected] ~]# cat>/usr/bin/publish<<'EOF'
#/bin/bash
curl --basic -u test:test123456 -d 'qos=2&retain=0&topic='"$1"'&message='"$2" -k http://localhost:8083/mqtt/publish
EOF
---改下这个命令的权限
[[email protected] ~]# chmod 755 /usr/bin/publish
测试下看看能不能用


目前服务器端弄好了暂时



然后是硬件esp-8266,我用的是esp-12系列,10块包邮岂不美哉?


买的时候建议买个转接板方便接线
固件的源码工程我放在了github
https://github.com/zhangguanzhang/ESP8266_NONOS_SDK-mqtt-uart_set
求给个星星阿
从乐鑫官方的non_os的mqtt的demo修改,我用的是esp-12系列,12F和12S测试了都可以用
官方的自带的demo好像串口编译不通过,改了一些引用文件和增加了几个定义就能过了
具体信息可看github里的readme.md
下面是开发软件sdk链接,需要自己改的可以下载后导入我的工程来修改
链接:http://pan.baidu.com/s/1eSIIAdG 密码:vy55
---烧录固件
ESP8266_NONOS_SDK-mqtt-uart_set/bin/里的就是固件
下面是文件名对应的烧写地址
eagle.flash.bin——–>0x00000
eagle.irom0text.bin—->0x10000
上面俩文件是任何时候都必须烧录的,下面俩文件是刚拿到模块初始化必须烧录的
esp_init_data_default.bin—->0x3fc000
blank.bin—->0x3ff000
烧写软件链接:http://pan.baidu.com/s/1c1DgTwO 密码:z2dk
烧写的时候自己用串口电路或者usb转串口模块下载,我是直接接在原子mini板子上的串口电路下载的,GPIO0要拉低,然后点击start后reset引脚触碰下gnd就进入下载了


接线是VCC,GND,RX,TX 另外俩根是一个GND-GPIO0,那根杜邦针式接GND上的
点击了start后杜邦针触碰下reset就下载了
下载过程图如图所示


下载完后拔掉GPIO0的线,然后触碰下reset给个低电平重启下就行了,不拔掉GPIO的线的话不会进入工作模式并且会乱码
然后打开串口调试软件参数如图所示
初始的一些mqtt参数在app/include/mqtt_config.h里宏定义的


我改写了官方固件,通过串口即可设置参数,具体设置协议在我github的readme下拉就能看到
先设置wifi和mqtt的用户名密码和hid和你mqtt的server端的ip和端口,主机有域名也可以直接用域名,wifi名字不能是中文


设置好后发下show看看信息,无误后发送restart重启加载信息


上面的是连接不上的打印,我才意识到我手机开的wifi热点后我手机没打开数据流量,连接上了就是红框部分的下面
然后源码里默认订阅的主题是receive,推送主题名字是send,服务器上推送下一个ON的信息,
打印部份我的代码是判断云端的id部分是不是和自身一样,一样就打印,模块硬件id我设置成testid的上图可以看到
str_cut是我自定的函数,在uart.c里根据传入字符来分割字符串
也就是按照等号分割出第二部分的id写进temp后判断和自身id一致不,不一致就不打印,一致就打印信息




由此可见硬件可以和服务器通信了
--------------------------------------------------------------------------
8266是一款由wifi能力的mcu,有兴趣和时间的可以自己去研究sdk开发,不过我是只把它当作wifi传送数据的
有串口的单片机拿个串口接8266的串口上就可以传输了
处理云端的数据思路是以下这样: 举例 1假如连接不上wifi就是STATION_IDLE多次串口打印 2心跳包(Send keepalive packet to字样)的打印 所有动作和状态都会从串口输出,内容里包含多个回车换行符,所以建议串口中断不要以回车换行判定接收完成 建议开启一个定时器 串口中断里使能定时器并且接受每一个字节的时候定时器数值清零,溢出了直接标记flag标志位为接收完成并失能定时器,听不懂我这段话的话看下面图 参考原子的代码


然后是单片机部分的源码工程分享,写的很渣,就这样*大的拿去扩展吧
链接:http://pan.baidu.com/s/1bppj7aB 密码:wkz2
--------------------------------------------------------------------
顺带这样暂时处理的只是下发,写的那个publish可以用php调用外部命令来推送
服务器可以接入微信后根据消息type和正则匹配来推送消息给硬件就是微信控制硬件了
也可以自己写个页面然后ajax按钮发送调用那个publish推送就是网页控制硬件了
-------------------------------------------------------------------
发下自己之前录制的视频
链接:http://pan.baidu.com/s/1slFf4rr 密码:ebfy


这样只是下发,如果你的硬件要上传的话,可以在服务器上跑一个客户端来订阅硬件端推送的send主题来把消息写到数据库里,至于消息格式啥的我是纯字符串上传的
然后客户端我用的是mosquitto-1.4.5
字符串处理入库我用的是shell,估吧里没多少人看得懂我瞎写的,当初写的,等号分割每一部分,相当于自定义了个通信协议,代码里就是解析字符串后写入数据库




diao大的可以用其他语言来直接写个客户端处理或者erlang开发emq的插件
个人思路就是以上的,有疑问欢迎探讨
另外不用最新版的emq是发现开了那个username的插件后就连不上去了不知道怎么回事,还有官方的http接口看文档居然也推送不了,能解决的大佬可以分享下经验