GPRS用AT命令发送中文短信(TEXT模式到PDU模式的转换)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qicheng777/article/details/72057114
一、直接使用 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代码。用相应的转换器转换。



     去掉“/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 )
 


展开阅读全文

没有更多推荐了,返回首页