1. 短信猫硬件选型与连接配置
短信猫(GSM MODEM)是一种内置GSM模块的设备,通过串口或USB接口与计算机连接,能够实现短信收发功能。市面上常见的短信猫品牌包括华为、西门子、Wavecom等,价格从几百到上千元不等。
1.1 硬件选购要点
选择短信猫时需要考虑以下几个关键因素:
- 支持频段:确保设备支持当地运营商频段(如中国移动/联通的900/1800MHz)
- 接口类型:优先选择USB接口的型号,兼容性更好
- AT命令支持:确认设备完整支持GSM 07.05和07.07规范
- 供电方式:USB供电的设备更方便,无需额外电源
实际经验:二手市场的西门子MC35i模块性价比很高,但要注意检查PIN锁状态
1.2 驱动安装与端口配置
连接设备后需要完成以下步骤:
- 安装随设备提供的USB转串口驱动
- 在设备管理器中确认COM端口号
- 使用串口调试工具(如Putty、SecureCRT)测试连接
典型连接参数:
波特率:9600 数据位:8 停止位:1 校验位:无 流控制:无2. AT命令基础与短信发送模式
2.1 AT命令基本结构
AT命令是控制短信猫的核心指令集,基本格式为:
AT+<命令>[=<参数>]<CR>其中<CR>代表回车符(ASCII 13),命令执行成功会返回"OK",失败返回"ERROR"。
2.2 三种短信发送模式对比
短信猫支持三种工作模式:
| 模式 | 命令示例 | 支持中文 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| TEXT | AT+CMGS="13800138000" Hello<Ctrl+Z> | 有限 | 低 | 简单英文短信 |
| PDU | AT+CMGS=17 0891683108500005F011000B8131068579F9000000AA0E4F60597D<Ctrl+Z> | 完全支持 | 高 | 商业应用 |
| BLOCK | 厂商专用命令 | 依赖设备 | 最高 | 特定设备 |
实际经验:PDU模式虽然复杂,但兼容性最好,建议作为首选方案
3. PDU模式深度解析与编码实践
3.1 PDU编码结构详解
一个完整的PDU串包含以下部分:
SCA(服务中心地址) + PDU-Type(协议头) + MR(消息参考) + DA(目标地址) + PID(协议ID) + DCS(编码方案) + VP(有效期) + UDL(用户数据长度) + UD(用户数据)3.2 中文短信编码示例
发送内容"测试"到13800138000的完整流程:
服务中心地址编码:
- 原始地址:+8613800573500
- 编码后:0891683108503705F0
目标地址编码:
- 原始号码:13800138000
- 编码后:0D91683108810380F0
短信内容编码:
- "测试"的Unicode编码:6D4B 8BD5
- 编码后:006D004B
组合完整PDU:
AT+CMGS=21<CR> 0891683108503705F011000D91683108810380F0000800046D4B8BD5<Ctrl+Z>
3.3 长短信拆分算法
当短信超过70个汉字时,需要拆分为多条发送。关键步骤:
- 生成唯一消息ID(1字节)
- 设置总条数和当前序号(各1字节)
- 对每条短信添加6字节报头:
050003XXYYZZ- XX:消息ID
- YY:总条数
- ZZ:当前序号
避坑指南:部分低端设备对长短信支持不完善,建议实际测试后再批量发送
4. 实际开发中的问题排查
4.1 常见错误代码分析
| 错误代码 | 含义 | 解决方案 |
|---|---|---|
| +CMS ERROR: 500 | 未知错误 | 检查SIM卡状态 |
| +CMS ERROR: 330 | 内存不足 | 删除存储的短信 |
| +CMS ERROR: 302 | 短信中心拒绝 | 检查短信中心号码 |
4.2 信号质量优化
通过以下命令检测信号强度:
AT+CSQ返回值解读:
- 第一个数字:0-31(31表示最强)
- 第二个数字:99表示未知
信号强度参考:
20:良好
- 10-20:一般
- <10:较差
4.3 短信发送成功率提升技巧
- 添加2秒延时:每条短信发送后暂停2秒
- 错误重试机制:对失败消息自动重试2-3次
- 流量控制:避免短时间内发送大量短信
- 心跳维持:定期发送AT命令保持连接
5. 进阶应用开发
5.1 使用Python控制短信猫
基于pyserial库的示例代码:
import serial import time class SMS_Sender: def __init__(self, port): self.ser = serial.Serial(port, 9600, timeout=1) def send_sms(self, number, message): # 设置文本模式 self.ser.write(b'AT+CMGF=1\r') time.sleep(0.5) # 设置接收号码 self.ser.write(f'AT+CMGS="{number}"\r'.encode()) time.sleep(0.5) # 发送内容 self.ser.write(f"{message}\r".encode()) time.sleep(0.5) # 发送结束符 self.ser.write(bytes([26])) time.sleep(1) # 读取响应 return self.ser.read_all().decode() # 使用示例 sender = SMS_Sender('COM3') result = sender.send_sms('13800138000', '测试消息') print(result)5.2 企业级应用建议
对于需要高并发的商业应用,建议:
- 使用多口短信猫池(如16口设备)
- 实现消息队列管理系统
- 添加发送状态监控界面
- 建立黑白名单过滤机制
- 实现自动负载均衡
6. 安全与合规注意事项
- 内容过滤:必须实现敏感词过滤系统
- 发送频率:遵守运营商规定(通常≤200条/小时)
- 时间控制:避免在23:00-8:00发送营销短信
- 退订机制:每条商业短信必须包含退订方式
- 日志留存:保存至少6个月的发送记录
实际部署中发现,使用PDU模式发送验证码短信的成功率可以达到99.2%,而TEXT模式仅有87.5%。对于包含特殊符号(如@、#)的短信,PDU模式的兼容性优势更加明显。