短信格式(sms)以及编码总结

短信开发指通过串口 at 命令驱动短信猫进行短信发送和接收操作。

 

 

AT 命令 :AT命令是驱动短信设备的标准工业命令,除了业界的标准之外,每个厂商可能会对其进行扩展,不过一般来说,标准命令应该够用,我在这里用的是西门子 MC39i ,有专门的 AT 命令文档。

 

一、短信猫操作分为三种模式 Block、Pdu Text

1Block 模式基本已经被 Pdu 模式取代,没有具体研究

2Text 模式比较简单,但是支持的设备不是很全,而且不能实现中文。

AT CGMF=1<CR>

AT CGMS= 13612344321 ,129<CR> >Hello World!<^Z>

 

3Pdu 模式

Pdu 编码主要包括两个主要的部分,一是 pdu 串的整体数据格式,分别因为发送信息串和接收信息串而有区别,二是 pdu 中文本部分的编码,分别因为字符集而不同。

我们也可以这样来理解这个 pdu 编码的格式, sms 相当于一个协议栈,最简单的协议栈:

 

根据 gsm03.40 规范, sms 协议包括以下几层:

1 SM-AL :应用层。这个部分就是数据部分。

2 SM-TL :传输层。我们可以清楚的看到这里描述了主要的短信内容,包括发送号码,接收号码,信息类型,编码,数据报长度等等,这也是我们编程主要要面对的问题。

3 SM-RL :中继层。这个指的是短信在网关之间中继需要的协议。

4 SM-LL:链路层。

从上述描述中我们可以清楚的看到,我们编程主要集中于传输层

 

 

 

二、短信传送有三种编码 7 位, 8 位, UniCode

 

1、英文 7 位编码

这是 gsm 的默认编码方式

由于这样的移位,我们可以看到我们能发的最多英文字符等于: 140*8/7 = 160

2、数据 8 位编码

8-bit 编码通常用于发送数据消息,比如图片和铃声等;

3、中文 pdu 编码

发送中文时,必须用 UCS2 utf-16 )进行编码,最多可以发 140/2 70 个汉字。

UniCode 编码转换也比较简单,以中文为例,一个中文字符是两个字节,直接对高位字节和低位字节进行十六进制转换就可以了。如“欢迎”, UniCode 编码是 6B22 8FCE ,这同时也就是转换的结果,如果发送的串中有英文字符,那么在前面补全 00 以保证一个字符对应两个字节。

 

4、PDU 串的用户信息 (TP-UD) 段最大容量是 140 字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是 160 、 140 和 70 。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。

 

三、地址编码

短信发送中都会涉及到短信地址的问题,他们的编码规则是一致的 , 简单来说就是 BCD8421码编码。

如: 08 91  6808501505F0

08 :地址长度,(号码类型 + 号码长度) /2 的十六进制表示

91 :号码类型

683108501505F0 :号码,实际号码应为: +8613805515500 ,号码处理方法为 , 如果为 +86 开始 , + 号去掉 , 然后判断是否为偶数 , 不是在末尾补 F, 然后将奇数位和偶数位互换

 

四、编码示例

1、发送信息的 PDU 串:

用手机写一条短信息,发送手机号码为 13605696031 ,信息内容为“ Hello World! ”。通过执行 AT CMGL=2 可以读出此条信息。

 

AT+CMGL=2 {读未发短信息} +CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量} 08 91 683108501505F0 11 00 0B 81 3106656930F1 0000FF 0B E8329BFD06DDDF723619 OK

 

下面分析这条信息:

08

短信息中心地址长度。(短信息中心号码类型 + 短信息中心号码长度 /2 的十六进制表示)

91

短信息中心号码类型, 91 TON/NPI TON/NPI 遵守 International/E.164 标准,指在号码前需加‘+’号 ; 此外还可有其他数值,但 91 最常用。

683108501505F0

短信息中心号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为: 8613805515500( 字母 F 意指长度减 1), 这是作者所在地 GSM 短信息中心的号码。 ( 号码处理方法为 , 如果为 +86 开始 , + 号去掉 , 然后判断是否为偶数 ,不是在末尾补 F, 然后将奇数位和偶数位互换 )

11

文件头字节 (header byte, 是一种 bitmask) 。这里 11 指正常地发送短信息。

00

信息参考号。( TP-MR

0D

被叫号码长度。被叫号码长度的十六进制表示。

81

被叫号码类型。

3106656930F1

被叫号码,也经过了移位处理,实际号码为 13605696031

00

协议标识 (TP-PID),是普通 GSM 类型,点到点方式

00

用户信息编码方式 (TP-DCS), 7-bit 编码( 08 : UCS2 编码)

FF

有效期 (TP-VP),短信的有效时间

0B

短信息长度

E8329BFD06DDDF723619

短信息内容“ Hello World! ”。

 

2、接收信息的 PDU 串

读取以上发送出来的短信,可以收到如下信息 ,

接受到来自 13600554267 的“欢迎PDU 串为: 08 91 683108503705F0 04 0D 91 683106504562F7 00 08 30507080635400 046B228FCE。

对以上的 PDU 串分析如下表

 

含义

说明

08

SMSC 地址信息的长度

共 8 个八位字节 ( 包括 91)

91

SMSC 地址格式 (TON/NPI)

用国际格式号码 ( 在前面加 ‘+’)

683108503705F 0

SMSC 地址

8613800573500 ,补 ‘F’ 凑成偶数个

04

基本参数 (TP-MTI/MMS/RP)

接收,无更多消息,有回复地址,如果为 00 ,就没有以下关于回复地址的三个段

0D

回复地址数字个数

共 13 个十进制数 ( 不包括 91 和 ‘F’)

91

回复地址格式 (TON/NPI)

用国际格式号码 ( 在前面加 ‘+’)

683106504562F 7

回复地址 (TP-RA)

8613600554267 ,补 ‘F’ 凑成偶数个

00

协议标识 (TP-PID)

是普通 GSM 类型,点到点方式

08

用户信息编码方式 (TP-DCS)

UCS2 编码(即中文)

30507080635400

时间戳 (TP-SCTS)

2003-5-7 08:36:45 +8 时区

04

用户信息长度 (TP-UDL)

实际长度 4 个字节

6B228FCE

用户信息 (TP-UD)

“ 欢迎 !”

 

五、接收短消息

一般有两种接模式

1 .AT+CNMI=2,1,0,0,0 接受并存到 SIM 串口接到以下信息: +CMTI:"SM",X AT+CMGR=X回车   (从X存储区读短消息) AT+CMGD=X回车   (从X存储区删除短消息) PDU状态: at+cmgf=0 OK +CMTI: "SM",1 at+cmgr=1 +CMGR: 0,,24 0891683108501705 F0240D91683157805300F50000502082000281000462F11804 OK 文本状态: +CMGR: "REC READ","+86 13750835005",,"05/02/28,0:20:18+00" bbc    OK 2 .AT+CNMI=2,2,0,0,0 接受并直接到串口 串口接受到以下信息: +CMT: "+8613501154105",,"01/09/13,11:04:09+32" AAA   

 

 

附录:关于PDU模式发送短信:

 

      第一,对模块写入 AT+CMGF=0<回车>   的AT命令(<回车> 要用 /r 来实现),之后应该得到一个 OK 响应,才能继续进行下一步;

      第二,对模块写入 AT+CMGS=<length><回车>   的AT命令(其中 <length> 是一个数字,该数字是代表了PDU串中某一部分的长度,这一部分就是指除了SMSC地址之外的那一部分),之后应该得到一个 /r/n> /r/n   响应(特别要注意:/r是回车,/n是换行,>是一个大于号,>后面还有一个空格!),才能继续进行下一步;

      第三,可以开始写入要发送的内容了。这一部分只是PDU串中的一部分,并不是完整的PDU串(如前所述,去掉了SMSC地址那一部分),这一部分要以 Ctrl+Z 结尾,但是我们要知道,在字符串中要带上 Ctrl+Z 的话,必须是用ACSII码。Ctrl+Z的ASCII码是16进制的 1A ,所以你可以在你的字符串后面用strcat函数附加上 "/x1A " 来实现。

这样之后,如果发送成功,你就会收到GSM模块的一个发送成功的响应,形如:

          +CMGS: 246

 

          OK

      如果只有一个“OK”响应,没有类似于“+CMGS: 246”的部分,则并不能发送成功!所以,当你只收到一个 OK 响应的时候,那肯定是哪里出错了。

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CDMA短信是通过CDMA网络传输的短信。CDMA短信格式与GSM的短信格式有所不同。CDMA短信使用PDU格式进行传输。PDU格式是一种将短信数据以二进制形式进行编码和传输的格式。CDMA短信的PDU格式与GSM的PDU格式相差很多,不能直接用肉眼看出来。\[3\] 为了实现长短信的拆分和组合功能,CDMA终端需要支持IS637C协议中关于长短消息处理的参数。其中,HEADER_IND参数用于指示User Data Header是否包含消息头。若包含消息头,则HEADER_IND设置为'1',否则设置为'0'。具体的拆分和组合过程可以参考IS637C或《中国电信CDMA终端需求规范-SMS分册-V1.0》。需要注意的是,一些CDMA模组厂家为了方便用户,会自动处理用户数据头,例如自动加上(1/2)、(2/2)等。如果想要手动解析短信,建议与模组厂家进行沟通确认。\[2\] 总结起来,CDMA短信是通过CDMA网络传输的短信,使用PDU格式进行编码和传输。为了实现长短信的拆分和组合功能,CDMA终端需要支持相应的参数和协议。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [短信猫发送GSM 和 CDMA PDU长短信](https://blog.csdn.net/zhaoxj_2017/article/details/94450749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CDMA SMS pdu解码](https://blog.csdn.net/zx249388847/article/details/52607862)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值