以下是一个完整的 Laravel 12 + STM32 远程开关控制系统 实现方案,涵盖 Web 后端、前端、硬件固件、通信协议、安全机制和部署方案。
1. 系统架构
1.1 整体架构
用户Web/App → Laravel API → MQTT Broker → STM32 → 继电器控制
- 前端:Vue.js / React 管理界面(可扩展移动端)
- 后端:Laravel 12(RESTful API + WebSocket 实时通信)
- 通信协议:MQTT(轻量级物联网协议)
- 硬件:
- STM32F103/STM32F407(带 FreeRTOS)
- ESP8266/ESP32(WiFi 模块)
- 继电器模块(控制开关)
2. Laravel 后端实现
2.1 数据库迁移(关键表)
php artisan make:migration create_devices_table
// database/migrations/2025_05_16_create_devices_table.php
Schema::create('devices', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('mac_address')->unique(); // STM32设备唯一标识
$table->enum('status', ['ON', 'OFF'])->default('OFF');
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->timestamps();
});
php artisan migrate
2.2 API 路由
// routes/api.php
use App\Http\Controllers\DeviceController;
Route::middleware('auth:sanctum')->group(function () {
Route::get('/devices', [DeviceController::class, 'index']);
Route::post('/devices/{device}/control', [DeviceController::class, 'control']);
});
2.3 设备控制逻辑
// app/Http/Controllers/DeviceController.php
public function control(Device $device, Request $request)
{
$request->validate(['command' => 'required|in:ON,OFF']);
// 发布MQTT消息
MQTT::publish("devices/{$device->mac_address}/control", $request->command);
// 更新数据库状态
$device->update(['status' => $request->command]);
return response()->json(['status' => 'success']);
}
2.4 MQTT 集成
composer require php-mqtt/laravel-client
// config/mqtt.php
return [
'host' => env('MQTT_HOST', 'mqtt.example.com'),
'port' => env('MQTT_PORT', 1883),
'username' => env('MQTT_USERNAME'),
'password' => env('MQTT_PASSWORD'),
];
3. STM32 固件开发
3.1 硬件连接
- STM32 ↔ ESP8266(UART 通信)
- STM32 → 继电器模块(GPIO 控制)
3.2 FreeRTOS + MQTT 实现
// main.c
#include "stm32f4xx_hal.h"
#include "esp8266.h"
#include "mqtt.h"
void MQTT_Callback(char* topic, uint8_t* payload) {
if (strstr(topic, "control")) {
if (strcmp(payload, "ON") == 0) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // 继电器开
} else {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 继电器关
}
}
}
int main(void) {
HAL_Init();
SystemClock_Config();
ESP8266_Init(); // 初始化WiFi
ESP8266_Connect("WIFI_SSID", "WIFI_PASSWORD");
MQTT_Connect("mqtt.example.com", 1883, "client-id", "username", "password");
MQTT_Subscribe("devices/+/control");
while (1) {
MQTT_Loop(); // 保持MQTT连接
HAL_Delay(100);
}
}
4. 前端实现(Vue.js)
<template>
<div>
<h1>设备控制</h1>
<button @click="sendCommand('ON')">开启</button>
<button @click="sendCommand('OFF')">关闭</button>
</div>
</template>
<script>
export default {
data() {
return {
deviceId: 1,
};
},
methods: {
async sendCommand(command) {
await axios.post(`/api/devices/${this.deviceId}/control`, { command });
},
},
};
</script>
5. 安全机制
- API 认证(Laravel Sanctum)
- MQTT TLS 加密
- 设备唯一标识(MAC 地址绑定)
- 操作日志记录
- STM32 固件签名(防止篡改)
6. 部署方案
组件 | 推荐方案 |
---|---|
Laravel | Nginx + PHP 8.2 + MySQL |
MQTT | Mosquitto(Docker 部署) |
STM32 | 烧录固件 + 继电器模块 |
前端 | Vercel / Netlify 托管 |
7. 测试流程
- 硬件测试:STM32 + ESP8266 连接测试
- MQTT 测试:
mosquitto_pub/sub
手动测试 - API 测试:Postman 模拟请求
- 前端测试:Vue.js 控制界面验证
8. 扩展功能
- 定时任务(Laravel Scheduler 控制设备)
- WebSocket 实时状态(Laravel Echo + Pusher)
- OTA 固件升级(STM32 远程更新)
最终效果
✅ 用户通过 Web/App 控制 STM32 继电器
✅ 实时状态同步到数据库
✅ 安全认证 + 日志记录
✅ 可扩展至多设备管理
这个方案完整覆盖了 Laravel + STM32 物联网远程控制 的所有关键环节,可直接用于实际项目开发。 🚀