基于 Laravel 12 和 STM32 的智能门锁 完整实现方案

#新星杯·14天创作挑战营·第11期#

以下是基于 Laravel 12STM32 的智能门锁 完整实现方案,涵盖 后端 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控制逻辑
通信ESP8266WiFi + MQTT
指纹AS608指纹识别
锁体5V继电器控制电磁锁
NFCPN532刷卡开锁

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. 安全机制

  1. HTTPS + JWT(Laravel Sanctum 认证)
  2. MQTT TLS 加密(防止 MITM 攻击)
  3. STM32 端安全措施
    • 固件签名(防止篡改)
    • 动态 Token 验证(每次开锁需服务器授权)
    • 看门狗定时器(防死机)

6. 部署与测试

  1. Laravel 部署
    php artisan migrate
    php artisan serve
    
  2. STM32 烧录
    • 使用 STM32CubeIDE 编译 FreeRTOS 固件
    • 通过 ST-Link 烧录
  3. MQTT Broker(Mosquitto):
    mosquitto -c /etc/mosquitto/mosquitto.conf
    

7. 扩展功能

  • 低功耗模式(STM32 进入 STOP 模式,WiFi 定时唤醒)
  • 人脸识别(ESP32-CAM + OpenCV)
  • 微信小程序控制(基于 WebSocket)

最终效果

  • 手机 APP / Web 远程开锁
  • 指纹 / NFC / 密码 多种认证方式
  • 实时开锁日志记录
  • 断电保护(超级电容备用电源)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值