以下是基于 Laravel 12 和 STM32 的智能门锁 完整实现方案,涵盖 后端 API、硬件控制、安全认证、物联网通信 等核心模块,并提供 关键代码示例 和 系统架构设计。
1. 系统架构
1.1 整体架构
[Web/App] ←HTTPS→ [Laravel 12 API] ←MQTT→ [STM32] → [门锁硬件]
↑ ↑
(JWT Auth) (MySQL/Redis)
- 前端:Vue.js / React Native(移动端)
- 后端:Laravel 12(REST API + MQTT Broker)
- 硬件:STM32F4 + ESP8266(WiFi) / SIM800L(4G)
- 通信协议:
- HTTPS(Web/App ↔ Laravel)
- MQTT(Laravel ↔ STM32)
- UART(STM32 ↔ 指纹模块/NFC/继电器)
2. Laravel 12 后端实现
2.1 安装依赖
composer require laravel/sanctum # API 认证
composer require php-mqtt/client # MQTT 通信
npm install vue-websocket # 实时状态推送
2.2 数据库设计(MySQL)
Schema::create('access_logs', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->enum('method', ['app', 'fingerprint', 'nfc', 'rfid']);
$table->timestamp('access_time')->useCurrent();
});
Schema::create('fingerprints', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained();
$table->binary('template'); // 存储指纹特征模板
});
2.3 API 路由(routes/api.php
)
use App\Http\Controllers\LockController;
Route::middleware('auth:sanctum')->group(function () {
Route::post('/unlock', [LockController::class, 'unlock']); // 远程开锁
Route::get('/logs', [LockController::class, 'logs']); // 获取开锁记录
Route::post('/fingerprint', [LockController::class, 'addFingerprint']); // 录入指纹
});
2.4 控制器(LockController.php
)
public function unlock(Request $request)
{
$validated = $request->validate([
'method' => 'required|in:app,fingerprint,nfc',
]);
// 发布 MQTT 开锁指令
MQTT::publish('lock/command', json_encode([
'action' => 'unlock',
'duration' => 3000, // 开锁持续时间(ms)
'user_id' => $request->user()->id,
]));
// 记录开锁日志
AccessLog::create([
'user_id' => $request->user()->id,
'method' => $validated['method'],
]);
return response()->json(['status' => 'success']);
}
3. STM32 硬件端实现
3.1 硬件选型
模块 | 型号 | 功能 |
---|---|---|
主控 | STM32F407 | 控制逻辑 |
通信 | ESP8266 | WiFi + MQTT |
指纹 | AS608 | 指纹识别 |
锁体 | 5V继电器 | 控制电磁锁 |
NFC | PN532 | 刷卡开锁 |
3.2 FreeRTOS 任务设计
void LockControlTask(void *pvParameters) {
while (1) {
if (xQueueReceive(xCommandQueue, &cmd, portMAX_DELAY)) {
if (cmd.action == UNLOCK) {
HAL_GPIO_WritePin(GPIOA, RELAY_PIN, GPIO_PIN_SET);
osDelay(cmd.duration);
HAL_GPIO_WritePin(GPIOA, RELAY_PIN, GPIO_PIN_RESET);
}
}
}
}
void MQTT_Task(void *pvParameters) {
MQTTClient client;
MQTTClient_connect(&client, "mqtt://broker.example.com");
MQTTClient_subscribe(&client, "lock/command", MQTT_Callback);
}
void MQTT_Callback(char *topic, uint8_t *payload) {
Command_t cmd = parseCommand(payload);
xQueueSend(xCommandQueue, &cmd, 0);
}
3.3 指纹识别(AS608)
uint8_t enrollFingerprint(uint16_t id) {
uint8_t ret = PS_GetImage();
if (ret == 0x00) {
PS_GenChar(1); // 生成特征
PS_StoreChar(1, id); // 存储到指定 ID
}
return ret;
}
uint8_t verifyFingerprint() {
PS_GetImage();
PS_GenChar(2);
uint16_t matchID;
uint8_t ret = PS_Match(&matchID);
if (ret == 0x00) {
unlockDoor(2000); // 开锁 2s
}
return ret;
}
4. 前端(Vue.js 示例)
<template>
<button @click="unlock" :disabled="loading">远程开锁</button>
<div v-if="logs.length">
<h3>开锁记录</h3>
<ul>
<li v-for="log in logs" :key="log.id">
{{ log.user.name }} - {{ log.method }} - {{ log.access_time }}
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
loading: false,
logs: [],
};
},
methods: {
async unlock() {
this.loading = true;
await axios.post('/api/unlock', { method: 'app' });
this.loading = false;
},
async fetchLogs() {
const res = await axios.get('/api/logs');
this.logs = res.data;
},
},
mounted() {
this.fetchLogs();
},
};
</script>
5. 安全机制
- HTTPS + JWT(Laravel Sanctum 认证)
- MQTT TLS 加密(防止 MITM 攻击)
- STM32 端安全措施:
- 固件签名(防止篡改)
- 动态 Token 验证(每次开锁需服务器授权)
- 看门狗定时器(防死机)
6. 部署与测试
- Laravel 部署:
php artisan migrate php artisan serve
- STM32 烧录:
- 使用 STM32CubeIDE 编译 FreeRTOS 固件
- 通过 ST-Link 烧录
- MQTT Broker(Mosquitto):
mosquitto -c /etc/mosquitto/mosquitto.conf
7. 扩展功能
- 低功耗模式(STM32 进入 STOP 模式,WiFi 定时唤醒)
- 人脸识别(ESP32-CAM + OpenCV)
- 微信小程序控制(基于 WebSocket)
最终效果
- ✅ 手机 APP / Web 远程开锁
- ✅ 指纹 / NFC / 密码 多种认证方式
- ✅ 实时开锁日志记录
- ✅ 断电保护(超级电容备用电源)