ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CPE开发者3GPP学习笔记 #13:SMS 短信管理

2026/8/14 9:03:32 拓冰建站 浏览量
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 卡激活)是常见需求。本文回答三个问题:

  1. Text 模式和 PDU 模式的区别?CPE 设备上哪种更推荐?
  2. 中文短信的编码方式(UCS2)如何工作?如何解出"你好"这两个字符?
  3. 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 固件设计决策汇总

  1. CPE 推荐 PDU 模式。 对编码、UDH、拼接有确定性控制,不依赖模组字符集行为。
  2. 中文用 UCS2(DCS=0x08),上限 70 字符;英文用 GSM 7-bit(0x00),上限 160 字符。
  3. 超长短信按"引用号 + 总段数 + 段号"拼接,不是按到达顺序。 段可能乱序,引用号区分不同组。
  4. 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 篇全部完成,覆盖四层:

  1. AT 命令层(#1-3):语法、初始化、网络注册、数据连接——日常交互;
  2. NAS 协议层(#4-6):4G EMM、5G 5GMM、2G/3G GMM——故障排查;
  3. 系统架构层(#7-9):EPS、5GS、QoS/PCC——功能设计;
  4. 进阶专题层(#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)。