4G与Lora结合的远程光照监测系统设计与优化

4G与Lora结合的远程光照监测系统设计与优化

1. 项目背景与核心价值

这个4G_Lora远程光照监测器项目最近在物联网开发者圈子里挺火的,我花了两个周末时间完整复现了整套系统。最让我惊喜的是它完美结合了Lora的低功耗广域网优势和4G的稳定云连接能力,特别适合那些需要长期户外部署的环境监测场景。

光照监测听起来简单,但要做好远程传输和云端存储可不容易。传统方案要么用WiFi覆盖范围有限,要么直接用4G模块功耗太高。这个项目用Lora采集传感器数据,再通过4G网关上传云端,既解决了传输距离问题,又降低了整体功耗,实测下来单个传感器节点可以持续工作6-8个月不用换电池。

2. 硬件选型与组网架构

2.1 核心硬件清单

我用的硬件配置和原项目基本一致:

  • 主控芯片:STM32L072(超低功耗Cortex-M0+)
  • 光照传感器:BH1750(I2C接口,0-65535 lux量程)
  • Lora模块:SX1278(868MHz频段,20dBm发射功率)
  • 4G模块:移远EC20(支持TCP/IP协议栈)
  • 电源管理:TPS62740降压芯片(静态电流仅360nA)

特别提醒:选4G模块时要确认当地运营商频段支持,我最初用的EC20-CE版本在国内联通卡上就遇到频段不匹配问题。

2.2 网络拓扑设计

整个系统采用星型组网结构:

[光照传感器节点] --Lora--> [4G网关] --TCP--> [云服务器]

每个传感器节点定时唤醒(我设置的是5分钟间隔),通过Lora将数据发往网关。网关收到数据后立即通过4G网络建立TCP连接上传云端。这种设计有三个明显优势:

  1. 传感器节点绝大部分时间处于睡眠状态,实测平均电流仅8μA
  2. 网关可以同时接收多个节点数据,批量上传减少4G连接次数
  3. TCP协议保证数据传输可靠性,避免UDP可能出现的丢包问题

3. 4G模块TCP连接实战

3.1 AT指令配置流程

EC20模块的TCP连接需要分步骤配置,这是我整理的完整AT指令序列:

AT+QICSGP=1,1,"CMNET","","",1 // 设置APN AT+QIACT=1 // 激活PDP上下文 AT+QIOPEN=1,0,"TCP","183.230.40.40",1811,0,1 // 建立TCP连接 AT+QISEND=0 // 进入发送模式 > 开始发送HEX格式数据...

关键点说明:

  • 第3条指令中的IP和端口要替换成自己的云服务器地址
  • 发送数据前务必等待"+QIOPEN: 0,0"返回码
  • 数据发送超时建议设为15秒(AT+QISCFG="recvtimeout",15)

3.2 数据包格式设计

为了节省流量,我设计了紧凑的二进制协议格式:

| 头标识(0xAA55) | 节点ID(2B) | 光照值(2B) | 电压(2B) | CRC16(2B) |

一个完整的数据包只有10字节,相比JSON格式节省了60%以上的流量。云端解析时要注意字节序处理,STM32是小端模式。

3.3 心跳机制实现

保持TCP长连接需要定时发送心跳包,我的实现方案:

void send_heartbeat(void) { static uint32_t last_send = 0; if(HAL_GetTick() - last_send > 300000) { // 5分钟一次 at_send("AT+QISEND=0,2,\"AA55FFFF\"\r\n"); last_send = HAL_GetTick(); } }

踩坑记录:初期没用心跳机制,发现NAT超时(通常5分钟)会导致连接中断,改为定时发送2字节空包后问题解决。

4. 云端服务搭建要点

4.1 腾讯云轻量服务器配置

我用的是腾讯云Ubuntu 20.04 LST实例,关键配置步骤:

  1. 安全组开放1811端口(TCP)
  2. 安装mosquitto作为MQTT中转:
    sudo apt install mosquitto mosquitto-clients sudo systemctl enable mosquitto
  3. 用Python编写TCP服务端:
    import socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('0.0.0.0', 1811)) server.listen(5) while True: conn, addr = server.accept() data = conn.recv(1024) # 解析数据并存入MySQL...

4.2 数据存储方案对比

我测试了三种存储方案的效果:

方案写入速度查询性能存储成本适合场景
MySQL1200条/秒需要复杂查询
InfluxDB8000条/秒时间序列数据
SQLite400条/秒低功耗设备

最终选择InfluxDB+MySQL组合方案:实时数据存InfluxDB方便生成图表,关键指标同步到MySQL做业务分析。

5. 功耗优化实战技巧

5.1 4G模块省电配置

通过AT指令优化EC20功耗:

AT+QSCLK=1 // 启用睡眠模式 AT+QCFG="urc/ri","none" // 关闭指示灯 AT+QCFG="band",0,0,1,1 // 锁定常用频段

实测可使4G模块待机电流从12mA降至3.8mA。

5.2 传感器采样策略

优化后的采样流程:

  1. 每次唤醒先采集3次光照值(间隔100ms)
  2. 取中位数作为有效值
  3. 如果光照变化<5%则延长下次采样间隔
  4. 电压低于3.3V时触发低电量预警

5.3 实际续航测试

不同配置下的续航对比:

采样间隔发射功率平均电流理论续航
1分钟20dBm1.2mA45天
5分钟14dBm0.3mA180天
10分钟10dBm0.15mA1年+

建议根据实际需求调整,我的农场监测项目选的5分钟间隔方案。

6. 常见问题排查指南

6.1 TCP连接失败排查

  1. 现象:AT+QIOPEN返回ERROR

    • 检查SIM卡状态(AT+CPIN?)
    • 确认APN配置正确(AT+QICSGP?)
    • 测试基站信号(AT+CSQ,大于10才稳定)
  2. 现象:服务器收不到数据

    • 用tcpdump抓包确认数据到达服务器
    sudo tcpdump -i eth0 port 1811 -vv
    • 检查防火墙设置(sudo ufw status)

6.2 Lora通信异常处理

  1. 通信距离突然变短

    • 检查天线阻抗匹配(理想50Ω)
    • 用频谱仪查看信道干扰
    • 确认收发双方SF/BW参数一致
  2. 数据包CRC校验失败

    • 降低传输速率(我最终用SF10, BW125)
    • 添加前导码(AT+PARAM=12,8,1,4)
    • 启用显式报头模式(AT+MODE=2)

7. 项目扩展方向

这套框架其实不仅能测光照,我最近正在做这些扩展:

  1. 温湿度传感器节点(SHT30)
  2. 土壤墒情监测版本(增加ADC接口)
  3. 太阳能供电改造(TP4056充电管理)
  4. 微信报警功能(通过Server酱API)

有个特别实用的改进是在网关添加本地缓存,当4G信号不好时先用SPI Flash暂存数据,等信号恢复后断点续传。我用W25Q128实现了最多存储7天的数据。