一、系统概述
家居网关是小型物联网系统的核心枢纽,负责多协议设备接入、数据汇聚转发、本地/远程控制 三大核心功能。本设计基于STM32F103C8T6 主控,集成Zigbee(传感器接入)、Wi-Fi(云端通信)、GPIO(本地控制)模块,通过C语言实现轻量化协议栈与业务逻辑,支持温湿度监测、灯光控制、门窗状态采集 等典型家居场景,具备低功耗(<1W)、高可靠(断网续传)、易扩展特点。
二、系统架构与硬件设计
1. 系统架构
Zigbee
UART
GPIO
Wi-Fi
SPI
HTTP/MQTT
MQTT
传感器节点
Zigbee协调器
STM32主控
执行器灯光/空调
MQTT云端
Flash存储
手机APP/Web
- 接入层:Zigbee协调器(CC2530)连接传感器(温湿度、门窗磁),Wi-Fi模块(ESP8266)连接云端。
- 控制层:STM32主控处理数据、执行逻辑、管理设备。
- 应用层:手机APP/Web通过云端(MQTT Broker)与网关交互。
2. 硬件清单
| 模块 | 型号/参数 | 功能 |
|---|---|---|
| 主控 | STM32F103C8T6(72MHz,64KB Flash) | 系统控制、协议处理、逻辑运算 |
| Zigbee协调器 | CC2530(2.4GHz,Z-Stack协议栈) | 接收传感器数据,UART透传至主控 |
| Wi-Fi模块 | ESP8266-12F(802.11b/g/n) | MQTT通信、远程控制 |
| 存储模块 | W25Q16JV(2MB SPI Flash) | 设备配置、断网数据缓存 |
| 电源模块 | AMS1117-3.3V(输入5V USB) | 系统供电(3.3V/500mA) |
| 接口 | UART×2(Zigbee/Wi-Fi)、SPI×1、GPIO×8 | 外设通信、执行器控制 |
三、软件设计(C语言实现)
1. 核心模块划分
| 模块 | 功能 | 关键函数/数据结构 |
|---|---|---|
| 系统初始化 | 时钟、外设、协议栈初始化 | System_Init()、Periph_Init() |
| Zigbee协议 | 数据接收、设备注册、状态解析 | Zigbee_Process_Data()、Device_Register() |
| Wi-Fi/MQTT | 云端连接、数据发布/订阅、断网缓存 | MQTT_Connect()、MQTT_Publish() |
| 设备管理 | 设备状态存储、控制命令转发 | Device_Manager()、Command_Execute() |
| 本地控制 | GPIO控制执行器(灯光、继电器) | GPIO_Control()、Relay_Switch() |
| 数据存储 | 配置/历史数据读写(SPI Flash) | Flash_Read()、Flash_Write() |
| 低功耗管理 | 空闲时休眠、定时唤醒 | Enter_Sleep_Mode()、Wakeup_Handler() |
2. 主程序流程
c
#include "stm32f10x.h"
#include "zigbee.h"
#include "mqtt.h"
#include "device_manager.h"
#include "flash.h"
#include "gpio_control.h"
// 系统状态
typedef struct {
uint8_t zigbee_connected; // Zigbee连接状态
uint8_t wifi_connected; // Wi-Fi连接状态
uint8_t mqtt_connected; // MQTT连接状态
Device devices[10]; // 设备列表(最大10个设备)
uint8_t device_count; // 设备数量
} SystemState;
int main(void) {
// 1. 系统初始化
System_Init(); // 时钟、GPIO、UART、SPI初始化
Zigbee_Init(); // Zigbee协调器初始化(UART1,115200bps)
WiFi_Init(); // ESP8266初始化(UART2,115200bps)
MQTT_Init(); // MQTT客户端初始化(连接阿里云IoT)
Flash_Init(); // SPI Flash初始化(读取配置)
DeviceManager_Init();// 设备列表初始化(从Flash加载)
SystemState sys_state = {0};
sys_state.device_count = 0;
// 2. 主循环
while (1) {
// 2.1 处理Zigbee数据(传感器上报)
if (Zigbee_Data_Ready()) {
ZigbeeFrame frame = Zigbee_Read_Frame();
Device* dev = Device_Find(frame.dev_id);
if (dev == NULL) {
// 新设备注册
dev = Device_Register(frame.dev_id, frame.type);
sys_state.device_count++;
}
// 更新设备状态(如温湿度、门窗状态)
Device_Update_State(dev, frame.data);
// 本地存储(断网时缓存)
Flash_Save_Device_State(dev);
}
// 2.2 处理MQTT数据(云端控制命令)
if (MQTT_Message_Ready()) {
MQTTMessage msg = MQTT_Read_Message();
Command cmd = Parse_Command(msg.payload); // 解析JSON命令
Device* dev = Device_Find(cmd.dev_id);
if (dev != NULL) {
// 执行控制(本地GPIO或转发Zigbee)
if (dev->type == DEVICE_LIGHT) {
GPIO_Control(dev->gpio_pin, cmd.value); // 直接控制灯光
} else {
Zigbee_Send_Command(dev->dev_id, cmd); // 转发Zigbee命令
}
// 更新设备状态并同步云端
Device_Update_State(dev, cmd.value);
MQTT_Publish_Device_State(dev);
}
}
// 2.3 低功耗管理(空闲时休眠)
if (sys_state.zigbee_connected && sys_state.mqtt_connected) {
Enter_Sleep_Mode(1000); // 休眠1秒(低功耗模式)
} else {
HAL_Delay(100); // 异常时频繁检测
}
}
}
3. 关键模块实现
(1)Zigbee数据解析(传感器接入)
c
// Zigbee数据帧格式:设备ID(2B) + 类型(1B) + 数据(nB) + CRC(1B)
typedef struct {
uint16_t dev_id; // 设备ID(唯一标识)
uint8_t type; // 设备类型(0x01:温湿度, 0x02:门窗磁)
uint8_t data[8]; // 数据(温湿度:2B温度+2B湿度;门窗:1B状态)
uint8_t crc; // 校验和
} ZigbeeFrame;
// 处理Zigbee数据
void Zigbee_Process_Data(uint8_t* buf, uint16_t len) {
if (len < 5) return; // 最小帧长度:2+1+1+1=5B
ZigbeeFrame frame;
frame.dev_id = (buf[0] << 8) | buf[1];
frame.type = buf[2];
memcpy(frame.data, &buf[3], len-4);
frame.crc = buf[len-1];
// CRC校验(简化:求和取低8位)
uint8_t crc = 0;
for (int i=0; i<len-1; i++) crc += buf[i];
if (crc != frame.crc) return; // 校验失败丢弃
// 解析数据(示例:温湿度)
if (frame.type == 0x01) {
float temp = (frame.data[0] << 8 | frame.data[1]) / 10.0; // 温度×10
float humi = (frame.data[2] << 8 | frame.data[3]) / 10.0; // 湿度×10
// 更新设备状态(后续处理)
}
}
(2)MQTT通信(云端交互)
c
// MQTT连接配置(阿里云IoT示例)
#define MQTT_BROKER "iot-xxx.mqtt.iothub.aliyuncs.com"
#define MQTT_PORT 1883
#define CLIENT_ID "gateway_001"
#define USERNAME "device_001&xxx" // 设备三元组
#define PASSWORD "xxxx" // 签名
// MQTT消息发布(设备状态)
void MQTT_Publish_Device_State(Device* dev) {
char topic[50], payload[100];
sprintf(topic, "/sys/%s/%s/thing/event/property/post", PRODUCT_KEY, DEVICE_NAME);
sprintf(payload, "{\"id\":\"123\",\"params\":{\"temp\":%.1f,\"humi\":%.1f},\"method\":\"thing.event.property.post\"}",
dev->temp, dev->humi);
MQTT_Publish(topic, payload); // 发布JSON格式数据
}
// MQTT消息订阅回调(控制命令)
void MQTT_Subscribe_Callback(char* topic, char* payload) {
if (strstr(topic, "control")) {
Command cmd = Parse_JSON_Payload(payload); // 解析JSON命令
Command_Queue_Push(cmd); // 入队待处理
}
}
(3)设备管理与控制
c
// 设备类型定义
typedef enum {
DEVICE_TEMP_HUMI, // 温湿度传感器
DEVICE_DOOR_WINDOW,// 门窗磁传感器
DEVICE_LIGHT, // 灯光执行器
DEVICE_AC // 空调执行器
} DeviceType;
// 设备结构体
typedef struct {
uint16_t dev_id; // 设备ID
DeviceType type; // 设备类型
float temp; // 温度(传感器)
float humi; // 湿度(传感器)
uint8_t state; // 状态(0:关, 1:开,执行器)
uint8_t gpio_pin; // 控制引脚(执行器)
} Device;
// 设备注册(新设备加入时)
Device* Device_Register(uint16_t dev_id, DeviceType type) {
static Device devices[10];
if (sys_state.device_count >= 10) return NULL; // 设备数上限
Device* dev = &devices[sys_state.device_count];
dev->dev_id = dev_id;
dev->type = type;
dev->state = 0;
// 分配GPIO(灯光:PA0, PA1; 空调:PA2, PA3)
if (type == DEVICE_LIGHT) dev->gpio_pin = GPIO_PIN_0;
else if (type == DEVICE_AC) dev->gpio_pin = GPIO_PIN_2;
sys_state.device_count++;
return dev;
}
// 执行控制命令
void Command_Execute(Command cmd) {
Device* dev = Device_Find(cmd.dev_id);
if (dev == NULL) return;
dev->state = cmd.value; // 更新状态
if (dev->type == DEVICE_LIGHT) {
HAL_GPIO_WritePin(GPIOA, dev->gpio_pin, cmd.value ? GPIO_PIN_SET : GPIO_PIN_RESET);
} else if (dev->type == DEVICE_AC) {
// 空调控制(通过Zigbee转发,略)
}
}
(4)低功耗管理
c
// 进入休眠模式(STM32 STOP模式)
void Enter_Sleep_Mode(uint32_t ms) {
HAL_SuspendTick(); // 暂停系统滴答定时器
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 进入STOP模式
SystemClock_Config(); // 唤醒后恢复时钟
HAL_ResumeTick();
HAL_Delay(ms); // 补偿休眠时间
}
参考代码 小型物联网系统------家居网关设计 www.youwenfan.com/contentcss/160801.html
四、系统测试与优化
1. 功能测试
| 测试项 | 方法 | 预期结果 |
|---|---|---|
| Zigbee接入 | 接入温湿度传感器,发送数据 | 网关正确解析并显示温湿度值 |
| 云端通信 | 手机APP发送灯光控制命令 | 灯光按命令开关,云端状态同步更新 |
| 断网续传 | 断开Wi-Fi,发送传感器数据 | 数据缓存至Flash,联网后自动上传 |
| 低功耗 | 空闲时测量电流 | 工作电流<50mA,休眠电流<10mA |
2. 优化方向
-
协议优化:Zigbee数据压缩(如用二进制代替ASCII),减少传输量。
-
安全增强:增加设备认证(Zigbee入网PIN码)、MQTT over TLS加密。
-
功能扩展:支持更多设备类型(如烟雾传感器、智能插座),增加本地规则引擎(如"温度>30℃自动开空调")。
五、总结
本设计基于STM32与C语言,实现了一个轻量化家居网关,支持Zigbee传感器接入、MQTT云端通信、本地设备控制,具备低功耗、高可靠特点。通过模块化设计,可快速扩展设备类型与通信协议,适用于小型物联网系统(如智能家居、小型农业监测)。