一、直接使用 PDU格式编码:
1、编码:
使用GSM/GPRS AT指令发送中文短信,汉字时,需要先将短信内容编码成PDU格式,然后通过AT+CMGS AT+CMGW等指令发送。
在线PDU格式编码/解码工具 http://www.multisilicon.com/_a/blog/a22201774~/pdu.htm
输入自己的发送方与接收方的号码,并输入短信内容,然后转换,我们可以看到转换出PDU编码的消息。
2、发送:
然后输入命令设置:
AT+CMGF=0 <回车>
OK
AT+CSCS="GSM" <回车>
OK
AT+CMGS=27 <回车> (AT+CMGW等价于AT+CMGS)
OK
用SecureCRT打开串口操作(在串口调试助手中可输入1A发送,因为在串口调试助手用ctrl+z会被windows捕捉):
出现“ > ”后可在后面输入:
输入刚才我们转好的PDU模式的信息内容:
用ctrl+z结束(发送):
二、TexT模式转换成PDU模式:
上面的方法是输入号码以及内容后直接转换成PDU模式,而我们接下来是来看看这个过程是怎么样实现的。
发送短消息常用Text和PDU(Protocol Data Unit,协议数据单元)模式。使用Text模式收发短信代码简单,实现起来十分容易,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。PDU模式收发短信可以使用3种编码:7-bit、8-bit和UCS2编码。7-bit编码用于发送普通的ASCII字符,8-bit编码通常用于发送数据消息,UCS2编码用于发送Unicode字符。一般的PDU编码由A B C D E F G H I J K L M十三项组成。
- A:短信息中心地址长度,2位十六进制数(1字节)。
- B:短信息中心号码类型,2位十六进制数。
- C:短信息中心号码,B+C的长度将由A中的数据决定。
- D:文件头字节,2位十六进制数。
- E:信息类型,2位十六进制数。
- F:被叫号码长度,2位十六进制数。
- G:被叫号码类型,2位十六进制数,取值同B。
- H:被叫号码,长度由F中的数据决定。
- I:协议标识,2位十六进制数。
- J:数据编码方案,2位十六进制数。
- K:有效期,2位十六进制数。
- L:用户数据长度,2位十六进制数。
- M:用户数据,其长度由L中的数据决定。J中设定采用UCS2编码,这里是中英文的Unicode字符。
实例:
我的号码: +8613429853402
接收方号码:+8615608656526
短信内容:胖子,吃饭没
1、对我的号码处理:
1、去掉“+”为奇数,加F: 8613429853402F
2、交换奇偶位: 683124893504F2
3、前面加91(国际化): 91683124893504F2
4、因为加了 86、F 、91 所以一共有11+5=16个数 用它的长度除以 2 -> 16 / 2 = 8 => "08"
5、08加在91前面: 089168 3124893504F2
总结 : 089168+号码加F后奇数偶数为调换
2、接收方号码进行处理:
去掉“+”号后为奇数,直接加在最后加F后,交换奇数偶数位:
685106686525F6
3、短信处理:
转字符串转换为Unicode代码。每个汉字以及符号都有固定的Unicode代码。用相应的转换器转换。
在线转换:http://www.cnblogs.com/mq0036/p/4007452.html
去掉“/u”。
每个字符代码都是4位。
胖子,吃饭没 --> 80d6 5b50 ff0c 5403 996d 6ca1 (加上逗号,一共24位)
胖 子 , 吃 饭 没
24/2 --> 12 ( 0C )
把0C加在前面: msg= 0C80d6 5b50 ff0c 5403 996d 6ca1
4、组合:
(1)接收方手机号码前加上字符串 11000D91(1100:固定,0D:手机号码的长度,不算+号,十六进制表示,91:发送到手机为91,发送到小灵通为81)
X= 11000D91 685106686525F6
(2)接收方手机号码后加上 0008AA 和刚才的短信息内容:
Y= X + 0008AA + msg
11000D91 685106686525F60008AA 0C80d65b50ff0c5403996d6ca1 (一共54位)
(3)计算 CMGS = 54 /2 =26
(4)最终代码:message = 发送方号码 + Y
089168 3124893504F2 11000D91 685106686525F6 0008AA 0C80d65b50ff0c5403996d6ca1 (空格只是为了便于观察,发送时需去掉)
发送方 接收方 短信内容
五、发送:
AT+CMGF=0 <回车> <换行>
OK
AT+CSCS="GSM"
OK
AT+CMGS=27 <回车> <换行>
OK
> 0891683124893504F211000D91685106686525F60008AA0C80d65b50ff0c5403996d6ca1 ( ctrl+z )