最近在折腾智能家居联动时,发现一个痛点:家里老人用的功能机无法直接对接智能家居平台,而运营商提供的短信提醒服务又需要消耗流量。于是动手做了这个基于UART通信的开源短信转发器,特点就是完全免焊接(使用杜邦线连接)且不依赖移动数据网络。
这个方案的核心价值在于:
| 部件 | 型号 | 关键参数 | 成本 |
|---|---|---|---|
| 主控板 | ESP8266 NodeMCU | 支持Arduino框架,自带USB转串口 | ¥18 |
| GSM模块 | SIM800L | 支持2G网络,TTL电平 | ¥25 |
| 连接线 | 杜邦线(母对母) | 20cm长度 | ¥2 |
| 电源 | 5V1A充电头 | 带MicroUSB接口 | 自备 |
注意:SIM800L模块必须选择带板载电平转换的版本(3.3V兼容),否则需要额外加装电平转换芯片
plaintext复制SIM800L -> NodeMCU
TXD -> D2 (GPIO4)
RXD -> D1 (GPIO5)
GND -> GND
VCC -> 3.3V
实测中发现两个关键细节:
cpp复制#include <SoftwareSerial.h>
SoftwareSerial SIM800L(4, 5); // D2->RX, D1->TX
void setup() {
SIM800L.begin(9600);
SIM800L.println("AT+CNMI=2,2,0,0,0"); // 设置新短信直接推送
}
void loop() {
if(SIM800L.available()) {
String response = SIM800L.readString();
if(response.indexOf("+CMT:") != -1) {
parseSMS(response); // 短信内容解析
}
}
}
采用本地规则引擎处理转发逻辑:
实测中遇到的坑:
GSM7ToUnicode库)\r\n或\n,需要做兼容处理将燃气报警器短信转发到HomeAssistant:
python复制# HomeAssistant自动化配置示例
automation:
- alias: 'Gas Alert'
trigger:
platform: mqtt
topic: "sms/gas_alert"
action:
service: notify.mobile_app
data:
message: "燃气泄漏报警!"
通过邮件转发田间大棚的温湿度报警:
cpp复制void sendEmailAlert(String msg) {
SIM800L.println("AT+CMGF=1");
SIM800L.println("AT+SMTPSRV=\"smtp.163.com\",465");
SIM800L.println("AT+SMTPAUTH=1,\"your_email@163.com\",\"password\"");
SIM800L.println("AT+SMTPFROM=\"your_email@163.com\",\"农场监控\"");
SIM800L.println("AT+SMTPRCPT=1,0,\"target@qq.com\",\"\"");
SIM800L.println("AT+SMTPSUB=\"温湿度警报\"");
SIM800L.println("AT+SMTPBODY=" + msg);
SIM800L.println("AT+SMTPSEND");
}
硬件层面:
软件层面:
cpp复制// 深度睡眠示例(需连接RST引脚)
#define uS_TO_S_FACTOR 1000000
ESP.deepSleep(300 * uS_TO_S_FACTOR);
at复制AT+COPS=1,2,"46000" // 强制注册中国移动
AT+CBAND=1,3,5 // 锁定900MHz频段
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 模块不启动 | 供电不足 | 改用2A电源,检查线损 |
| 无法注册网络 | 频段不匹配 | 执行AT+CBAND=1,3,5 |
| 中文乱码 | 编码设置错误 | AT+CSCS="UCS2" |
| 短信重复接收 | CNMI参数错误 | AT+CNMI=2,1,0,0,0 |
最近一次升级中,发现SIM800L的固件版本会影响指令兼容性。建议通过AT+CGMR查询版本号,V15.00以上的版本需要调整APN设置指令格式。