当前位置: 首页 > news >正文

从零构建:基于STM32与4G Cat.1模块的MQTT温湿度数据上云实践

1. 项目背景与硬件选型

第一次接触物联网项目时,我被各种专业术语和复杂的协议搞得晕头转向。直到真正动手做了一个温湿度监测项目,才发现从硬件到云端的完整链路并没有想象中那么难。这次我们就用最常见的STM32开发板和4G Cat.1模块,带大家走通数据上云的完整流程。

为什么选择4G Cat.1模块?实测下来,相比传统的2G模块,它的网络覆盖和稳定性更好;相比Cat.4模块,功耗和成本又低不少,特别适合这种低频次、小数据量的物联网场景。我用的是移远EC200S,市面上类似的还有中移物联ML302,价格都在百元以内,性价比很高。

STM32的选择就更加灵活了,F103系列完全够用。我手头正好有块STM32F103C8T6最小系统板,内存64KB,Flash 128KB,跑MQTT客户端绰绰有余。温湿度传感器选了经典的DHT11,虽然精度一般(湿度±5%,温度±2℃),但胜在便宜好用,5块钱就能买到。

2. 硬件连接与初始化

拿到硬件后,先要搞定物理连接。这里有个坑要注意:4G模块的供电需求比较高,峰值电流可能达到2A,直接接开发板的3.3V输出肯定会出问题。我的解决方案是用一个AMS1117-3.3稳压芯片单独给模块供电,输入接5V电源,这样最稳。

具体接线如下:

  • EC200S的VCC接AMS1117输出
  • GND与STM32共地
  • TXD接STM32的PA3(USART2_RX)
  • RXD接PA2(USART2_TX)
  • DHT11的数据线接PA1

上电后模块的NET灯会开始闪烁,等变成常亮就说明注册到4G网络了。如果一直闪烁,可能是SIM卡没插好或者APN设置有问题。我用的是移动物联网卡,APN要设成"CMIOT",不同运营商可能不一样。

初始化代码很简单:

void USART2_Init(void) { // 波特率115200,8位数据,无校验,1位停止位 huart2.Instance = USART2; huart2.Init.BaudRate = 115200; huart2.Init.WordLength = UART_WORDLENGTH_8B; huart2.Init.StopBits = UART_STOPBITS_1; huart2.Init.Parity = UART_PARITY_NONE; HAL_UART_Init(&huart2); }

3. MQTT协议栈实现

虽然EC200S自带MQTT AT指令集,但就像原始文章提到的,为了更好的可移植性,我们选择在MCU端实现MQTT协议。这里我用的是开源的Paho MQTT嵌入式客户端,经过裁剪后不到10KB,非常适合资源受限的MCU。

关键是要实现以下几个功能:

  1. 连接建立:发送CONNECT报文,包含ClientID、用户名和密码
  2. 心跳维持:定时发送PINGREQ
  3. 主题订阅:SUBSCRIBE报文
  4. 消息发布:PUBLISH报文

OneNET的鉴权比较特殊,用户名是产品ID,密码要用Token算法生成。我封装了一个函数来处理:

void generate_onenet_token(char* buffer, const char* product_id, const char* device_name, const char* access_key) { // 计算过期时间(当前时间+1小时) uint32_t expiry = HAL_GetTick()/1000 + 3600; // 构造待签名字符串 char temp[256]; sprintf(temp, "products/%s/devices/%s", product_id, device_name); // HMAC-SHA1加密 uint8_t digest[20]; hmac_sha1((uint8_t*)temp, strlen(temp), (uint8_t*)access_key, strlen(access_key), digest); // Base64编码 base64_encode(digest, 20, buffer); }

4. OneNET平台配置

很多新手卡在平台配置这一步,其实按照流程走并不复杂。首先在OneNET官网注册账号,进入"多协议接入"选择MQTT,创建一个新产品。关键参数这样填:

  • 协议类型:MQTT
  • 联网方式:蜂窝
  • 运营商:根据SIM卡选择
  • 数据格式:JSON

创建完产品后添加设备,记下这三个关键信息:

  1. 产品ID:在产品详情页查看
  2. 设备名称:创建时自己定义
  3. API Key:在设备详情页的"密钥管理"中

平台端的Topic有固定格式:

  • 发布主题:$sys/{产品ID}/{设备名称}/dp/post/json
  • 订阅主题:$sys/{产品ID}/{设备名称}/cmd/request/+

5. 数据上传与调试

一切就绪后,就可以上传温湿度数据了。我定义了一个简单的JSON格式:

{ "id": 123, "dp": { "temperature": [{"v": 25.5}], "humidity": [{"v": 60.2}] } }

对应的C代码实现:

void publish_sensor_data(float temp, float humi) { char payload[128]; sprintf(payload, "{\"id\":%d,\"dp\":{\"temperature\":[{\"v\":%.1f}],\"humidity\":[{\"v\":%.1f}]}}", device_id, temp, humi); mqtt_publish("$sys/123456/my_device/dp/post/json", payload, strlen(payload), QOS0); }

调试时最容易遇到三个问题:

  1. 数据格式不对:一定要严格按平台要求的JSON格式
  2. Token过期:生成的Token默认1小时有效,需要定期刷新
  3. 网络抖动:建议加入重连机制,当PING超时后重新建立连接

6. 数据可视化与应用

数据上传成功后,在OneNET的"设备管理"页面能看到设备状态变成在线。进入"数据流"标签页,可以创建可视化图表。比如我添加了两个数据流:

  • 温度:单位℃, 范围-20~50
  • 湿度:单位%, 范围0~100

平台支持设置告警规则,比如当温度超过30℃时发送邮件通知。更高级的应用可以通过HTTP API获取数据,接入自己的Web应用或小程序。我在一个农业大棚项目中就用这种方式实现了远程监控,效果很稳定。

7. 优化与扩展

实际部署时还需要考虑几个优化点:

  1. 低功耗设计:采用定时唤醒策略,比如每5分钟采集一次数据
  2. 数据缓存:网络不可用时先存到Flash,恢复后补传
  3. 固件升级:通过OneNET的OTA服务远程更新程序

如果想扩展更多功能,可以考虑:

  • 加入GPS模块实现定位
  • 对接第三方通知服务(如短信、微信推送)
  • 使用规则引擎实现简单的自动控制

这个项目的完整代码我已经放在GitHub上,包含STM32工程文件和手机端Demo APP。遇到问题可以查看Wiki页面的常见问题解答,或者提交Issue讨论。

http://www.jsqmd.com/news/656422/

相关文章:

  • 企业级冗余网络搭建:用华为ENSP玩转Monitor Link+Smart Link双保险方案
  • 从“代码补全”到“任务委派”:我在Qoder Quest Mode里,让AI独立搞定了一个微服务模块
  • 终极画中画扩展:Chrome多任务观影完整指南
  • Linuxmint 桌面美学:从零打造个性化工作空间
  • H200 安装驱动并使用sglang启动模型
  • 县城瓷砖开店加盟实战指南:2026年县域建材市场下沉战略与轻资产盈利模型解析 - 速递信息
  • 牙槽骨差也能装!上海夕阳红吸附性义齿,老人吃饭不松动、不压痛! - GrowthUME
  • 手把手教你配置Simulink和PSpice的数据交换:从SLPS块到仿真结果查看
  • 题解:洛谷 P2812 校园网络【[USACO]Network of Schools加强版】
  • CH343的4Mbps高速串口怎么用?实测与CH340、CP2102的波特率与稳定性对比
  • 题解:洛谷 AT_abc415_a [ABC415A] Unsupported Type
  • AI代码迁移生死线:2026奇点大会技术委员会紧急预警(92.7%企业因忽略这4个语义锚点导致LLM生成代码崩溃)
  • AI发展
  • 2026年当下,九江市中央采暖服务机构深度测评与选型指南 - 2026年企业推荐榜
  • 众智商学院是什么?专注采购供应链培训10年 - 众智商学院官方
  • 告别手动输入!用UniApp监听PDA扫码广播,实现东大PDA自动填充输入框
  • 律所行业自动化平台选型,合同审核与案件管理优化 | 2026年法律科技Agent化演进与企业级智能体实测横评
  • Python实现GPR信号时间增益补偿(TGC)的实战指南
  • 从零搭建UVM验证平台:核心组件与通信机制全解析
  • 从‘成绩评级’到‘订单状态机’:用C# switch case玩转真实业务逻辑(附Razor页面示例)
  • Camera Shakify:三分钟为Blender动画添加电影级相机抖动效果
  • QChart交互实战:从零封装支持框选、滚轮、右键拖拽与数据感知的通用视图控件
  • 题解:洛谷 AT_abc415_b [ABC415B] Pick Two
  • wireshark 抓包Trap上报告警内容
  • U8g2库支持的屏幕类型总表以及构造器选择
  • 告别拖延!天津超级学长,学管每日打卡的雅思提分利器 - 大喷菇123
  • VCS仿真中xprop配置全解析:从基础语法到实战避坑指南
  • 如何零成本部署专业级医学影像系统:Weasis开源DICOM查看器的完整实战指南
  • 从零到一:PID调参实战指南与避坑手册
  • 合肥本土心理咨询师榜单,懂你困扰更专业 - 野榜数据排行