尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ESP-RFID门禁系统进阶:MQTT与外部继电器实现智能控制

ESP-RFID门禁系统进阶:MQTT与外部继电器实现智能控制 1. 项目概述当ESP-RFID遇上外部继电器如果你玩过ESP8266/ESP32的RFID门禁大概率用过ESP-RFID这个经典固件。它把读卡器、Web配置界面和继电器控制都打包好了刷进去就能用非常方便。但不知道你有没有遇到过这样的尴尬项目做完了想换个更酷的界面或者想用手机App远程控制却发现ESP-RFID固件本身的功能扩展性有限尤其是想联动家里的智能开关或者接入更复杂的自动化场景时就有点捉襟见肘了。这就是“ESP-RFID with External Tasmota/Shelly”这个玩法的核心价值所在。它不再把ESP-RFID当作一个“黑盒”终端来用而是把它拆解成一个纯粹的“RFID事件触发器”。读卡、验证权限这些核心逻辑依然由ESP-RFID固件高效完成但最终执行“开门”这个动作的继电器被剥离出来交给了外部的、更强大的智能设备比如刷了Tasmota固件的Sonoff模块或者原生的Shelly智能开关。它们之间通过MQTT这个“万能胶水”进行通信。简单来说这就是一次经典的“解耦”操作。让专业的设备做专业的事ESP-RFID专注于精准、快速地识别卡片Tasmota/Shelly则负责提供稳定、可远程管理、能轻松融入智能家居生态的继电器控制。我之所以花时间折腾这套方案就是因为它在保持了入门级硬件成本的同时极大地提升了整个系统的灵活性、可靠性和可玩性。无论是想用Home Assistant做统一管理还是想设置复杂的自动化规则比如特定时间段刷卡才开门或者开门时同步点亮走廊灯都变得轻而易举。2. 核心思路与方案选型为什么是MQTT外部继电器在动手之前我们得先想清楚为什么要这么折腾。直接用ESP-RFID内置的继电器控制GPIO引脚接上一个继电器模块不是更简单吗确实简单但局限性也明显。2.1 内置继电器方案的瓶颈ESP-RFID固件默认控制一个GPIO引脚比如D1来驱动继电器。这个方案的问题在于控制逻辑单一只能实现简单的“刷卡-通电-延时-断电”逻辑。你想实现双击卡锁定、长刷卡常开或者根据时间、星期几来改变开门策略就需要大改固件源码对新手极不友好。状态反馈缺失你很难实时知道门锁当前是开着的还是关着的除非额外加传感器。对于安防场景状态不透明是个隐患。集成能力弱想把它接入苹果HomeKit、米家或者Home Assistant你需要额外搭建一个桥接服务比如Homebridge或ESPHome增加了系统的复杂度和故障点。可靠性依赖单一设备ESP8266/ESP32模块同时处理Wi-Fi连接、Web服务、数据库操作和GPIO控制。一旦网络波动或程序出现小问题可能会影响到继电器控制的稳定性。2.2 外部继电器方案的优势将继电器控制外置特别是交给Tasmota或Shelly这类设备优势立刻就出来了功能强大且独立Tasmota和Shelly本身就是成熟的物联网固件/设备自带定时器、规则引擎、功耗监测、OTA升级等功能。你可以用它们实现复杂的本地自动化逻辑即使断网也能正常工作。完美的状态反馈这些设备天生就通过MQTT或HTTP API报告自己的开关状态。门锁是开是关一目了然。无缝智能家居集成Tasmota和Shelly是Home Assistant等平台的原生公民添加起来非常简单。这意味着你的RFID门禁可以轻松和家里的灯光、摄像头、传感器联动。可靠性提升控制回路Tasmota/Shelly与识别回路ESP-RFID分离。即使ESP-RFID设备临时重启门锁状态也不会乱跳反之操作继电器也不会影响读卡识别的性能。2.3 通信协议选型为什么必须是MQTT在ESP-RFID和外部设备之间我们需要一个轻量、异步、跨网络的通信协议。HTTP轮询太笨重WebSocket需要长连接。MQTT消息队列遥测传输协议几乎是唯一的选择。发布/订阅模式ESP-RFID只需要在卡片验证通过后向一个特定的主题Topic发布一条消息比如rfid/door/command。它完全不用关心谁接收、有几个接收者。Tasmota/Shelly设备只需要订阅这个主题收到消息就执行动作。这种松耦合的设计正是我们需要的。极其轻量协议开销小非常适合ESP8266这类资源受限的设备。双向通信不仅可以发送命令Tasmota/Shelly也可以将状态变化发布到另一个主题如rfid/door/status理论上ESP-RFID的Web界面也可以订阅并显示门锁状态虽然固件默认不支持但为我们留下了扩展空间。所以整个方案的技术栈就清晰了ESP-RFID固件作为前端识别与事件发布者MQTT Broker如Mosquitto作为消息中枢Tasmota/Shelly设备作为命令订阅与最终执行者。注意ESP-RFID固件从某个版本开始才内置了MQTT客户端功能。在开始前请确保你下载或编译的固件版本支持MQTT。通常在其Web配置界面的“硬件设置”或“网络设置”部分能找到MQTT配置项。3. 硬件准备与网络架构搭建工欲善其事必先利其器。这套方案需要三类硬件你可以根据手头已有的设备灵活组合。3.1 硬件清单RFID识别核心主控ESP8266如NodeMCU、Wemos D1 mini或ESP32开发板。ESP32性能更强有蓝牙但做这个项目ESP8266绰绰有余。读卡器RC522射频读卡模块。这是最常用、最便宜的方案有效距离约3-5cm。如果追求更远的读卡距离10cm以上可以考虑PN532模块但价格和接线会稍复杂。连接线杜邦线若干。消息中枢MQTT Broker这是整个系统的“大脑”。你需要一个始终在线的设备来运行MQTT代理服务。强烈推荐使用你已有的家庭服务器例如树莓派安装Mosquitto常年开机的NAS如群晖、威联通通常有Mosquitto套件一台旧的电脑或虚拟机安装Linux或Windows版Mosquitto如果没有任何服务器也可以使用一些公共的MQTT Broker进行测试如test.mosquitto.org但绝对不建议用于正式的门禁系统因为涉及隐私和安全。继电器执行终端方案A高性价比DIY一个Sonoff Basic或Sonoff SV开关。这些设备本质就是ESP8266继电器。你需要通过串口工具如USB-TTL给它刷入Tasmota固件。刷好后它就变成了一个完全由你通过MQTT或Web控制的智能开关。方案B开箱即用一个Shelly 1或Shelly 1PM智能开关。Shelly设备原生支持MQTT和Web API无需刷机配置更简单做工和稳定性通常也更好当然价格也稍高。继电器负载根据你的门锁类型准备。常见的电控锁磁力锁、电插锁通常是12V供电需要连接一个12V电源适配器并通过继电器的常开NO端子来控制电路的通断。务必先确认门锁的工作电压和电流选择合适容量的继电器Shelly 1是16ASonoff Basic是10A一般门锁足够。3.2 网络架构图逻辑关系[ESP-RFID设备] (RC522 ESP8266) | | (Wi-Fi MQTT Publish) V [MQTT Broker] (运行在树莓派/NAS上) | | (MQTT Subscribe) V [Tasmota/Shelly设备] (继电器) | V [电控门锁] (12V/24V)3.3 第一步部署与配置MQTT Broker以在树莓派上安装Mosquitto为例# 更新软件包列表并安装Mosquitto sudo apt update sudo apt install mosquitto mosquitto-clients # 安装完成后服务会自动启动。可以设置开机自启并检查状态 sudo systemctl enable mosquitto sudo systemctl status mosquitto默认配置通常就够用。为了安全建议设置用户名密码# 创建密码文件首次 sudo mosquitto_passwd -c /etc/mosquitto/passwd your_username # 按提示输入密码 # 编辑Mosquitto配置文件 sudo nano /etc/mosquitto/conf.d/default.conf在配置文件中添加allow_anonymous false password_file /etc/mosquitto/passwd listener 1883保存后重启服务sudo systemctl restart mosquitto。 现在你的MQTT Broker就准备好了地址是树莓派的IP如192.168.1.100端口1883并需要用户名密码认证。4. ESP-RFID固件配置详解假设你已经按照常规方法将ESP-RFID固件刷写到了ESP8266开发板上并通过Web界面通常访问http://esp-rfid.local或设备IP完成了基础的Wi-Fi设置和用户卡片的添加。接下来是关键的MQTT配置部分。4.1 硬件连接将RC522模块连接到ESP8266这是标准接法RC522 VCC - ESP8266 3.3VRC522 GND - ESP8266 GNDRC522 SDA - ESP8266 D4 (GPIO2 这是许多ESP-RFID固件版本的默认引脚具体以你固件的文档为准)RC522 SCK - ESP8266 D5 (GPIO14)RC522 MOSI - ESP8266 D7 (GPIO13)RC522 MISO - ESP8266 D6 (GPIO12)RC522 RST - ESP8266 D3 (GPIO0)4.2 Web界面MQTT配置登录ESP-RFID的Web管理界面。进入“硬件设置”或“网络设置”不同版本位置可能略有差异寻找MQTT相关选项。找到MQTT配置区域通常包含以下字段启用勾选启用MQTT客户端。服务器填入你的MQTT Broker的IP地址例如192.168.1.100。端口默认1883。用户名/密码填写你在Mosquitto中设置的用户名和密码。客户端ID可以保持默认如esp-rfid-xxxx也可以自定义一个易于识别的名字如door_reader。主题Topic这是最核心的设置。你需要设置ESP-RFID发布消息的主题。发布主题建议设置为结构化的主题例如home/rfid/door/action。这意味着当有事件发生时消息会发送到这个主题。可选状态主题有些固件版本支持设置一个主题来发布设备自身的状态如在线状态可以设为home/rfid/door/status。消息内容配置这是让Tasmota/Shelly能理解命令的关键。你需要指定当“有效卡刷卡”和“无效卡刷卡”时分别发布什么样的MQTT消息。有效卡消息例如你可以设置为OPEN。那么当识别到一张已授权的卡片时ESP-RFID就会向home/rfid/door/action主题发布一条内容为OPEN的消息。无效卡消息可以设置为DENIED或留空。这可以用来触发警报或日志记录。保存设置并重启ESP-RFID设备。4.3 测试MQTT连接与消息发布在MQTT Broker所在的服务器上使用mosquitto_sub命令订阅主题来验证ESP-RFID是否成功连接并发布消息。mosquitto_sub -h localhost -p 1883 -u your_username -P your_password -t home/rfid/door/action -v用一张已授权的卡片靠近RC522读卡器。如果一切正常你将在终端看到实时输出的消息home/rfid/door/action OPEN这证明ESP-RFID已经成功将刷卡事件转换为了MQTT消息。我们的“触发器”部分已经就绪。实操心得在配置MQTT主题时建议采用清晰的层级结构如地点/设备类型/设备名/动作。这为未来扩展多个RFID读卡点如车库门、储物柜或接入家庭自动化平台如Home Assistant时进行自动化筛选和过滤提供了极大的便利。5. Tasmota/Shelly设备配置与规则编写现在我们需要让执行终端“听懂”OPEN这条命令并执行开门动作。这里分别介绍Tasmota和Shelly的配置方法。5.1 Tasmota设备配置以Sonoff Basic为例假设你已经成功将Sonoff Basic刷入了Tasmota固件并接入了同一Wi-Fi网络。基础配置通过Web界面设备IP访问Tasmota配置Wi-Fi和MQTT服务器同样是你的Broker地址和认证信息。确保“继电器1”的开关功能正常。配置订阅Subscribe这是关键步骤。我们需要让Tasmota订阅ESP-RFID发布命令的主题。在Tasmota的Web控制台输入以下命令Backlog Subscribe2 home/rfid/door/action; Rule1 ONSubscribe2命令让设备订阅主题home/rfid/door/action并将接收到的消息内容存储到变量%value%中。Rule1 ON启用规则1我们将用规则来处理消息。编写处理规则Rule继续在控制台输入Backlog Rule1 ON MQTT#Datahome/rfid/door/action DO Power1 %value% ENDON; Rule1 1让我们拆解这条规则Rule1 ON规则1生效。MQTT#Datahome/rfid/door/action当从home/rfid/door/action主题收到MQTT数据时触发。DO Power1 %value% ENDON执行的动作是将继电器1Power1的状态设置为接收到的消息内容%value%。Rule1 1立即执行一次规则1用于激活。测试此时当你用授权卡在ESP-RFID上刷卡Tasmota设备会收到OPEN消息并将%value%设为OPEN然后执行Power1 OPEN。但是Tasmota的Power命令通常只识别ON、OFF、TOGGLE。所以我们需要一个转换。优化规则消息转换我们需要一个更智能的规则将OPEN转换为ON并可能添加一个自动关门的延时。Backlog Rule1 ON MQTT#Datahome/rfid/door/action DO Event trigger_rfid%value% ENDON; Rule1 1这条规则将收到的消息内容存入一个自定义事件trigger_rfid。 然后我们再创建规则2来处理这个事件Backlog Rule2 ON Event#trigger_rfidOPEN DO Power1 ON; Rule2 1现在收到OPEN时继电器会打开通电开门。但我们还需要它自动关闭。Tasmota有Delay命令。我们可以修改规则2Backlog Rule2 ON Event#trigger_rfidOPEN DO Power1 ON; Delay 5; Power1 OFF ENDON; Rule2 1这条规则的意思是触发开门后继电器打开等待5秒Delay 5然后继电器关闭。这个5秒就是门锁保持通电打开的时间你可以根据门锁的机械动作时间调整通常3-10秒。5.2 Shelly设备配置以Shelly 1为例Shelly的配置相对更图形化对新手更友好。基础网络与MQTT配置手机连接Shelly设备自身的热点Shelly-XXXX进入其Web配置页面通常是192.168.33.1。配置Wi-Fi使其连接到你的家庭网络。进入“互联网与安全” - “MQTT”页面。启用MQTT填写Broker地址、端口、用户名、密码。自定义主题这是重点。在“自定义MQTT前缀”中设置一个前缀例如shelly1-door。Shelly会自动生成一系列主题如shelly1-door/relay/0/command用于接收命令。配置自动化Script或直接订阅方法一推荐使用Shelly的“场景”功能进入“场景”页面创建一个新的场景。触发器选择MQTT主题填写ESP-RFID发布消息的主题即home/rfid/door/action。条件可以设置{{payload}}等于OPEN。动作选择开关-打开然后添加一个延迟动作比如5秒再添加一个开关-关闭动作。方法二直接MQTT命令如果你不想用场景也可以让ESP-RFID直接向Shelly的命令主题发布消息。但这需要ESP-RFID发送Shelly能识别的特定JSON消息不如方法一灵活。例如Shelly 1的命令主题shelly1-door/relay/0/command接收on、off、toggle。你可以尝试在ESP-RFID的有效卡消息里直接填on但这样就无法方便地添加延时关闭逻辑除非ESP-RFID固件支持发送延时命令通常不支持。注意事项无论是Tasmota的规则还是Shelly的场景都建议在配置完成后先通过MQTT测试工具如MQTT Explorer、MQTT.fx手动向home/rfid/door/action主题发送OPEN消息测试继电器动作是否按预期执行即吸合-延时-断开然后再进行实际的刷卡测试。这能有效避免因配置错误导致门锁异常通电。6. 系统集成与高级玩法基础功能实现后这套系统的强大之处才真正显现出来。因为它基于MQTT和标准的智能家居设备集成能力非常强。6.1 接入Home Assistant实现集中管理与高级自动化在Home Assistant中Tasmota和Shelly都可以被自动发现或轻松手动添加。添加后你的门锁继电器就会作为一个普通的“switch”实体出现。你可以创建如下自动化状态同步与通知当门锁被刷卡打开时在Home Assistant App上发送一条通知并记录到日志中。# 示例当Tasmota继电器打开时发送通知 automation: - alias: Door Unlocked Notification trigger: platform: state entity_id: switch.tasmota_relay_power1 # 替换为你的实体ID to: on action: - service: notify.mobile_app_your_phone data: message: 前门于 {{ now().strftime(%H:%M) }} 通过RFID解锁条件触发实现“仅在晚上7点到早上7点之间刷卡开门才自动点亮门口灯”。虚拟钥匙在Home Assistant中创建一个“虚拟按钮”点击后模拟发送OPEN的MQTT消息实现手机App远程开门。联动摄像头开门时自动触发门口的摄像头拍照或录制一段短视频并保存。6.2 实现多因子认证与安全增强单纯的RFID卡存在丢失或复制的风险。结合其他传感器可以轻松提升安全性RFID 密码在ESP-RFID的Web界面上可以为每张卡设置一个PIN码。刷卡后需要在Web界面可以做成一个简单的本地页面或通过其他方式如蓝牙键盘输入PIN码验证通过后再发布MQTTOPEN命令。这需要修改ESP-RFID的源码有一定难度。RFID 人体传感器在Home Assistant中创建自动化当且仅当人体传感器检测到门口有人并且收到合法的RFID刷卡事件时才触发开门。这样可以防止误触发或尾随。入侵告警在Tasmota/Shelly设备上可以配置一个物理按钮如果有的话或通过规则在继电器状态异常如未知原因被打开时向一个报警主题发布消息触发Home Assistant的声光报警。6.3 系统监控与维护设备在线状态Tasmota和Shelly都支持通过MQTT发布“心跳”消息Last Will and Testament, LWT。你可以在Home Assistant中监控这些消息如果设备离线立即收到告警。日志记录所有刷卡事件卡号、时间、结果都被记录在ESP-RFID设备的内部存储文件系统中。你可以定期通过Web界面查看或导出。更高级的做法是让ESP-RFID在刷卡时除了发布OPEN命令再向另一个主题如home/rfid/door/log发布一条包含卡号和时间的详细JSON日志由Home Assistant或其他服务如Node-RED接收并存入数据库如InfluxDB进行长期分析和可视化。7. 常见问题与故障排查实录在实际部署中你几乎一定会遇到下面这些问题。这里是我踩过坑后的经验总结。7.1 MQTT连接失败现象ESP-RFID或Tasmota Web界面显示MQTT断开或者订阅不到消息。排查步骤检查Broker在Broker服务器上运行sudo systemctl status mosquitto确保服务正在运行。检查防火墙是否放行了1883端口。检查网络连通性从ESP-RFID或Tasmota设备的网络尝试ping你的Broker IP地址。检查认证信息用户名、密码、客户端ID是否填写正确。特别注意Tasmota的MQTT密码字段如果密码包含特殊字符可能需要用引号括起来。查看日志Mosquitto的日志sudo tail -f /var/log/mosquitto/mosquitto.log和Tasmota的串口日志通过串口工具查看会提供详细的连接错误信息如“认证失败”、“无法连接”等。7.2 刷卡后继电器无反应现象刷卡时ESP-RFID的LED灯或Web界面有反应但Tasmota/Shelly继电器没动作。排查步骤确认消息发布在Broker上订阅home/rfid/door/action主题确认刷卡时能收到OPEN消息。如果收不到问题在ESP-RFID配置主题名、消息内容。确认消息订阅在Broker上订阅Tasmota/Shelly用于接收命令的主题如Tasmota的cmnd/主题或Shelly的命令主题看是否有消息转发过来。如果没有检查Tasmota/Shelly的MQTT配置和订阅命令。检查规则/场景对于Tasmota在控制台输入Rule1查看规则状态和内容是否正确。对于Shelly检查场景的触发条件和动作是否配置无误。手动命令测试绕过ESP-RFID直接用MQTT发布工具向Tasmota/Shelly的命令主题发送ON或off命令看继电器是否动作。这能隔离出是前端触发问题还是后端执行问题。7.3 继电器动作但门锁不工作现象继电器“咔哒”响了一下但门锁没反应。排查步骤电压电流检查用万用表测量继电器输出端子在触发时是否有电压输出12V或24V。如果没有检查电源适配器是否正常工作接线是否牢固。门锁本身断开我们的控制电路直接将门锁的正负极接到电源上看门锁是否能正常吸合/弹出。排除门锁机械故障或损坏。继电器类型确认你使用的是常开NO端子。如果你接在了常闭NC或公共端COM电路可能无法正常导通。延时时间如果继电器闭合时间太短比如只设置了1秒可能不足以让电控锁完成完整的机械动作。适当增加Tasmota规则或Shelly场景中的延时时间如增加到5-8秒。7.4 系统稳定性问题现象偶尔出现刷卡无效、延迟大或设备离线。排查与优化Wi-Fi信号ESP-RFID和Tasmota/Shelly设备所在位置的Wi-Fi信号强度是关键。使用手机App测试信号强度如果较差考虑增加Wi-Fi中继器或调整路由器位置。MQTT Broker负载如果你的Broker运行在树莓派上且同时运行了很多其他服务可能会资源不足。可以监控树莓派的CPU和内存使用率。考虑使用更轻量的Broker或者将Mosquitto迁移到性能更好的设备上。设备重启策略为ESP-RFID和Tasmota设备配置定时的“看门狗”或计划重启例如每周日凌晨4点重启一次可以清除内存碎片解决因长时间运行可能出现的微小内存泄漏问题。这在Tasmota中可以通过Rule和Clock组件轻松实现。这套“ESP-RFID with External Tasmota/Shelly”的方案我从最初的简单测试到最终稳定运行前后调试了差不多一周。最大的体会是前期清晰的架构设计和每个环节的独立测试至关重要。不要试图一口气把所有东西连起来而是应该像搭积木一样先确保MQTT Broker工作正常再测试ESP-RFID能正确发布消息接着验证Tasmota/Shelly能响应命令最后才连接门锁进行整体联调。每完成一步就做一个标记这样当问题出现时你就能快速定位到是哪一个“积木”出了问题。
返回列表