当前位置: 首页 > news >正文

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)。

http://www.jsqmd.com/news/1390615/

相关文章:

  • 三步玩转EinkBro:专为电子墨水屏优化的护眼浏览器上手指南
  • 村级门户网站建设如何真正服务于三农?从乡村振兴视角看数字化落地的真实痛点与破局之道
  • React-Slot-Fill vs 传统Portal:为什么它是更强大的组件融合方案
  • 揭秘河池市住房和城乡建设局官网的隐藏福利与办事指南,让你办事少走弯路
  • 告别NCM格式限制:ncmdump免费一键解密网易云音乐的完整上手教程
  • 企业搭建商城小程序,专业开发公司精选推荐 - 南溪村的小陈子
  • 从0到1掌握poetry-dynamic-versioning:新手必备的版本控制技巧
  • 如何快速上手ml-projects:5分钟搭建你的第一个Web ML应用
  • 青岛大学春季高考有网站建设吗深度解析:给家长和考生的真心话与备考指引
  • Matt Pocock技能包治AI瞎写与造屎山
  • 从一台“失踪“的笔记本说起:GLPI免费开源系统如何管住IT资产与工单
  • 从ccopt_property到sqlsessionfactory:深度解析属性初始化失败的根源与防御策略
  • 编译原理核心:从词法分析到语法分析,掌握预测分析表与LR分析
  • 用两条眼睛看视频:当深度学习第一次打赢了手工特征
  • 深圳制造业短视频全网营销哪家好?选购指南解析 - 汇聚至此
  • PCB阻焊桥设计:工艺细节、规范与DFM分析实战
  • 个体户做小程序商城,SaaS平台选型终极对比 - 南溪村的小陈子
  • YOLOv8工业零件检测数据集的详细步骤。这个数据集包含6种工业零件(轴承、螺栓、法兰、齿轮、螺母、弹簧),已经转换为 YOLO 格式,并且训练效果非常好,120轮后 mAP 达到 0.9
  • 深度探索gh_mirrors/ae/AES:从密钥扩展到加密流程的完整代码分析
  • 拯救训练崩溃:LLaMA-Factory分布式训练容错机制全解析
  • AI模型部署工具选型指南:从GGUF到vLLM的13款工具实战对比
  • Linux C语言高级编程:从内存管理到epoll高并发实战
  • 深圳企业AI获客营销课程哪家好?P-A-O方法论构建增长新路径 - 汇聚至此
  • SAP内部订单修改KO02详解:从核心原理到实战避坑指南
  • Python机器学习构建房价预测系统的实践与优化
  • HTML5开发实战:语义化标签与性能优化指南
  • CSS Toggle Switch响应式设计秘籍:em、rem与px单位灵活应用技巧
  • gh_mirrors/we/wechatPc架构详解:WebSocket通讯与多模块协作流程
  • 保姆级SERL教程:零基础训练机器人抓取,BC策略从0到落地全流程
  • 太原乐器选购避坑指南:本地琴行怎么选才靠谱 - 收录优先