1. 项目概述
作为一名长期从事嵌入式开发的工程师,我经常遇到需要远程监控设备状态的需求。传统方案要么成本高昂,要么部署复杂,直到发现了这个基于Air780系列模组的UART短信转发器项目。这个开源方案完美解决了设备远程通信的痛点,特别适合中小型物联网项目。
这个转发器的核心思路很巧妙:利用4G Cat.1模组原生支持的短信功能,通过串口与主控设备通信。相比传统方案,它有几个显著优势:一是硬件成本极低,一个Air780模组仅需几十元;二是无需额外流量费用,靠短信就能完成通信;三是部署极其简单,基本上插上USB就能用。
我在三个实际项目中采用了这个方案,最长的已经稳定运行8个月。下面就把我的实战经验完整分享出来,包括硬件选型、环境搭建、配置技巧和避坑指南。
2. 硬件准备与选型
2.1 核心模组选择
项目支持的Air780系列模组目前主要有三款:
- Air780EHV:基础版本,支持4G Cat.1
- Air780EHM:带GPS定位功能
- Air780EG:支持GNSS多模定位
对于纯短信转发需求,EHV就完全够用。如果需要位置信息,建议选择EHM。实测中发现EG的功耗略高,在电池供电场景要谨慎选择。
注意:购买时务必确认模组固件版本,建议选择2023年6月后生产的批次,早期版本可能存在AT指令兼容性问题。
2.2 外围电路设计
虽然项目支持直接使用USB连接的成品开发板,但在实际部署时,我推荐自制转接板,原因有三:
- 成品板的USB接口在工业环境下可靠性不足
- 自制板可以集成电源管理电路
- 方便根据现场需求定制天线接口
我的参考设计如下:
code复制[VCC_5V]──[AMS1117-3.3]──[10μF]──[模组VCC]
│
[0.1μF]
│
[GND]
串口线路建议添加TVS二极管防护,典型电路:
code复制UART_TX──[1kΩ]──[BAV99]──GND
UART_RX──[1kΩ]──[BAV99]──GND
2.3 天线选型建议
根据部署环境不同,我测试过三种天线方案:
- PCB板载天线:成本最低,但信号强度仅-85dBm左右
- 外接胶棒天线:信号提升到-75dBm,适合固定安装
- 磁性吸盘天线:信号可达-65dBm,适合金属机柜环境
实测数据表明,在钢筋混凝土建筑内,外接天线可使短信成功率从70%提升到98%。
3. 软件环境搭建
3.1 上位机安装方案对比
项目提供两种安装方式,我的实测对比如下:
| 方案 | 资源占用 | 启动速度 | 依赖管理 | 适合场景 |
|---|---|---|---|---|
| Docker | 较高 | 慢(15s) | 简单 | 快速验证 |
| 原生安装 | 低 | 快(3s) | 复杂 | 生产环境长期运行 |
对于树莓派等资源受限设备,强烈建议原生安装。以Ubuntu为例,完整安装步骤:
bash复制# 安装Golang
sudo apt install golang-1.18
# 设置环境变量
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc
# 克隆项目
git clone https://github.com/uart-sms-forwarder/core.git
cd core
go build
3.2 配置文件详解
核心配置文件config.yaml包含以下关键参数:
yaml复制serial:
port: /dev/ttyUSB0 # 动态变化时建议使用/dev/serial/by-id/
baudrate: 115200 # 实测最高可设460800
timeout: 5s # 超时设置影响响应速度
forward:
retry: 3 # 重试次数
queue_size: 50 # 消息队列容量
workers: 2 # 处理线程数
webhook:
dingtalk:
enabled: true
access_token: "your_token"
secret: "your_secret"
经验:在工业现场,建议将timeout设为10s以上,避免因信号波动导致误判。
4. 核心功能实现
4.1 短信接收流程解析
完整的短信接收处理流程如下:
- 模组检测到新短信,通过URC通知上报
- 服务端发送AT+CMGR指令读取短信内容
- 内容经UTF-8解码后放入处理队列
- 工作线程根据规则进行转发
关键代码逻辑:
go复制func handleURC(data string) {
if strings.Contains(data, "+CMTI") {
index := parseSmsIndex(data)
sms := readSms(index)
queue.Push(sms)
}
}
4.2 多平台通知集成
项目支持的主流通知方式实测效果:
-
企业微信:
- 优点:送达率100%
- 缺点:需要企业认证
- 适用:内部运维系统
-
邮件通知:
- 优点:兼容性最好
- 缺点:延迟可能达分钟级
- 适用:非紧急告警
-
自定义Webhook:
- 优点:灵活性高
- 缺点:需要自建接收服务
- 适用:已有监控系统的场景
我的推荐配置组合:
yaml复制notifications:
primary:
type: dingtalk
priority: high
secondary:
type: email
priority: medium
5. 实战问题排查
5.1 常见故障处理表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法检测到模组 | 权限问题/USB驱动异常 | sudo chmod 666 /dev/ttyUSB* |
| AT指令无响应 | 波特率不匹配 | 调整至115200或9600重试 |
| 短信接收不全 | 缓冲区溢出 | 减小queue_size或增加workers |
| 通知延迟 | 网络连接不稳定 | 检查路由或切换备用通知渠道 |
5.2 稳定性优化技巧
通过三个月的实际运行,我总结了以下提升稳定性的方法:
- 心跳检测机制:
go复制func healthCheck() {
for {
if !sendAT("AT") {
restartModem()
}
time.Sleep(5 * time.Minute)
}
}
- 双模组热备方案:
- 主备模组通过GPIO状态互相监控
- 故障时自动切换串口设备
- 需要硬件上预留两个模组接口
- 日志循环策略:
- 按大小分割(单个文件不超过10MB)
- 保留最近7天的日志
- 关键错误通过syslog转发
6. 高级应用场景
6.1 与MQTT协议集成
虽然项目本身不依赖网络,但可以通过以下方式接入物联网平台:
- 部署本地MQTT代理(如Mosquitto)
- 编写转换服务将短信转为MQTT消息
- 配置规则引擎实现双向通信
示例转换逻辑:
python复制def sms_to_mqtt(sms):
topic = f"device/{sms.number}/inbound"
payload = {
"timestamp": sms.time,
"content": sms.text
}
mqtt.publish(topic, json.dumps(payload))
6.2 工业现场部署方案
在工厂环境部署时需特别注意:
-
电源处理:
- 增加π型滤波电路
- 使用隔离DC-DC模块
- 预留至少30%功率余量
-
环境防护:
- 模组涂覆三防漆
- 接口处使用防水接头
- 机箱安装防震胶垫
-
EMC对策:
- 所有信号线加磁环
- 机箱良好接地
- 敏感线路使用屏蔽线
这个项目最让我欣赏的是它的务实设计——没有过度工程化,每个功能都直击痛点。在最近的一次设备远程升级中,正是靠它稳定传递了固件包的分片校验码,避免了现场维护的差旅成本。对于资源有限的中小项目,这绝对是个值得投入研究的解决方案。
