一、方案概述
核心特性
- 低成本开源:完全自主可控,无供应商锁定
- 断电安全:电控锁断电自动锁闭,机械钥匙备份
- 三重控制:Wi-Fi MQTT + 蓝牙备用 + 机械钥匙应急
- 极简部署:3个门可在2-3天内完成部署
技术架构
设备层:ESP32-C3继电器一体板 ×3
通信层:MQTT协议(轻量级物联网协议)
控制层:手机APP直接控制(无网页界面)
物理层:1073断电闭锁电控锁 + 机械钥匙
二、硬件配置
2.1 核心组件清单
-
控制器:ESP32-C3一体板 ×3
- RISC-V单核160MHz,Wi-Fi + 蓝牙5.0
- 5-24V宽电压输入,USB-C接口
- 内置继电器,可直接控制电锁
-
电锁:1073断电闭锁型 ×3
- DC 12V供电,工作电流300-500mA
- 通电开门(≤10秒),断电自动锁闭
- 带钥匙孔和内部紧急旋钮
-
电源系统:
- 12V集中供电电源(根据总电流需求选择)
- 建议配置小型UPS保障短暂停电
-
网络设备:
- 家用路由器(已有)
- 旧电脑(运行MQTT服务器)
2.2 接线方案(单门)
[12V电源+] → [ESP32-C3 VIN+]
[12V电源+] → [继电器NO端子]
[继电器COM] → [1073电锁+]
[1073电锁-] → [12V电源-]
[ESP32-C3 GND] → [12V电源-]
三、软件配置
3.1 MQTT服务器部署(旧电脑)
bash
# 使用Docker快速部署
docker run -d --name mosquitto \
-p 1883:1883 \
-v /mosquitto/data:/mosquitto/data \
eclipse-mosquitto
# 验证运行
mosquitto_sub -h localhost -t "test" &
mosquitto_pub -h localhost -t "test" -m "hello"
3.2 ESP32-C3固件核心
cpp
#include <WiFi.h>
#include <PubSubClient.h>
// 配置区(每个门不同)
const char* ssid = "WiFi名称";
const char* mqtt_server = "192.168.1.100"; // 旧电脑IP
const char* client_id = "door_1"; // 唯一ID
const int RELAY_PIN = 2; // 继电器控制引脚
// 主题定义
const char* control_topic = "door/1/control";
const char* status_topic = "door/1/status";
WiFiClient espClient;
PubSubClient client(espClient);
// 开门函数(控制1073锁)
void openDoor(int duration = 3000) {
digitalWrite(RELAY_PIN, HIGH); // 通电开门
delay(duration); // 保持3秒
digitalWrite(RELAY_PIN, LOW); // 断电锁门
client.publish(status_topic, "opened");
}
// MQTT消息处理
void callback(char* topic, byte* payload, unsigned int length) {
String msg = "";
for(int i=0; i<length; i++) msg += (char)payload[i];
if(msg == "OPEN") openDoor();
else if(msg == "STATUS") reportStatus();
}
void setup() {
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW); // 初始锁门状态
WiFi.begin(ssid, password);
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
// 连接MQTT
while(!client.connected()) {
client.connect(client_id);
client.subscribe(control_topic);
}
}
void loop() {
if(!client.connected()) reconnect();
client.loop();
}
3.3 主题命名规范
控制指令:door/{门编号}/control
状态上报:door/{门编号}/status
系统监控:system/{设备ID}/heartbeat
示例:
门1:door/1/control → 接收开门指令
门2:door/2/status → 上报状态信息
四、手机控制方案
4.1 MQTT Dashboard APP(推荐)
配置步骤:
- 安装APP(支持Android/iOS)
- 添加MQTT服务器:
- 地址:旧电脑IP(如192.168.1.100)
- 端口:1883
- 无认证(开发环境)
- 创建控制面板:
- 按钮1:发布到 door/1/control,消息:"OPEN"
- 按钮2:发布到 door/2/control,消息:"OPEN"
- 按钮3:发布到 door/3/control,消息:"OPEN"
优势:
- 无需开发,立即使用
- 支持按钮、开关、滑块等多种控件
- 可保存多个服务器配置
- 完全离线使用,无云依赖
4.2 蓝牙备用控制(Wi-Fi故障时)
cpp
// ESP32-C3蓝牙支持
#include <BluetoothSerial.h>
BluetoothSerial SerialBT;
void setup() {
SerialBT.begin("DoorLock-1"); // 蓝牙设备名称
}
void handleBluetooth() {
if(SerialBT.available()) {
String cmd = SerialBT.readString();
if(cmd == "OPEN") openDoor();
}
}
使用方式:
- 手机蓝牙连接"DoorLock-1"
- 发送"OPEN"指令开门
- 无需网络,直连控制
五、安全与可靠性设计
5.1 断电安全策略
1073电控锁特性:
- 类型:断电闭锁(Fail-Secure)
- 行为:断电时锁舌自动弹出锁门
- 优势:停电时不会被非法进入
- 备份:机械钥匙 + 内部旋钮
5.2 网络容错设计
主通道:Wi-Fi MQTT → 正常使用
备用通道:蓝牙直连 → Wi-Fi故障时
应急通道:机械钥匙 → 完全断电时
5.3 自动恢复机制
cpp
// 网络自动重连
void reconnect() {
while(!client.connected()) {
if(client.connect(client_id)) {
client.subscribe(control_topic);
client.publish(status_topic, "reconnected");
} else {
delay(5000); // 5秒后重试
}
}
}
// 定期状态上报
void reportStatus() {
String status = "{";
status += "\"rssi\":" + String(WiFi.RSSI()) + ",";
status += "\"heap\":" + String(ESP.getFreeHeap()) + ",";
status += "\"uptime\":" + String(millis()/1000);
status += "}";
client.publish(status_topic, status.c_str());
}
六、部署实施
6.1 实施时间线
第一天:准备与采购
- 采购所有硬件组件
- 准备安装工具
- 规划安装位置
第二天:软件部署
- 旧电脑安装MQTT服务器
- 刷写3个ESP32-C3固件
- 手机安装配置MQTT Dashboard
第三天:硬件安装
- 安装1073电控锁(3个门)
- 接线和固定ESP32-C3板
- 通电测试和网络配置
第四天:测试验收
- 全面功能测试
- 停电应急测试
- 用户培训和文档
6.2 电锁安装要点
- 测量确认:确认门厚和原有锁孔尺寸
- 拆除旧锁:完整拆除原有机械锁
- 安装新锁:放入1073锁体,固定螺丝
- 调整对位:精确调整锁扣板位置
- 功能测试:测试钥匙、旋钮、电子控制
6.3 控制器安装位置
- 室内侧:避免户外环境干扰
- 通风干燥:防止潮湿影响
- 隐蔽安全:防止人为破坏
- 信号良好:确保Wi-Fi连接稳定
七、运维与维护
7.1 日常监控
- MQTT服务器状态:定期检查服务运行
- 设备连接状态:通过心跳包监控
- 电源状态:监控电压电流是否正常
- 网络状态:确保Wi-Fi连接稳定
7.2 定期维护
- 每月:检查接线是否松动
- 每季度:清洁锁体和润滑锁舌
- 每半年:更新ESP32固件(如有改进)
- 每年:全面检查和压力测试
7.3 故障处理流程
1. 门无响应
→ 检查电源是否正常
→ 测试继电器是否动作
→ 使用机械钥匙应急
2. Wi-Fi连接失败
→ 检查路由器状态
→ 重启ESP32-C3
→ 使用蓝牙备用控制
3. MQTT通信异常
→ 检查旧电脑MQTT服务
→ 检查网络连接
→ 重启相关服务
八、扩展功能(可选)
8.1 门状态监控
cpp
// 添加门磁传感器
const int DOOR_SENSOR_PIN = 3;
void checkDoorStatus() {
bool isOpen = digitalRead(DOOR_SENSOR_PIN) == LOW;
static bool lastState = false;
if(isOpen != lastState) {
String event = isOpen ? "door_opened" : "door_closed";
client.publish(status_topic, event.c_str());
lastState = isOpen;
}
}
8.2 本地日志记录
cpp
// 使用SPIFFS记录开门事件
#include <SPIFFS.h>
void logEvent(String event) {
File file = SPIFFS.open("/events.log", FILE_APPEND);
if(file) {
file.println(String(millis()) + "," + event);
file.close();
}
}
8.3 多用户权限
cpp
// 简单的权限验证
bool checkPermission(String user, int door) {
// 定义权限矩阵
bool permissions[3][3] = {
{true, true, true}, // 管理员:所有门
{true, true, false}, // 员工:前两个门
{false, false, true} // 访客:第三个门
};
return permissions[user][door];
}
九、方案优势总结
9.1 技术优势
- 完全自主:无云依赖,数据本地存储
- 开源透明:代码可审查,无后门风险
- 协议标准:MQTT为物联网标准协议
- 生态丰富:ESP32有庞大社区支持
9.2 成本优势
- 硬件成本极低:远低于商业门禁系统
- 无软件费用:全部开源,无授权费用
- 无月租费用:无云服务订阅费用
- 维护成本低:模块化设计,易于维修
9.3 安全优势
- 断电安全:停电时自动锁闭
- 机械备份:钥匙和旋钮双重保障
- 网络隔离:内网运行,不外露
- 访问控制:可实施精细权限管理
十、注意事项
10.1 关键确认事项
- 电锁类型:必须确认是"断电闭锁型"
- 电源功率:计算总功率需求并留有余量
- 网络规划:确保Wi-Fi覆盖所有门位置
- 安装位置:避免潮湿和高温环境
10.2 应急准备
- 备用钥匙:准备至少两套完整钥匙
- 技术文档:保存接线图和配置信息
- 备用零件:准备常见易损件备用
- 应急流程:制定明确的故障处理流程
10.3 用户培训重点
- 正常操作:手机APP开门流程
- 异常处理:Wi-Fi故障时蓝牙使用方法
- 应急操作:停电时钥匙使用方法
- 安全须知:钥匙保管和权限管理
最终建议
本方案针对3个门的小规模部署优化,具有以下特点:
适合场景:
- 办公室、仓库、小型商铺
- 家庭别墅、工作室
- 需要低成本自主可控的场合
不推荐场景:
- 超大规模部署(>20门)
- 严格消防认证要求的公共场所
- 无基本技术维护能力的用户
核心价值:
- 以极低成本获得专业级门禁功能
- 完全掌握控制权和数据所有权
- 灵活的扩展和定制能力
- 可靠的断电安全和机械备份
成功关键:
- 正确选购断电闭锁型电控锁
- 确保网络稳定和覆盖
- 做好应急备份和用户培训
- 定期维护和监控系统状态