STM32F103C8T6+BC26模组实战:5步搞定智能井盖数据上云(华为云IoTDA)

在智慧城市建设的浪潮中,基础设施的数字化改造成为关键突破口。传统井盖管理依赖人工巡检,不仅效率低下,还存在安全隐患。本文将展示如何用STM32F103C8T6最小系统和BC26模组构建一个极简的物联网终端,通过华为云IoTDA平台实现井盖状态监测的快速验证方案。

1. 硬件准备与环境搭建

核心器件选型依据

  • STM32F103C8T6:Cortex-M3内核,72MHz主频,64KB Flash,20KB RAM,满足基础控制需求
  • BC26模组:支持NB-IoT低功耗广域网,内置TCP/IP协议栈,简化网络通信开发
  • 模拟传感器:采用GPIO模拟开关信号替代实际传感器,降低初期验证复杂度

硬件连接示意图

STM32F103C8T6  <-->  BC26
PA9(TX)        <-->  RX
PA10(RX)       <-->  TX
3.3V           <-->  VCC
GND            <-->  GND

开发环境配置

  1. 安装Keil MDK-ARM开发环境
  2. 配置STM32CubeMX生成基础工程
  3. 添加BC26驱动库(需支持AT指令解析)
  4. 准备USB-TTL工具用于调试输出

注意:BC26模组首次使用时需通过AT+CFUN=1激活全功能模式,部分版本默认处于PSM节能状态

2. 华为云IoTDA平台配置

2.1 创建产品与设备

登录华为云控制台,按以下流程操作:

  1. 进入IoTDA服务 → 设备接入 → 创建产品

    • 产品名称:SmartManholeCover
    • 协议类型:MQTT
    • 数据格式:JSON
  2. 定义物模型:

{
  "properties": [
    {
      "name": "cover_status",
      "data_type": "string",
      "required": true,
      "enum": ["open", "closed", "tilted"]
    },
    {
      "name": "battery_level",
      "data_type": "int",
      "min": 0,
      "max": 100
    }
  ]
}
  1. 注册设备:
    • 设备标识符:manhole_001
    • 密钥自动生成(需妥善保存)

2.2 获取MQTT连接参数

使用华为云提供的三元组生成工具生成连接信息:

  • ClientID: {device_id}
  • Username: {product_id}_{device_id}
  • Password: 使用密钥生成的加密字符串

连接参数示例

MQTT_BROKER = "121.36.42.100"  # 华北区域接入点
PORT = 1883
KEEPALIVE = 120  # 秒
TOPIC_PUB = "$oc/devices/{device_id}/sys/properties/report"

3. AT指令调试与网络连接

3.1 BC26基础AT指令集

AT+NRB          # 重启模组
AT+CFUN=1       # 启用全功能模式
AT+CGATT=1      # 附着网络
AT+CEREG?       # 检查网络注册状态(返回1表示已注册)
AT+CSQ          # 检查信号质量(RSSI值)

3.2 建立MQTT连接流程

STM32端需要实现的AT指令序列:

// 1. 创建TCP连接
sendATCommand("AT+QIOPEN=1,0,\"TCP\",\"121.36.42.100\",1883,0,1");

// 2. 配置MQTT参数
sendATCommand("AT+QMTCFG=\"recv/mode\",0,0,1");

// 3. 连接MQTT服务器
char mqtt_connect[128];
sprintf(mqtt_connect, "AT+QMTOPEN=0,\"%s\",%d", MQTT_BROKER, PORT);
sendATCommand(mqtt_connect);

// 4. 登录认证
char mqtt_login[256];
sprintf(mqtt_login, "AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"", 
        client_id, username, password);
sendATCommand(mqtt_login);

常见问题处理

  • 若返回+QMTCONN: 0,2表示认证失败,检查三元组生成是否正确
  • 网络延迟高时可调整心跳包间隔:AT+QMTCFG=\"keepalive\",0,120

4. 数据上报与业务逻辑实现

4.1 状态监测模拟代码

// 模拟井盖状态检测(实际项目替换为真实传感器读取)
uint8_t detect_cover_status() {
    if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {
        return 0; // 开盖状态
    } else if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_SET) {
        return 1; // 倾斜状态
    } else {
        return 2; // 正常闭合
    }
}

// 构造MQTT上报消息
void build_report_message(char *buffer, uint8_t status) {
    const char *status_str[] = {"open", "tilted", "closed"};
    snprintf(buffer, 256, 
             "{\"services\":[{\"service_id\":\"manhole\",\"properties\":{"
             "\"cover_status\":\"%s\",\"battery_level\":%d}}]}",
             status_str[status], get_battery_level());
}

4.2 数据上报AT指令示例

char mqtt_pub[512];
char message[256];
build_report_message(message, detect_cover_status());

sprintf(mqtt_pub, "AT+QMTPUB=0,0,0,0,\"%s\",%d", 
        TOPIC_PUB, strlen(message));
sendATCommand(mqtt_pub);
sendATCommand(message);  // 发送实际消息内容

优化建议

  • 添加消息重发机制(3次重试)
  • 实现QoS1等级保证(需平台支持)
  • 数据压缩:对固定格式消息可改用二进制协议

5. 低功耗设计与实战技巧

5.1 BC26 PSM模式配置

AT+CPSMS=1,,,"00100001","00000001"  # 启用PSM模式
AT+CEDRXS=1,5                       # 配置eDRX周期
AT+QSCLK=1                          # 启用睡眠模式

典型功耗对比

工作模式 电流消耗 唤醒延迟
常连接 12mA <1s
PSM模式 3μA 2-10s
eDRX模式 1.5mA 1-5s

5.2 STM32低功耗配合

void enter_low_power_mode() {
    // 1. 关闭外设时钟
    __HAL_RCC_GPIOA_CLK_DISABLE();
    __HAL_RCC_USART1_CLK_DISABLE();
    
    // 2. 配置唤醒源
    HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1);
    
    // 3. 进入STOP模式
    HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);
    
    // 4. 唤醒后恢复时钟
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
}

实测数据

  • 持续上报模式:平均电流8.2mA(5分钟间隔)
  • 深度睡眠模式:平均电流23μA(每小时唤醒上报)
  • 典型CR2032电池续航:从3个月提升至2年

在完成基础功能验证后,建议逐步替换模拟传感器为实际器件,并添加加速度计实现震动报警功能。华为云规则引擎可配置自动触发工单系统,实现从设备端到业务系统的完整闭环。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐