关于短信收发 的at指令方面的资料

关于使用GSM MODEM设备利用AT指令处理短信的方法,网上有很多相关的内容,我也是遍览各家所长,再加上自己的实际试验、应用,在前人的基础上做下总结,添加点自己经验。也有很多问题还未解决,期望高手可以指点一二。

一、硬件接口

    偶使用的是西门子TC35iGSM无线通信控制终端,具备GSM无线通信的全部功能,支持GSM07.05、GSM07.07所定义的的AT指令集。通过串口与计算机相连。

二、参数设置

    1、短信收发模式设置

  短消息的发送和接收控制模式有三种:Block模式、PDU模式和Text模式。使用Block模式需要手机生产厂家提供驱动支持。目前,PDU模式已取代Block模式,而Text模式不支持中文。因此,为了系统的通用性,兼容中英文短消息的发送接收,建议使用PDU模式来处理短消息。

    应设置:AT+CMGF=0 //PDU方式

    2、新信息处理方式设置

     AT+CNMI=2,2,0,1,1 //新收到的短信直接发送至TE终端,不存储在SM卡中

    3、回显设置

     ATE1 //有回显,方便测试

    4、消息服务设置

    AT+CSMS=0 //如果AT+CSMS=1,接收到短信时,TE需在一定的时间内发送反馈消息至模 块;若超时,<mode>和<mt>的值会强制复位到0。那么,再有新的短信将不能被正确处理,需要用"AT+CNMI”指令重新设置参数才行。这增加了程序处理的复杂性。AT+CSMS=0时,省去了这些麻烦。

三、短信发送

以要将“你好”发送到13752141860,信息中心号码为:+8613800220500为例:

    1、PDU数据格式分析

      应发送的PDU字符串为:

     0891683108200205F031000D91683157121468F00008AA044F60597D

     下面对这段PDU数据进行详细分析:

  (1)08 //信息中心号码的长度,将91+683108200205F0的长度除2,格式化成2位的16进制字符串所得

    (2)91 //短信中心号码类型'91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号

       91—10010001 //每一位数字转换为4位二进制数

            1
           001 //数值类型(Type of Number):000—未知,001—国际,010—国内,111—留作扩展;
           0001//号码鉴别(Numbering plan identification):0000—未知,0001—ISDN/电话号码(E.164/E.163),1111—留作扩展;

    (3)683108200205F0 //短信息中心号码

       转换方法:如果号码前面有+号,去掉“+”号→如果没有“86”,在号码前加上“86”:8613800220500→看看现在号码的长度是否为偶数,如果不是,在号码后面加上“F”:8613800220500F→将奇数位和偶数位交换,得到结果:683108200205F0

    (4)31 //TPDU头字节

       31&h=00110001&b //每一位数字转换为4位二进制数

             0 //应答路径—TP-RP(TP-Reply-Path):0—不设置; 1—设置

            0 //用户数据头标识—TP-UDHL(TP-User-Data-Header-Indicator):0—不含任何头信息; 1—含头信息       

            1 //状态报告要求—TP-SPR(TP-Status-Report-Request):0—不需要报告; 1—需要报告(有些地方写0为需要报告,经偶测试是错误的)

            10 //有效期格式—TP-VPF(TP-Validity-Period-Format):00—不提供(Not present); 10—整型(标准);01—预留; 11—提供8位字节的一半(Semi-Octet Represented)

             0 //拒绝复制—TP-RD(TP-Reject-Duplicates):0—接受复制; 1—拒绝复制

            01 //信息类型提示—TP-MTI(TP-Message-Type-Indicator):00—读出(Deliver); 01—提交(Submit)

    (5)00 //信息类型

     (6)0D //被叫号码长度,8613752141860的长度格式化为2位16进制所得

     (7)91 //短信中心号码类型'91是TON/NPI遵守International/E.164标准,指在号码前需加‘+’号,小灵通为81

     (8)683157121468F0 //被叫号码,转换方法同(3)

     (9)00 //协议标识 TP—PID

       00--00000000 //每一位转换为4位二进制数

           00    //Bit No.7与Bit No.6: 00—如下面定义的分配Bit No.0—Bit No.5;01—参见GSM03.40协议标识完全定义;10—预留;11—为服务中心(SC)特殊用途分配Bit No.0—Bit No.5。 一般将这两位置为00。
           0     //Bit No.5:0—不使用远程网络,只是短消息设备之间的协议;1—使用远程网络。
           00000 //Bit No.0—Bits No.4:00000—隐含;00001—电传;00010—group 3 telefax;00100—语音;00101—欧洲无线信息系统(ERMES);00110—国内系统;10001—任何基于X.400的公用信息处理系统;10010—Email。

     (10)08 //数据编码方案,08:中文编码,00为英文或数字,Bit No.7与Bit No.6.Bit No.7的编码解码比较复杂,建议在发送纯英文或数字的短信时仍使用中文编码,测试通过.

       08--00001000

           00 //Bit No.7与Bit No.6 :一般设置为00;

           0 //Bit No.5:0—文本未压缩,1—文本用GSM标准压缩算法压缩;

           0 //Bit No.4:0—表示Bit No.1、Bit No.0为保留位,不含信息类型信息,1—表示Bit No.1、Bit No.0含有信息类型信息;

           00 //Bit No.3与Bit No.2:00—默认的字母表,01—8bit,10—USC2(16bit),11—预留;

           00 //Bit No.1与Bit No.0:00—Class 0,01—Class 1,10—Class 2(SIM卡特定信息),11—Class 3。

    (11)AA //有效期TP-VP(TP-Valid-Period),16进制数

   AA表示短信息被保留的时间为4天,其计算方法依照表3。

VP值(10进制数)

短消息有效长度

0~143

(VP+1)×5分钟

144~167

12时+(VP-143)×30分

168~196

1天×(VP-166)

197~255

1周×(VP-192)

 

    (12)04 //用户数据长度TP-UDL(TP-User-Data-Length),4F60597D的长度除2格式化为2位16进制数所得

    (13)4F60597D //用户数据TP-UD(TP-User-Data),这个就是我们发送的内容"你好"的UniCode码了

       在PDU模式中,发送普通的ASCII字符用7-bit编码方式,将一串7-bit字符编码为8-bit数据,每8个字符可压缩成7个。如果发送中文字符,则采用UCS2编码方式,每个中文字符用16位的Unicode字符表示.将字符串转换为UniCode码的过程网上有很多,这里提供DELPHI下的编码函数:

***********************************************************

function Thread_Smsg.str_Gb2UniCode(text:string):String;
var
i,j,len:Integer;
cur:Integer;
t:String;
ws:WideString;
begin
Result:='';
ws:=text;
len:=Length(ws);
i:=1;
j:=0;
while i<=len do
begin
     cur:=ord(ws[i]);
     FmtStr(t,'%4.4X',[cur]); //BCD转换
   Result:=Result+t;
   inc(i);
   //移位计数达到7位的特别处理
   j:=(j+1)mod 7;
end;
end;

***********************************************************

 

    2、发送短信

        做好了要发送的PDU数据包以后终于可以开始发送短信了。

首先发送AT,GSM回答OK,表明建立连接成功,可以测试各类AT指令;

接着发送AT+CMGS=17,17是指将PDU数据中短信中心号码后面的字符串(本例中即为31000D91683157121468F00008AA044F60597D)的长度除以2,格式化为2位的十进制数;最大长度为164,测试过165以上就会返回ERROR。

但是这里有个问题,70个汉字编辑成PDU后长度是155,但是这140个字符是汉字和字母数字的组合,长度就有可能超过164,因为每一位的数字或字母也被转为4位的UNICODE码。

发送长度后,GSM会返回>,然后我们发送刚才编辑的PDU字符串:0891683108200205F031000D91683157121468F00008AA044F60597D以CTRL+Z结束;

如果GSM返回:就表示发送成功了。

        +CMGS: 183 //183是发送短信时产生的顺序号,在对方接收到短信发回状态报告时候,状态报告中会包含此顺序号

        OK

       

这里需要注意的是手机返回OK只能确认是成功发送到GSM网络上,接收方是否真正收到短信需要通过发送报告得知。有关如何获得发送报告在“发送报告的PDU数据分析”中有说明。

四、短信接收

    1、接收中文短信

    以接收13752141860 号码发送来的“你好”,信息中心号码为:+8613800220500为例,手机接收到字符串为:

+CMT: ,24

0891683108200205F0240D91683157121468F0000860800331220000044F60597D

其中+CMT表示新短信指示代码格式为收到短消息立即显示;若+CMTI则指示收到短消息存储到存储器里;是否直接显示是通过CNMI设置的;

24表示PDU数据中短信中心号码后面的字符串长度/2,即240D91683157121468F0000860800331220000044F60597D的长度除以2;

下面分析一下接收到的PDU数据:

(1)08 //信息中心号码的长度,将91+683108200205F0的长度除2,格式化成2位的16进制字符串所得

(2)91 //短信中心号码类型

(3)683108200205F0 //短信中心号码,转换方法前面有提到

(4)24 //TPDU头字节

(5)0D //发送源号码长度,8613752141860的长度格式化为2位16进制所得

(6)91 //发送源号码类型

(7)683157121468F0 //发送源号码

(8)00 //协议标识 TP—PID

(9)08 //数据编码方案,08:中文编码,00为英文或数字,Bit No.7与Bit No.6

(10)608003312200 //日期时间,奇偶互换:06-08-30 13:22:00,有论坛上写接收到的是026080……就是前面有’02’,表示2006-08…但是我用不同的手机发送短信过来接收到的都是06,无法取得2006,不知道是发送方手机设置的问题还是哪里的问题,还在研究中.

(11)00 //时区

(12)04 //用户数据长度TP-UDL(TP-User-Data-Length),4F60597D的长度除2格式化为2位16进制数所得

(13) 4F60597D //”你好”的UNICODE码,同样提供一个DELPHI下的解码函数:

2、接收纯英文或数字

上面例子中接收到的是中文短信“你好”,那么当接收到的短信是纯中文或者数字的时候又如何解码呢?

例如接收到13752141860发送的英文短信“hello”,手机接收到的字符串为:

+CMT: ,24

0891683108200205F0240D91683157121468F00000608003416270000461F1980C

前面编码的意义和中文信息相同,这里不再重复,只从红色的00说起:

先前提到了这两位表示数据编码方案,08为中文编码,00为英文或数字,当手机发送普通的ASCII字符即使用7-bit编码方式,说明我们接收到的短信是英文或者数字格式的,而不是中文UNICODE码;

04仍然是用户数据(61F1980C)长度除2格式化为2位10进制数所得,61F1980C就是发送方发送过来的短信息,根据前面的00我们知道这是一段7-bit码,而不再是UNICODE码,7-bit的解码过程很复杂,大体过程是:

将源数据每7个字节分为一组,解码成8个字符。基本自然是:将第n个字节左移n位,再加上前一字节的剩余数据,即第(n-1)个字节右移(8-n)位的数值,屏幕最高位,即得到一目标字符数据,n=0…6。第7个字节右移1位就得到解码后的第8个字符数据。

五、串口通讯

知道了如何发送短信和如何解码收到的短信,关键的问题是在实际开发中怎样向GSM MODEM发送AT指令以及获取GSM MODEM接收到的信息呢?这就需要使用串口通讯控件,由于DELPHI没有提供此类控件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值