标题: 用ESP8266+MQTT构建完全属于自己的物联网平台 [打印本页]
作者: Hecat 时间: 2024-10-6 11:19
标题: 用ESP8266+MQTT构建完全属于自己的物联网平台
1. 简介
使用Arduino + ESP8266,基于MQTT协议,构建完全属于自己的物联网平台。
完全属于自己,意思是包括MQTT Broker(MQTT服务器)都自己搭建,而且是使用ESP8266,这是亮点。
由于不依赖于任何第三方服务平台,不担心他们跑路和忍受各种使用限制。
MQTT支持用户认证,具有一定的安全性。
有开放的手机端App支持。
基本平台可以在局域网内运行,如果你有公网IP和域名,也可以从公网访问。
这里仅给出一个最小系统的Demo教程,近乎手把手教你搭建整个系统。Demo实现两个独立设备上LED的本地和远程控制。
写这个教程,是因为最近发现了一个好东西,PicoMQTT库。我找能在ESP8266上运行的Broker很久了,可能是关键字太过精准,找到的Broker都不好用或用不起来。前段时间突发奇想,在Arduino的库上扒拉,把包含mqtt或沾边的库都人肉过滤了一遍,找到了PicoMQTT。经过一段时间的试用,觉得它完全能够替代电脑端的Broker。
2. 软硬件需求
硬件:ESP8266开发板2套(其实1套也可以,仅编译和下载Broker,配合手机App即可完成验证)
ESP8266开发板通常搭载ESP-12系列模块,模块带一个蓝色LED,开发板还有一个切换引导模式的物理按键,按键旁边通常标注了”FLASH”丝印,有这两个外设就可以完成这个Demo。
ESP8266开发板,最方便的是用淘宝那种自带USB串口的开发板,板上有一个USB转串口芯片加一个模块,它支持Arduino串口自动下载,暂时不用去关心ESP8266的引导模式。
[01.开发板.png] [02.开发板.png]
WiFi和路由器:此Demo要有可用的2.4GHz WiFi网络,路由器要能为客户端设定静态IP地址(仅Broker有此要求)
开发软件:Arduino 2.x下载地址
https://www.arduino.cc/en/software
https://downloads.arduino.cc/arduino-ide/arduino-ide_2.3.3_Windows_64bit.exe
应用软件:安卓App用MQTT仪表台软件(iOS也有类似应用)
<MQTT Dash (IoT, Smart Home)_4.4_APKPure.apk>
<MQTTdashboard_0.4.5_APKPure.apk>
Demo例程
<ESP8266_Broker> MQTT Broker(服务器)例程
<ESP8266_Client> MQTT客户端例程
软件包下载<MQTT Demo.7z>,包含上面两个App和例程代码。
3. 建立Arduino开发环境
运行Arduino安装包arduino-ide_2.3.3_Windows_64bit.exe,如果有防火墙提示,全部允许。
安装完成,启动Arduino,开始配置:
[a01.png]打开Arduino配置菜单,File-Preferences...
[a02.png]添加ESP8266开发板管理器地址,填入
http://arduino.esp8266.com/stable/package_esp8266com_index.json
[a03.png]更改语言为中文,点OK提交,会被要求重启软件。
[a04.png]打开开发板管理器菜单,工具-开发板-开发板管理器...
[a05.png]在搜索框中输入esp8266(区分大小写),搜索出来后,点击esp8266 by ESP8266下面的安装按钮,安装esp8266开发板支持包,包有点大,要花点时间。
[a07.png]打开软件库管理,工具-管理库...
[a08.png]搜索PicoMQTT(区分大小写),点安装
[a09.png]搜索PubSubClient(区分大小写),安装,安装完成后关掉Arduino IDE。
4.编译和下载ESP8266_Broker例程到ESP8266开发板
[a10.png] 把其中一个开发板插入电脑,我们先编译和烧写Broker。解压压缩包,找到并双击ESP8266_Broker.ino启动Arduino IDE。
[a11.png]为工程指定开发板ESPino(ESP-12 Module)
[a12.png]首次下载程序,选用开发板对应的串口。如果有多串口的,在设备管理器里面,通过插入和拔出开发板,确定串口号。如果需要串口驱动请自行安装。
[a13.png]修改WiF配置:选中<ESP8266LibCfg.h>,把STA_SSID和STA_PSK修改成你WiFi的SSID和密码。
[a14.png]开始编译和上传(烧写程序到ESP8266),项目-上传,第一次编译时间可能比较长
[a15.png]烧写完成后的样子,输出框有进度、校验、硬件复位等提示。
[a16.png]打开串口监视器,工具-串口监视器
[a17.png]波特率选115200,按开发板的复位RST,串口能看到ESP8266的引导提示和获取到的IP地址,模块的蓝色LED会亮起来,按FLASH按钮,LED会亮灭变换,同时会看到串口LED状态同步更新。
5.配置路由器,给Broker分配一个静态IP地址
分配静态IP地址是为了让路由器在Broker每次连接的时候得到一个不变的IP地址。因为MQTT客户端连接到Broker的地址,不能是变化的,并且后期公网端口映射也需要静态IP地址。
由于不同路由器的配置方法不同,大致就是在LAN设置里面,把Broker加到静态地址列表。请自行查看路由器帮助文档进行设置。
(如果暂时无法完成Broker静态地址的配置,只要Broker不断电重连,通常IP地址不会变化,可以记下这个IP地址继续下面的实验。但如果要正式投入使用,还是需要固定IP地址。)
6.编译和下载ESP8266_Client例程到ESP8266开发板
[a18.png]按照第4步方法,把另一个开发板接入电脑的USB口(前面已下载好的Broker不要从电脑上拔下来,等待MQTT Client连接),打开ESP8266_Client工程,配置开发板和下载串口,然后配置<ESP8266LibCfg.h>,把STA_SSID和STA_PSK修改成你WiFi的SSID和密码,把MQTT_BROKER_ADDR后面的IP地址换成你前面Broker的IP地址。
[a19.png]同样打开串口监视仪,配置波特率115200,并按一下开发板的复位,能看到WiFi和MQTT的连接状态,如下图所示表示WiFi和MQTT都连接成功。
7. 安卓MQTT仪表台软件配置
下面以<MQTT Dash (IoT, SmartHome)_4.4_APKPure.apk>举例配置方法
安装App,并运行App
[b01.png]打开MQTTDash,点右上角+添加服务器
[b02.png]Name可随便填,地址填写前面MQTT Broker的IP地址,端口填1883,下面用户名填User,密码填12345678,点右上角的磁盘图标保存配置。
(用户名和密码与<ESP8266LibCfg.h>里面的
#define BROKER_USERNAME "User"
#define BROKER_PASSWORD "12345678"
保持一致)
[b03.png]Test服务器添加完成,App主界面多了一个Test控件。
[b04.png]点击进入Test后,点右上角+新建控件
[b05.png]点Switch/button,添加开关控件
[b06.png]这个开关我们用来控制Broker的LED,Name里填写” BrokerLED”(可随意填写);Topic(sub)里面填写BT_LED,下面Topic(pub)填写BR_LED,然后点右上角磁盘图标保存。
Broker的控制按钮创建好了,没有意外的话,按这个按钮就可以控制Broker的LED了。
(所有的Topic在源代码里都能找到定义)
[b07.png] Broker LED控制按钮创建好了,点击右上角+继续创建Client LED按钮。
[b08.png]按图输入名称和两个Topic,保存即可。
[b09.png]Broker和Client的控制按钮都创建完成。
可以通过这两个按钮分别控制两个开发板的LED了。
如果按开发板的FLASH按钮,改变LED状态,会同步更新到App界面。
至此,大功告成。
8. 关于公网访问
如果你有公网IP和DDNS,在路由器上添加一个端口映射即可。公网端口选一个非标准服务端口,映射到内网Broker IP的1883端口上即可。
公网IP,可以试着向ISP服务商(电信、联通、移动等互联网提供商)申请,如果申请成功,请ISP服务商把光猫改成桥接模式,并要到宽带账号密码,在你自己的路由器上拨号上网。
只有公网IP,没有动态域名,公网也没法用。接着该去申请免费的动态域名了。
TPLink的部分路由器内置支持DDNS刷新服务,从TPLink申请一个账号,再申请一个tpddns的二级域名,在路由器上配置好即可。另外部分TPLink路由器还支持第三方动态域名刷新服务,比如花生壳,3322、科迈等。
不用路由器,也可以使用电脑端刷新动态域名。各动态域名提供商一般都有Windows平台的刷新软件,找个NAS挂着就行。很久没有研究过免费动态域名了,最新行情啥样也不清楚,各位自己试试吧。
现在,假设你已经有了动态域名,并配置好,Broker也映射到公网。
和Broker在同一个局域网的MQTT客户端,使用局域网IP访问Broker,保证可靠性;手机和局域网外的客户端,使用动态域名访问Broker,保证移动性和连接性。
没有公网IP和动态域名,在局域网运行也有一定的实用价值。
9. 关于OTA
Demo已经内置了Arduino的OTA,当你后续更新ESP8266的时候,可以使用OTA更新,密码是0000,具体细节就不展开讲了,网上教程很多,请自行查找。
10. 关于另一个安卓App和iOS App
附件里另一个安卓App是<MQTTdashboard_0.4.5_APKPure.apk>,也可以用于MQTT控制,控件更多,更花哨,它的架构和<MQTT Dash (IoT, Smart Home)_4.4_APKPure.apk>有点不同,请大家自行尝试。
4.4版本的是以Broker为顶层,生成的Dash都是该Broker的交互。
而0.4.5版本的App,有一个Broker池,每个Dash可以包含多个Broker,也就是多个Broker交互可以混合在一起。
iOS在App Store里面也有MQTT相关的App可用,暂时没精力去逐个逐个找好用的了。
11. 关于PicoMQTT库和PubSubClient库
PicoMQTT客户端库,回调函数与Sub一一对应;
PubSubClient客户端,只有一个回调函数,需要工程师自行区别Topic,分别处理。
12. 其他
*. 关于PicoMQTTBroker性能。在GitHub上,开发者对PicoMQTT作了比较详细的性能测试,从测试结果来看,对于个人或家庭应用足够了。附件Doc里面有打包下载的性能测试文档。
*. PicoMQTT也包含客户端库,但是ESP8266_Client工程并没有用PicoMQTT客户端库,而是用的PubSubClient。前段时间一个控制器用了PicoMQTT的客户端库,使用中出现未知原因随机重启,换用PubSubClient后正常。在找到PicoMQTT之前,我一直用的PubSubClient,Broker用电脑搭。
附测试视频
作者: zying 时间: 2024-10-9 18:34
找不到库PicoMQTT.h
作者: Hecat 时间: 2024-10-9 20:42
安装PicoMQTT库了没?
参考上面 [a08.png]搜索PicoMQTT(区分大小写),点安装
作者: zying 时间: 2024-10-9 21:52
搜索不到PicoMQTT
作者: zying 时间: 2024-10-9 22:02
呵呵~找到了!编译成功!谢谢分享!!
作者: zying 时间: 2024-10-11 15:15
请问修改另一个通道编译不成功。
作者: zying 时间: 2024-10-11 16:04
搞定了!修改一下定义!
作者: 小白艾世雄 时间: 2024-10-14 08:11
感谢楼主的分享,收藏了慢慢看。
作者: hhdsdy 时间: 2024-11-6 21:32
谢谢楼主的分享!我编译ESP8266_Client没有问题,但在编译ESP8266_Broker时报错,报错信息分别如下,请问是什么原因?
Error while detecting libraries included by C:\Windows\TEMP\arduino_build_376235\sketch\ESP8266_Broker.ino.cpp
Error while detecting libraries included by C:\Windows\TEMP\arduino_build_376235\sketch\ESP8266Lib.cpp
Error while detecting libraries included by C:\Windows\TEMP\arduino_build_376235\sketch\key.cpp
Error while detecting libraries included by C:\Windows\TEMP\arduino_build_376235\sketch\main_routing.cpp
Error while detecting libraries included by C:\Windows\TEMP\arduino_build_376235\sketch\mqtt.cpp
error PicoMQTT requires ESP8266 board core version >= 3.1
作者: Hecat 时间: 2024-11-8 08:17
[a02.png]添加ESP8266开发板管理器地址,填入
http://arduino.esp8266 com/stable/package_esp8266com_index.json
开发板是不是按上面填的?开发板包有没有更新成功?
作者: Hecat 时间: 2024-11-8 08:20
有最后一个错误,"Error PicoMQTT requires ESP8266 board core version >= 3.1",怀疑与开发板支持包有关。
访问国外的一些网站不是很稳定,多试试吧。
作者: hhdsdy 时间: 2024-11-8 17:59
发表于 2024-11-8 08:17
[a02.png]添加ESP8266开发板管理器地址,填...
我之前有用过ESP8266,开发板的管理地址用的是 www arduino cn/package_esp8266com_index.json ,一直都是很正常使用的,刚才用你提供的地址替换并确认,没有提示重启,编译也是一样的错误。
作者: Hecat 时间: 2024-11-8 21:14
hhdsdy 发表于 2024-11-8 17:59
我之前有用过ESP8266,开发板的管理地址用的 ...
我新装Arduino,开发板使用www arduino cn/package_esp8266com_index.json,连不上。
如果你愿意,试试把 C:\Users\xxx\AppData\Local\Arduino15\packages下面的ESP8266开发板删除,再从IDE里面重新安装。
压缩包里面的IDE和例程是用全新虚拟机一步一步安装、编译截图来的,例程应该不会有问题。
作者: hhdsdy 时间: 2024-11-9 10:15
删除旧的重新安装,还是一摸一样的的结果,应该是其它的原因了,不知道会不会和我使用win7有关?
作者: angalp 时间: 2024-11-9 11:00
收藏学习!
作者: Hecat 时间: 2024-11-10 12:38
你装的IDE是1.8.x还是2.3.x的?
这两个版本差别有点大。
我在WIN7的虚拟机上,2.3.x的IDE运行不起来。
-
新建位图图像.png
(100.15 KB, 下载次数: 0)
作者: hhdsdy 时间: 2024-11-10 15:59
1.8.19的,更高版本的好像在win7上不能用的,会不会和版本低有关系?
作者: Hecat 时间: 2024-11-10 20:34
估计是有库不支持1.8.x的IDE了
作者: jinyudz 时间: 2024-11-25 18:51
感谢楼主,这么详细的资料。
作者: pq1972 时间: 2025-1-3 11:57
谢谢这么详细,马上开始照葫芦画瓢
作者: wy010170 时间: 2025-1-23 17:35
Client ID是必填项,没找到啊?
作者: rsx9583 时间: 2025-2-8 11:18
为啥我很反感Arduino



作者: Highnose 时间: 2025-2-23 11:55
哪位编译通过了?
作者: Highnose 时间: 2025-2-23 12:03
自己不行,还啥看不上,顶顶大名的aduipliot飞控就是Arduino写的
作者: Highnose 时间: 2025-2-23 16:52
我在win10下成功了,服务器和客户端的灯都能控,非常棒
作者: sdvic 时间: 2025-4-26 15:25
这APP还不错,简单的设置了一下,我在homeassistant 的MQTT里都可以发布和订阅数据了!
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |