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连接上传云端。这种设计有三个明显优势:
- 传感器节点绝大部分时间处于睡眠状态,实测平均电流仅8μA
- 网关可以同时接收多个节点数据,批量上传减少4G连接次数
- 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实例,关键配置步骤:
- 安全组开放1811端口(TCP)
- 安装mosquitto作为MQTT中转:
sudo apt install mosquitto mosquitto-clients sudo systemctl enable mosquitto - 用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 数据存储方案对比
我测试了三种存储方案的效果:
| 方案 | 写入速度 | 查询性能 | 存储成本 | 适合场景 |
|---|---|---|---|---|
| MySQL | 1200条/秒 | 优 | 中 | 需要复杂查询 |
| InfluxDB | 8000条/秒 | 良 | 低 | 时间序列数据 |
| SQLite | 400条/秒 | 差 | 零 | 低功耗设备 |
最终选择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 传感器采样策略
优化后的采样流程:
- 每次唤醒先采集3次光照值(间隔100ms)
- 取中位数作为有效值
- 如果光照变化<5%则延长下次采样间隔
- 电压低于3.3V时触发低电量预警
5.3 实际续航测试
不同配置下的续航对比:
| 采样间隔 | 发射功率 | 平均电流 | 理论续航 |
|---|---|---|---|
| 1分钟 | 20dBm | 1.2mA | 45天 |
| 5分钟 | 14dBm | 0.3mA | 180天 |
| 10分钟 | 10dBm | 0.15mA | 1年+ |
建议根据实际需求调整,我的农场监测项目选的5分钟间隔方案。
6. 常见问题排查指南
6.1 TCP连接失败排查
现象:AT+QIOPEN返回ERROR
- 检查SIM卡状态(AT+CPIN?)
- 确认APN配置正确(AT+QICSGP?)
- 测试基站信号(AT+CSQ,大于10才稳定)
现象:服务器收不到数据
- 用tcpdump抓包确认数据到达服务器
sudo tcpdump -i eth0 port 1811 -vv- 检查防火墙设置(sudo ufw status)
6.2 Lora通信异常处理
通信距离突然变短
- 检查天线阻抗匹配(理想50Ω)
- 用频谱仪查看信道干扰
- 确认收发双方SF/BW参数一致
数据包CRC校验失败
- 降低传输速率(我最终用SF10, BW125)
- 添加前导码(AT+PARAM=12,8,1,4)
- 启用显式报头模式(AT+MODE=2)
7. 项目扩展方向
这套框架其实不仅能测光照,我最近正在做这些扩展:
- 温湿度传感器节点(SHT30)
- 土壤墒情监测版本(增加ADC接口)
- 太阳能供电改造(TP4056充电管理)
- 微信报警功能(通过Server酱API)
有个特别实用的改进是在网关添加本地缓存,当4G信号不好时先用SPI Flash暂存数据,等信号恢复后断点续传。我用W25Q128实现了最多存储7天的数据。