pdu串发送长短信怎么操作?分片重组要注意什么?
- 虚拟主机
- 2025-12-22
- 5
在移动通信和物联网应用中,PDU串发送长短信是一种常见的技术手段,尤其在没有标准短信接口或需要底层控制短信内容的场景下,PDU(Protocol Data Unit)协议是GSM/GPRS网络中短信传输的核心规范,通过特定的编码格式将短信内容转换为二进制数据,再通过AT指令等方式发送至模块,长短信的发送并非简单的单条短信扩展,而是涉及短信拼接、分段标识、编码优化等多个技术环节,本文将详细解析PDU串发送长短信的原理、流程及实现细节。
PDU串基础与长短信的定义
PDU串是短信模块与网络交互的二进制数据表示形式,其结构因短信类型(发送、接收)、编码方式(7bit、8bit、UCS2)而异,长短信通常指超过单条短信容量限制的文本消息,GSM标准中单条短信的payload长度受限于140字节(7bit编码时160字符,8bit/UCS2编码时70字符),当内容超出此限制时,需通过“短信拼接”(Concatenated Short Messages)技术将长短信拆分为多条分段短信,接收端再按顺序重组。
长短信的核心技术:短信拼接(SMS Concatenation)
短信拼接基于3GPP TS 23.040标准,通过引入“用户数据头”(User Data Header, UDH)实现分段标识,UDH位于PDU串的用户数据部分,前缀为“00”(UDH长度标识),后跟具体分段信息,典型的UDH结构如下:
- UDH头:1字节(固定为“00”)
- IE标识(Information Element):1字节(拼接短信的IE标识为“00”)
- IE长度:1字节(固定为“03”)
- 分段信息:3字节
- 参考号(Reference Number):1字节(同一长短信的分段共享相同参考号)
- 分段总数:1字节(长短信总段数)
- 当前段序号:1字节(当前分段序号,从1开始)
一条分为3段的长短信,其UDH部分可表示为“00 05 00 03 01 03 02”(注:实际需转换为十六进制PDU格式)。

PDU串发送长短信的完整流程
数据准备与分段编码**:根据文本类型选择编码方式(中文通常用UCS2,英文可选7bit优化)。
- 分段计算:单段可用长度=总payload长度UDH长度(UCS2编码时UDH占6字节,故单段可用134字节),300字节的中文文本需分为3段(300/134≈2.24,向上取整)。
- UDH插入:每段短信前添加UDH,并填充分段信息。
PDU串生成(以UCS2编码为例)
单条短信的PDU结构(发送格式)为:
SCA PDUType MR DA PID DCS VP UDL UD
- SCA:服务中心号码(Service Center Address),格式为“91+号码BCD码”,如“9131881234567F”表示+861381234567。
- PDUType:短信类型,发送时为“11”(TPMessageCommandField=0,TPMessageTypeIndicator=01)。
- MR:消息引用号(2字节,可自增)。
- DA:目标号码(TPDestinationAddress),格式同SCA,如“9131887654321F”。
- PID:协议标识(TPProtocolIdentifier),通常为“00”。
- DCS:数据编码方案(TPDataCodingScheme),UCS2编码时为“08”。
- VP:有效期(TPValidityPeriod),可选“FF”表示最大有效期。
- UDL:用户数据长度(TPUserDataLength),UCS2编码时为字节数,需包含UDH长度。
- UD:用户数据(TPUserData),即编码后的文本+UDH。
分段PDU示例:
假设发送“Hello, this is a long SMS test!”(分段为3段),参考号为“0x12”,分段信息为“03 01 03 02 03”:
- 第一段PDU(部分):0011000A9131887654321F0008000045D00708102030103020300480065006C006C006F002C00200074006800690073002000690073002000610020006C006F006E006700200053004D005300200074006500730074002100
(注:实际需完整计算MR、UDL等字段)
AT指令发送
通过串口AT指令将PDU串发送至模块,常用指令为:
AT+CMGS=<length><CR>PDU串<CtrlZ>
其中<length>为PDU串长度(不含<CR>和<CtrlZ>)。

关键参数与注意事项
-
编码方式选择:
- 7bit编码:适合英文,压缩率高但需处理字符表(如扩展表)。
- UCS2编码:支持多语言,但占用空间大,需精确计算分段。
- 8bit编码:适合二进制数据(如图片)。
-
分段参数一致性:同一长短信的所有分段必须共享相同的参考号和分段总数,否则接收端无法重组。
-
模块兼容性:部分旧模块可能不支持UDH或分段重组,需提前验证模块AT指令集(如AT+CMGF=0设置为PDU模式)。

-
发送间隔控制:分段短信需按顺序发送,建议间隔200500ms,避免接收端乱序。
- 编码压缩:对纯英文文本使用7bit编码,减少分段数量。
- 批量发送:利用AT指令的+CMGS参数支持连续发送,减少指令交互开销。
- 错误重传:通过AT+CMGL查询未发送成功的短信,实现分段重传机制。
常见问题与解决方案
为什么长短信接收后显示乱序或丢失?
原因:分段短信的参考号或分段总数不一致,或发送间隔过短导致模块处理异常。
解决:检查UDH中的分段信息是否正确,确保分段间发送间隔≥200ms,并在发送前通过AT+CMGS指令的响应确认每段成功。
如何优化长短信的发送效率?
优化方向:
相关问答FAQs
Q1: 长短信的分段是否收费?
A1: 是的,长短信按实际发送的分段条数收费,一条分为3段的长短信会扣除3条短信的套餐费用,因此需在发送前评估成本,必要时提示用户缩短内容。
Q2: 如何确保长短信在弱信号环境下不丢失?
A2: 可通过以下方式增强可靠性:1)在发送前检测信号强度(AT+CSQ指令),确保RSSI≥85dBm;2)启用模块的短信存储功能(AT+CPMS),将未成功发送的短信保存在SIM卡或模块内存中,待信号恢复后重试;3)实现应用层的确认机制,接收端返回ACK信号后继续发送下一段。