内核添加模块
在 drivers/usb/serial/option.c
短信相关
发送短信的流程就是配置短信模式->配置字符集->下发发送命令->等待,提示符->发送正文/PDU ->发送ctrl+z –>等待结果
TEXT 格式
AT+CMGF=1 //设置短信为文本模式
PDU格式
PDU模式不仅能发送中文短信,也能发送英文短信。PDU收发短信有三种编码可用:7-bit、8-bit和UCS2编码。GSM 7-bit 默认字母表不是 ASCII;不带用户数据头时最多 160 个 septet,扩展表字符会占两个 septet。8-bit 编码通常用于二进制数据;UCS-2 可表示中文等 BMP 字符,不带用户数据头时最多 70 个码元。长短信的 UDH 会减少每段可用长度。
AT+CMGF=0 // 设置 PDU 模式;发送命令另用 AT+CMGS=<TPDU 字节数>
发送 PDU(SMS-SUBMIT)
数据格式:
| SCA | PDU-Type | MR | DA | PID | DCS | VP | UDL | UD |
|---|---|---|---|---|---|---|---|---|
| 1-12 | 1 | 1 | 2-12 | 1 | 1 | 0,1,7 | 1 | 0-140 |
SCA 短消息服务中心号码
PDU-Type 协议数据单元类型(1字节)
发送时
BIT 7 6 5 4 3 2 1 0 参数 RP UDHI SRR VPF VPF RD MTI MTI MTI 2bit:消息类型,00表示收,01表示发
RD 1bit:重复信元丢弃。0通知服务中心碰到同源、同目的地、同样的MR(短消息序号)的短消息接受;
VPF 2bit:00 表示 VP 不存在;10 为 1 字节相对有效期;01 为 7 字节增强格式;11 为 7 字节绝对有效期(半字节编码)。
SRR 1bit:是否请求状态报告。
MR 是发送方设置的 8 位消息参考号(0~255),用于关联发送消息及状态报告,不是成功发送的短信总数。
DA 接收方地址(手机号码 半字节倒序编码)
PID 协议标识
DCS 编码方法和消息类别 (UCS2编码0等级为08H,7bit编码是00H)
VP 有效期
- 0 到 143 $(V + 1) \times 5$ 分钟 5 分钟 到 12 小时
- 144 到 167 $12$ 小时 $+ (V - 143) \times 30$ 分钟 12.5 小时 到 24 小时
- 168 到 196 $(V - 166) \times 1$ 天 2 天 到 30 天
- 197 到 255 $(V - 192) \times 1$ 周 5 周 到 63 周
例如:
//向15050850677发送一条短信,内容“Test”
//0011000D91685150800576F70000C404D4F29C0E
//向15050850677发送一条短信,内容“你好”
//0011000B815150800576F70008C4044F60597D
| SCA | PDU-Type | MR | DA | PID | DCS | VP | UDL | UD |
|---|---|---|---|---|---|---|---|---|
| 1-12 | 1 | 1 | 2-12 | 1 | 1 | 0,1,7 | 1 | 0-140 |
| 00 | 11 | 00 | 0D91685150800576F7 | 00 | 00 | C4 | 04 | D4F29C0E |
| 00 | 11 | 00 | 0B815150800576F7 | 00 | 08 | C4 | 04 | 4F60597D |
关键字段
DA/OA:接收方与发送方地址
DA与OA编码方式是一样的 2-12个8位位组
例如:0D91685150800576F7
| DA LEN | DA TYPE 目标号码的类型 | DA ADDR 存储目的地址号码 |
|---|---|---|
| 0D (一个字节,表示DA ADDR长度) | 91(国际型) | 685150800576F7 占用 ceil(DA LEN/2) 字节 |
短信配置流程
//1.设置短信编码格式为PDU
AT+CMGF=0
/**
* 2. 设置短信上报方式 <mode>,<mt>,<bm>,<ds>,<bfr>
<mode> 2 缓存通知 当串口忙(如处于数据模式)时,模块会暂时缓存通知,待回到指令模式后再发送
<mt> 1 存储索引通知 收到短信后,模块将其存入 SIM 卡或 Flash,然后通过串口主动发送+CMTI: "ME", index
与 2(直接把短信内容吐到串口)相比, 1具有以下的优势,
数据安全:短信先存盘,避免由于串口波特率太高或单片机/嵌入式系统处理不及时导致的数据丢失。
解析简单:你的程序只需要监听 +CMTI 这个特征字符串,然后根据索引去读取,逻辑更加解耦。
防止干扰:如果短信很长或者是 PDU 格式,直接吐出大量数据可能会干扰到正在进行的 AT 指令交互。
<bm> 0 不广播 不向TE终端主动发送小区广播消息
<ds> 0 无状态报告 不主动发送短信状态报告(即确认对方是否收到的回执)
<bfr> 0 输出缓存 进入相应通知模式后向 TE 输出缓存的通知;1 才表示清除缓存而不输出。
*/
AT+CNMI=2,1,0,0,0
打电话
测试
通过microcom 与/dev/ttyUSB 进行通信
- -t 超过多少ms超时
- -s 设置波特率
常用命令
AT+CGMM 请求 MT 型号 ID
上网
查询信号强度:
//+CSQ: <rssi>,<ber>
AT+CSQ
+CSQ: 24,99 //rssi越接近31信号越强
OK
rssi:
//查询命令 响应+CREG: <n>,<stat>[,<lac>,<ci>[,<AcT>]]
AT+CREG?
EG800G
EG800G/ EC800G
下表仅作为特定固件的端口观察记录。ttyUSB 编号会受枚举顺序、接口组合及其他 USB 串口设备影响,不应跨型号、固件版本写死;需对照对应型号手册和 USB 接口信息确认。
| 设备节点 | 用途 | 能否发 AT |
|---|---|---|
/dev/ttyUSB0 | AT 命令口 | ✅ 最推荐 |
/dev/ttyUSB1 | DIAG/AP log | ❌ |
/dev/ttyUSB2 | 调试串口,目前无实际作用 | ❌ |
/dev/ttyUSB3 | CP log | ❌ |
/dev/ttyUSB4 | Modem / AT 命令 | ✅ 也可以 |
/dev/ttyUSB5 | GNSS / AT 命令,部分 GA 型号 | ✅ 条件支持 |