1. 项目背景与需求解析
上周帮朋友调试家庭安防系统时,发现一个痛点场景:当主手机不在身边时,经常错过物业发送的验证码和报警通知。市面上的商业短信转发服务要么收费昂贵,要么存在隐私风险。于是花了两个周末时间,用树莓派+Python搭建了一套本地化短信转发系统,完全开源可自定义,成本不到200元。
这套系统的核心价值在于:
- 零成本转发:利用闲置安卓机作为接收端,树莓派处理转发逻辑
- 隐私绝对可控:所有数据流经本地局域网,无需第三方服务器
- 多通道通知:支持邮件/Telegram/企业微信等多渠道分发
- 智能过滤:可设置关键词白名单,避免垃圾短信干扰
2. 硬件准备与系统架构
2.1 设备选型方案
基础配置组合(二选一):
| 设备类型 | 方案A(低成本) | 方案B(高性能) | |----------------|-----------------------|-----------------------| | 主控设备 | 树莓派3B+ | 树莓派4B 4G版 | | 短信接收端 | 闲置安卓机(需root) | 华为E3372 4G上网卡 | | 电源 | 5V2A MicroUSB | Type-C PD充电器 | | 网络环境 | 家庭WiFi | 有线千兆网络 |实测建议:如果只是转发验证码等短文本,方案A完全够用。我用的红米Note5(二手价150元)+树莓派3B组合,连续运行三个月无异常。
2.2 系统通信流程图
[安卓手机] --USB连接--> [树莓派] --HTTP请求--> [通知平台] ↳--本地数据库--↲关键组件说明:
- 短信接收端:通过Tasker+AutoTools组合监听短信入库事件
- 消息处理中心:Python脚本实现关键词过滤/去重/格式化
- 转发引擎:根据规则调用不同平台的API接口
3. 软件环境搭建实录
3.1 安卓端配置(以MIUI为例)
- 启用开发者模式:设置->我的设备->全部参数(连续点击MIUI版本)
- 安装必要工具链:
adb install tasker_5.9.3.apk adb install autotools_1.9.2.apk- Tasker配置流程:
- 新建事件上下文:Event -> Phone -> Received Text
- 添加执行动作:Plugin -> AutoTools -> JSON Write
- 关键参数设置:
{ "Sender": "%SMSRN", "Content": "%SMSRB", "Time": "%TIMES" }3.2 树莓派核心代码实现
消息接收服务(Python3):
from flask import Flask, request import sqlite3 app = Flask(__name__) @app.route('/sms', methods=['POST']) def handle_sms(): data = request.json if not duplicate_check(data['Content']): process_message(data) return 'OK' def duplicate_check(content): conn = sqlite3.connect('sms.db') cursor = conn.cursor() cursor.execute("SELECT 1 FROM messages WHERE content=?", (content,)) return cursor.fetchone() is not None消息转发逻辑示例(企业微信版):
import requests def send_to_wecom(content): url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send" params = { "key": "YOUR_WECOM_KEY" } payload = { "msgtype": "text", "text": { "content": f"【短信转发】\n发件人:{content['Sender']}\n内容:{content['Content']}" } } requests.post(url, params=params, json=payload)4. 高阶功能扩展
4.1 智能分流方案
在process_message()函数中添加路由逻辑:
def process_message(data): if '验证码' in data['Content']: forward_to_email(data) elif '报警' in data['Content']: forward_to_telegram(data) else: store_to_database(data)4.2 安全增强措施
- 通信加密:在安卓端和树莓派之间启用SSL
# 生成自签名证书 openssl req -x509 -newkey rsa:4096 -nodes -out cert.pem -keyout key.pem -days 365- 接口防护:添加Basic Auth验证
from flask_httpauth import HTTPBasicAuth auth = HTTPBasicAuth() @auth.verify_password def verify_password(username, password): return username == 'admin' and password == 'your_strong_password'5. 踩坑实录与优化建议
高频问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Tasker未触发 | 电池优化限制 | 关闭MIUI的"神隐模式" |
| 中文乱码 | 编码格式不一致 | 在HTTP头添加charset=utf-8 |
| 重复转发 | SQLite去重失效 | 增加MD5指纹校验 |
| 企业微信发送失败 | API密钥过期 | 重新创建webhook机器人 |
性能优化技巧:
- 使用
lighttpd替代Flask内置服务器提升并发能力 - 对高频验证码短信启用内存缓存替代数据库查询
- 安卓端配置短信拦截规则,减少无效触发
6. 部署效果与数据统计
在我的家庭网络环境中测试结果:
- 端到端延迟:98%的短信在3秒内完成转发
- 系统负载:树莓派3B平均CPU占用率<15%
- 存储占用:运行三个月后SQLite数据库仅1.2MB
典型应用场景:
- 将公司门禁系统的验证码短信转发到工作手机
- 海外旅行时通过Telegram接收国内银行卡交易提醒
- 智能家居报警信息多终端同步
这套系统最让我满意的不是技术实现,而是真正解决了信息触达的"最后一米"问题。现在无论手机放在哪个房间,重要通知都不会错过。后续计划加入语音播报功能,对老人更友好