小型物联网系统——家居网关设计(C语言实现)

一、系统概述

家居网关是小型物联网系统的核心枢纽,负责多协议设备接入、数据汇聚转发、本地/远程控制 三大核心功能。本设计基于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云端通信、本地设备控制,具备低功耗、高可靠特点。通过模块化设计,可快速扩展设备类型与通信协议,适用于小型物联网系统(如智能家居、小型农业监测)。

相关推荐
tian_jiangnan2 小时前
工业物联网模块产品现场实操指南
物联网
北京耐用通信2 小时前
工业协议转换新选择:耐达讯自动化CC-Link I转EtherCAT网关深度解析
人工智能·科技·物联网·网络协议·自动化·信息与通信
daxi1503 小时前
C语言从入门到进阶——第17讲:字符串函数
c语言·开发语言·算法·蓝桥杯
zhaoshuzhaoshu3 小时前
HFP AT命令及其交互流程(包含AG与HF的场景流程)
物联网·蓝牙·无线
wljy13 小时前
第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(个人见解,已完结)
c语言·c++·算法·蓝桥杯
程序员zgh3 小时前
C++ 环形队列 从原理到实例演示
c语言·开发语言·数据结构·c++·学习
Yupureki3 小时前
《Linux系统编程》18.线程概念与控制
java·linux·服务器·c语言·jvm·c++
EasyControl移动设备管理3 小时前
打破系统壁垒:从 Android 到 macOS,打造全平台统一终端管理(MDM)方案
android·人工智能·物联网·macos·移动设备管理·mdm系统·跨区域设备
Zevalin爱灰灰3 小时前
零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(五)
单片机·物联网·mqtt·嵌入式·esp8266