1.1. 基本知识
短信模块开发指通过串口 at 命令驱动短信猫进行短信发送和接收操作。
短信猫操作分为三种模式: block,pdu 和 Text
短信传送有三种编码方式: 7 位, 8 位, UniCode
1.1.1. 相关文档
Gsm03.38 规范: Alphabets and language-specific information 着重介绍短信发送中对字符集的控制部分
Gsm03.40 规范: Technical realization of the Short Message Service (SMS) Point-to-Point (PP) 详细介绍各种不同短信的不同实现
Gsm07.05 规范: Use of Data Terminal Equipment - Data Circuit terminating;Equipment (DTE - DCE) interface for Short Message Service (SMS) and Cell Broadcast Service (CBS) ,介绍 at 的一些控制命令。
Gsm07.07 规范:着重介绍 at 的短信相关命令,可以说是 at 的 sms 规范。
1.1.2. Block 模式
使用Block模式需要手机生产厂家提供驱动支持,现在还没有发现哪个厂家公布支持这种短信发送模式。Block 模式基本已经被 pdu 模式取代。
1.1.3. Text 模式
Text 模式比较简单,但是支持的设备不是很全,而且对于中文似乎有些问题,在金笛的网站技术资料中似乎提到了一句不能实现中文。
AT + CGMF=1<CR>
AT + CGMS= “13605696031” ,129<CR>
>Hello World!<^Z>
1.1.4. Pdu 模式
pdu 编码主要包括两个主要的部分,一是 pdu 短信报头的整体数据格式,分别因为发送信息串和接收信息串而有区别,二是 pdu 中文本部分的编码,分别因为字符集而不同。
PDU 串的用户信息 (TP-UD) 段最大容量是 140 字节,所以在这三种编码方式下,可以发送的短消息的最大字符数分别是 160 、 140 和 70 。这里,将一个英文字母、一个汉字和一个数据字节都视为一个字符。
1.2. SMS 用户数据的编码方法
1.2.1. 英文 7 位编码
这是 gsm 的默认编码方式
由于这样的移位,我们可以看到我们能发的最多英文字符等于: 140*8/7 = 160 。
1.2.2. 数据 8 位编码
8-bit 编码通常用于发送数据消息,比如图片和铃声等;
1.2.3. 中文 pdu 编码
发送中文时,必须用 UCS2 ( utf-16 )进行编码,最多可以发 140/2 = 70 个汉字。
UniCode 编码转换也比较简单,以中文为例,一个中文字符是两个字节,直接对高位字节和低位字节进行十六进制转换就可以了。如“欢迎”, UniCode 编码是 6B22 8FCE ,这同时也就是转换的结果,如果发送的串中有英文字符,那么在前面补全 00 ,以保证一个字符对应两个字节。
1.2.4. Wap-push 中的中文编码
做 wap-push 短信的时候有些问题了,开始的时候也按照 Unicode 编码处理,总是失败,后来才发现,有个编码字段设为了 uft-8 ,所以在这种情况下,还是可以出现其他编码方式的。
1.3. 短信报头分析
1.3.1. 短信类型
详细请参考 gsm 0438 规范和 gsm0440 规范,里面有详细的关于各种短消息类型的描述。
在 sms 中到底支持多少种类型的短信,短信类型由什么进行控制,这是我们在这里需要着重介绍的问题。
在传输层来分,一共有六大短信类型: SMS-DELIVER , SMS-DELIVER-REPORT , SMS-SUBMIT
, SMS-SUBMIT-REPORT , SMS-STATUS-REPORT , SMS-COMMAND ,这六种短信类型,由短信中心地址后的第一个字节的最低两位控制。
也就是说,每个短信在短信中心地址之后的第一个字节的最低两位是至关重要的。他决定了如何读这条短信(结合是发送的,还是接收的)
bit1
|
bit0
|
Message type
|
0
|
0
|
SMS-DELIVER (in the direction SC to MS)
|
0
|
0
|
SMS-DELIVER REPORT (in the direction MS to SC)
|
1
|
0
|
|