如何通过AT+CMGL命令检索同一条长短信的所有分片
解决GSM Modem短信分片合并问题
关于AT+CMGL的分片标识参数
文本模式下的AT+CMGL="ALL"默认不会返回短信分片的关联标识,这也是你看到分片被当作独立短信的原因。要获取分片关联信息,有两种可行方案:
方案1:切换到PDU模式解析分片信息
PDU模式是GSM短信的原生格式,会包含分片所需的用户数据头(UDH),其中包含同一条长短信的唯一参考号、总片数、当前片数。步骤如下:
- 发送命令切换到PDU模式:
AT+CMGF=0 - 发送
AT+CMGL=4(参数4对应"ALL",不同modem可能参数值有差异,以手册为准)获取所有短信的PDU数据 - 解析PDU中的UDH部分:
- UDH里的
0003或0800是分片标识的类型字段 - 后续的字节包含:唯一参考号(1或2字节)、总片数、当前片数
- 相同参考号的短信属于同一条长短信的不同分片
- UDH里的
方案2:文本模式下启用扩展支持(部分Modem可用)
部分厂商的Modem支持在文本模式下返回分片信息,你可以尝试以下操作:
- 发送
AT+CSMS=1启用增强型短信服务 - 发送
AT+CMGL="ALL",1(部分Modem的扩展参数,需参考手册) - 如果支持,短信内容开头会带有UDH前缀(比如
050003XX0201),其中:XX是唯一参考号,02是总片数,01是当前片数- 相同参考号的短信即为同一条长短信的分片
短信分片合并与UI展示步骤
- 收集分片标识:从PDU解析或文本模式的UDH前缀中,提取每条短信的参考号、总片数、当前片数
- 分组排序:按参考号将短信分组,同一组内按当前片数从小到大排序
- 内容拼接:去掉UDH前缀(如果是文本模式),将同组的短信内容按顺序拼接
- UI展示:在界面中显示合并后的完整短信,替代原来的多条分片短信
示例(文本模式带UDH前缀)
收到的分片短信:
AT+CMGL="ALL",1 +CMGL: 0,"REC UNREAD","+111111","","23/01/03,18:16:20+04" 050003A10201This is message 1 : message 1 message 1... +CMGL: 1,"REC UNREAD","+111111","","23/01/03,18:16:21+04" 050003A10202This is second part of message 1 +CMGL: 2,"REC UNREAD","+111111","","23/01/03,18:19:04+04" This is message 2 OK
合并后:
- 参考号
A1的两条分片拼接为:This is message 1 : message 1 message 1...This is second part of message 1 - 独立短信保持原样:
This is message 2
内容的提问来源于stack exchange,提问作者LK Capi
相关产品推荐
相关产品推荐

