数码之家

 找回密码
 立即注册
搜索
查看: 2165|回复: 15

[Arduino] 用ESP8266+MQTT构建完全属于自己的物联网平台

[复制链接]
发表于 2024-10-3 18:22:27 | 显示全部楼层 |阅读模式
本帖最后由 hecat 于 2024-10-6 11:31 编辑

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>
    软件包下载<MQTT Demo.7z><MQTT dashboard_0.4.5_APKPure.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用电脑搭。

增加一个测试视频

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

打赏

参与人数 5家元 +180 收起 理由
dz20062008 + 30 謝謝分享
信徒1102 + 10 最近基于前一段时间研究的rk3288+esp32s2,.
hylg + 50 優秀文章
vip2128 + 30 謝謝分享
不长叶子的树 + 60

查看全部打赏

发表于 2024-10-3 21:58:43 | 显示全部楼层
感谢楼主分享.这个应该很有用,空了试一试.
回复 支持 反对

使用道具 举报

发表于 2024-10-3 23:09:22 | 显示全部楼层
这种应用,如果服务器端能在路由器上实现就更好了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-4 08:57:32 | 显示全部楼层
mmxx2015 发表于 2024-10-3 23:09
这种应用,如果服务器端能在路由器上实现就更好了。

你还别说,查了一下,还真有这样的方案

openwrt安装mosquitto、openwrt部署MQTT中间服务器
https://blog.csdn.net/hehj369986957/article/details/108782242
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:02:53 | 显示全部楼层
这个不错,我选米家
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:18:14 来自手机浏览器 | 显示全部楼层
手上有2个esp8266可以玩下
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:29:57 | 显示全部楼层

这可厉害了,看一眼当年研究刷机的劲头就上来了,必须顶起马克起
回复 支持 反对

使用道具 举报

发表于 2024-10-4 09:59:14 | 显示全部楼层
应用应该很多的,楼主加油。
回复 支持 反对

使用道具 举报

发表于 2024-10-4 16:01:41 | 显示全部楼层
感谢楼主分享,原来有ESP8266找出来折腾看看
回复 支持 反对

使用道具 举报

发表于 2024-10-4 16:42:01 | 显示全部楼层
可以用tasmota
回复 支持 反对

使用道具 举报

发表于 2024-10-5 17:10:39 | 显示全部楼层
Home gateway谢谢分享
回复 支持 反对

使用道具 举报

发表于 2024-10-9 10:26:22 | 显示全部楼层
这个能实现retain功能吗
回复 支持 反对

使用道具 举报

发表于 2024-10-11 08:15:05 来自手机浏览器 | 显示全部楼层
感谢分享,回头也搞一个,正好有需求。
回复 支持 反对

使用道具 举报

发表于 2024-10-13 23:41:45 来自手机浏览器 | 显示全部楼层
要是能外网就好了…
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-14 00:02:48 | 显示全部楼层
触景情伤 发表于 2024-10-13 23:41
要是能外网就好了…

前面第8点有讲这个问题:8. 关于公网访问

其实搞定家庭网络的公网IP和DDNS,家庭网络还有更多的玩法。
对于不熟悉的同学来说是有点困难,但这是可以完成的任务。
回复 支持 反对

使用道具 举报

发表于 2024-10-19 08:42:47 来自手机浏览器 | 显示全部楼层
不如esphome,mqtt还要搭服务器,程序也更麻烦,esphome而且被ha收购了,稳定性和后期更新也是更加完善的,而且不需要下载软件,在线就可以烧写
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-1 22:53 , Processed in 0.312001 second(s), 13 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表