CPE开发者3GPP学习笔记 #13:SMS 短信管理
CPE开发者3GPP学习笔记 #13:SMS 短信管理
系列:CPE 设备软件开发者的 3GPP 知识体系 日期:2026-08-13 参考规范:TS 27.005 V19.0.0 §3,TS 23.038 V19.0.0 §4/§6,TS 23.040 V19.0.0 §9.2 上一篇:CMUX 多路复用 下一篇:无(系列完结)
1. 本文要解决什么问题
这是系列最后一篇。CPE 虽不常做短信,但"短信保底"(如配置下发、告警通知、SIM 卡激活)是常见需求。本文回答三个问题:
- Text 模式和 PDU 模式的区别?CPE 设备上哪种更推荐?
- 中文短信的编码方式(UCS2)如何工作?如何解出"你好"这两个字符?
- CPE 收到一条超出 140 字节的超长短信(concatenated SMS)如何处理?
2. Text 模式 vs PDU 模式(回答 Q1)
+CMGF(TS 27.005 §3.2.3)切换短信格式:
| mode | 名称 | 含义 |
|---|---|---|
| 0 | PDU 模式 | TE 直接处理完整的 TP 数据单元(十六进制) |
| 1 | Text 模式 | TE 只处理文本,模组负责编码/解码 |
Text 模式(+CMGF=1):
AT+CMGF=1
AT+CMGS="13800138000"<CR>
> 你好<ctrl-Z>
+CMGS: 5 ← 消息引用号
模组帮你把文本编码成 PDU 再发给网络。简单,但编码控制权在模组——中文字符集、DCS 都由模组决定(配合 +CSCS 字符集设置)。
PDU 模式(+CMGF=0):
AT+CMGF=0
AT+CMGS=24<CR>
> 0011000D916831...<ctrl-Z> ← 完整 PDU 十六进制
+CMGS: 5
TE 自己构造完整的 PDU(含 SMSC 地址、TPDU 头、编码后的数据)。复杂,但完全可控——DCS、UDH、长短信拼接都自己掌握。
设计决策 #1:CPE 推荐 PDU 模式。 理由:CPE 是嵌入式设备,短信内容多是机器生成/解析(配置、告警),且常含中文、可能超长。PDU 模式让固件对编码、拼接有确定性控制,不依赖模组的字符集转换行为。例外:如果只收发纯 ASCII 短消息且想省事,Text 模式够用。
3. 中文短信的 UCS2 编码(回答 Q2)
3.1 DCS(数据编码方案)决定字符集
短信的编码方式由 TP-DCS(Data Coding Scheme) 字段决定(TS 23.038 §4)。CPE 最常用的两个值:
| DCS | 字符集 | 最大长度(140 字节内) |
|---|---|---|
| 0x00 | GSM 7-bit 默认字母表 | 160 字符 |
| 0x08 | UCS2(16-bit Unicode) | 70 字符 |
3.2 GSM 7-bit 打包:160 字符怎么塞进 140 字节
GSM 7-bit 字母表每个字符只用 7 bit,把 8 个字符的 7 bit 紧凑打包进 7 个字节(septet 打包)。所以 140 字节 = 1120 bit ÷ 7 bit = 160 字符。但 GSM 7-bit 字母表只覆盖英文、数字、部分符号——没有中文。
3.3 UCS2:中文的解码
中文必须用 UCS2(每个字符固定 2 字节 = 16 bit Unicode 码点)。"你好":
你 = U+4F60 → 字节 4F 60
好 = U+597D → 字节 59 7D
→ "你好" 的 UCS2 编码 = 4F60 597D(4 字节)
CPE 解码中文短信: 读 PDU 的 TP-DCS 字段 → 若为 UCS2(0x08),把 TP-UD(用户数据)按每 2 字节一个 Unicode 码点解析。140 字节 ÷ 2 = 70 个中文字符上限。
4. 超长短信(concatenated SMS)如何处理(回答 Q3)
4.1 为什么需要拆分
单条短信的用户数据上限是 140 字节。超过(如 70+ 中文字符、160+ 英文字符)就必须拆成多条发,接收端再拼起来。这就是 concatenated SMS(级联短信)。
4.2 拆分机制:UDH(用户数据头)
拆分靠 TP-UDH(User Data Header,用户数据头) 实现,通过 TP-UDHI 标志位指示(TS 23.040 §9.2.3.24)。
级联短信的 UDH 结构(8-bit 引用号):
字节 1: UDHL = 0x06(头长度 6 字节)
字节 2: IEI = 0x00(级联短信信息元素标识)
字节 3: IEDL = 0x03(信息元素数据长度 3 字节)
字节 4: 引用号(Reference number,1 字节,同一组短信相同)
字节 5: 总段数(Max segments,如 2)
字节 6: 当前段号(Sequence,1 起)
4.3 关键:UDH 占用用户数据空间
UDH(7 字节)是放在 140 字节的用户数据里的,所以每段能装的内容变少了:
| 编码 | 无 UDH 单条上限 | 有 UDH(7 字节)单段上限 |
|---|---|---|
| GSM 7-bit | 160 字符 | 153 字符((140-7)×8÷7) |
| UCS2 | 70 字符 | 66 字符((140-7)÷2) |
4.4 CPE 的接收拼接逻辑
设计决策 #2:CPE 收到短信要按"引用号 + 总段数 + 段号"拼接,而不是按到达顺序。 完整流程:
1. 解析 PDU,检查 TP-UDHI 标志
2. 若 UDHI=1,解析 UDH,取出(引用号, 总段数, 段号)
3. 按引用号把各段缓存起来
4. 集齐总段数的所有段后,按段号排序,去掉各段 UDH,拼接正文
5. 超时未集齐(如 5 分钟)→ 丢弃并告警(部分短信丢失)
注意两个坑: - 段可能乱序到达,必须按段号排序,不能按接收顺序拼; - 不同组短信的引用号不同,要按引用号分组缓存,别把两条长短信的段混在一起。
5. 完整示例:发一条中文长短信(PDU 模式)
发"你好,这是一条测试短信"(13 个中文字符,UCS2 编码 = 26 字节,单条 70 字符内不用拆):
AT+CMGF=0
AT+CSCS="UCS2" ← 通知字符集(仅影响 +CSCA 等文本参数)
AT+CMGS=<pdu_len><CR>
> 0011000D916831... <DCS=0x08> 4F60597D... <ctrl-Z>
拆解 PDU 的关键字段:
00 SMSC 地址长度(0 = 用模组默认短信中心)
11 PDU 类型(SMS-SUBMIT)
00 MR(消息引用)
0D 91 6831... 目标号码(BCD 编码)
08 DCS(UCS2)
4F60597D... TP-UD(UCS2 编码的中文)
6. CPE 固件设计决策汇总
- CPE 推荐 PDU 模式。 对编码、UDH、拼接有确定性控制,不依赖模组字符集行为。
- 中文用 UCS2(DCS=0x08),上限 70 字符;英文用 GSM 7-bit(0x00),上限 160 字符。
- 超长短信按"引用号 + 总段数 + 段号"拼接,不是按到达顺序。 段可能乱序,引用号区分不同组。
- UDH 占用用户数据空间,每段上限减少(UCS2 66 字符 / 7-bit 153 字符)。 拆分时按带 UDH 的上限计算段数。
7. 规范原文关键引用
| 知识点 | 规范出处 |
|---|---|
| 消息格式 +CMGF(Text/PDU) | TS 27.005 §3.2.3 |
| 发短信 +CMGS | TS 27.005 §3.5.1 |
| 新消息上报 +CNMI | TS 27.005 §3.4.1 |
| DCS 编码方案 | TS 23.038 §4 |
| GSM 7-bit 打包 | TS 23.038 §6.1.2 |
| UCS2 字符集 | TS 23.038 §6.2.1 |
| TPDU 结构(SMS-SUBMIT/DELIVER) | TS 23.040 §9.2.2/§9.2.3 |
| UDH 与级联短信 | TS 23.040 §9.2.3.24 |
8. 系列回顾
至此,CPE 开发者 3GPP 学习笔记 13 篇全部完成,覆盖四层:
- AT 命令层(#1-3):语法、初始化、网络注册、数据连接——日常交互;
- NAS 协议层(#4-6):4G EMM、5G 5GMM、2G/3G GMM——故障排查;
- 系统架构层(#7-9):EPS、5GS、QoS/PCC——功能设计;
- 进阶专题层(#10-13):PLMN/漫游、SIM 文件、CMUX、SMS——按需选学。
核心主线始终没变: CPE 只通过 AT 命令跟模组交互,NAS 是模组的黑盒。你的能力 = 发对命令 + 解析对响应 + 理解 NAS/架构去诊断失败。
本文基于 3GPP/ETSI Release 19 规范(TS 27.005 / TS 23.040 / TS 23.038 V19.0.0)。