原创 GPRS模块短消息发送方法

2009-5-13 19:04 7141 9 19 分类: 通信

最近做了一个GPRS模块的简单测试,其中短消息方式比较简单,同时也与其他GPRS模块通用,现在将我的调试笔记写下来。


短消息方式:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


一、与短信相关的 AT 指令


AT+CMGC   Send  an  SMS  command(发出一条短消息命令)    


AT+CMGD   Delete  SMS  message(删除 SIM 卡内存的短消息)    


AT+CMGF   Select  SMS  message  formate (选择短消息信息收发格式: 0-PDU;1-文本) 


AT+CMGL   List  SMS  message  from  preferred  store(列出 SIM 卡中的短消息


AT+CMGR   Read  SMS  message(读短消息)    


AT+CMGS   Send  SMS  message(发送短消息)    


AT+CMGW   Write  SMS  message  to  memory(向 SIM 内存中写入待发的短消息)


AT+CMSS   Send  SMS  message  from  storage(从 SIN  |M 内存中发送短消息)


AT+CNMI   New  SMS  message  indications(显示新收到的短消息)    


AT+CPMS   Preferred  SMS  message  storage(选择短消息内存)    


AT+CSCA   SMS  service  center  address(短消息中心地址)    


AT+CSCB   Select  cell  broadcast  messages(选择蜂窝广播消息)   


AT+CSMP   Set  SMS  text  mode  parameters(设置短消息文本模式参数)


AT+CSMS   Select  Message  Service(选择短消息服务)


发送短消息有两种方式:PDUTEXT 模式


二、 PDU 模式下发送中英文短消息


AT+CMGF=0                           //首先将短信息格式设为PDU 模式


AT+CSCS=UCS<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2          //设置字符格式为UCS2 模式


AT+CSCA=+86138XXXXXXXX”,145              //设置短消息服务中心地址


注:对于中国移动的短信服务中心号是+861380xxxx500,其中xxxx是你所在的长途电话区号,不足4位就补0,比如我所在的北京是010,补0后是0100,就应该+8613800100500


[PDU]数据单元格式定义为:


以下例子发送“你好”到13912345678


发送数据是:你好


Unicode译码为:4F60597D


AT+CMGS=019 //15PDU 规约头固定长度 15 字节)+4(报文长度 4 个字节)


> 0011000D91683119325476F8000801044F60597D [ctrl-Z]


00       //SCA预留


11       // FO 设置PDU 类型


00       // MR 发送参考号


0D       //DA 目的号码长度


91       //DA 目的号码类型


68       //DA 中国的区号


3119325476F8   //DA 目的号码编码


00       // PID 发送方式


08       //DCS 编码模式


01       //VP 有效期


PDU 中用户数据前的PDU 头的长度是15 字节


04       //UDL 数据长度


4F60597D    //UD 数据内容Unicode 译码


例子中目的号码是一种内存编码方式,将每两位数据位置互换,余下最后单位的补 F ,如13912345678 编码为3119325476F8。用户使用PDU 模式发送中文短消息时只需按照上述例子,改变 TPDU 的十进制长度、手机号码编码、报文长度和报文内容Unicode 译码即可。


设置DCS 编码模式改变短消息发送等级:


按照GSM08.38 协议约定,PDU 中的DCS 字段(Bit70)用于设置短消息内容的编码方式 和发送等级, 具体为Bit4 用于决定Bit1 Bit0 的设置是否有效 1 为有效, 0 为无效) Bit1Bit0 均设置为0 表示短消息发送等级为0 等级, 即直接发送至终端而不存放在SIM卡; Bit3 设置为 1 Bit2 设置为 0 表示短消息内容为 UCS2 编码。上例中 DCS 字段为 08,即表示短消息内容为 UCS2 编码且无发送等级;若改为 18 则表示短消息内容为 UCS2 编码且按0 等级发送,即直接发送至目的终端。


三、TEXT 模式发送短消息


       TEXT模式只支持传送英文及数字信息,但它的编码要比PDU模式简单很多,所以建议采用TXET模式发送和接受短消息。


1TEXT模式下发送中文短消息


AT+CMGF=1                   //首先将短信息格式设为 TEXT 模式


AT+CSCS=UCS2    //设置字符格式为UCS2 模式:


AT+CSCA=+86138XXXXXXXX”,145      //设置短消息服务中心地址


注:对于中国移动的短信服务中心号是+861380xxxx500,其中xxxx是你所在的长途电话区号,不足4位就补0,比如我所在的北京是010,补0后是0100,就应该+8613800100500


AT+CSMP=17167024  //设置短消息发送相关参数:四参数分别为 FOVPPID DCS,代表意义与 PDU 模式中参数相同,不同的是须以十进制表示,24 表示短消息内容为 UCS2 编码且直接发送至目的终端,如改为 25 则表示短消息内容为 UCS2 编码且发送至SIM 卡存储。


发送:AT+CMGS= 手机号码编码[CR]


收到[>]响应后再发送


[报文内容Unicode 译码][ctrl-Z]


以下例子发送“你好”到13912345678


发送数据是:你好


Unicode译码为:4F60597D


AT+CMGS= 00310033003900310032003300340035003600370038 //直接输入手机号码编码


> 4F60597D [ctrl-Z]


用户使用TEXT 模式发送中文短消息时只需按照上述例子,改变手机号码编码和报文内容的Unicode 译码即可。


2TEXT模式下发送英文短消息


AT+CMGF=1                   //首先将短信息格式设为 TEXT 模式


AT+CSCS=GSM      //设置字符格式为GSM 模式


AT+CSCA=+86138XXXXXXXX”,145       //设置短消息服务中心地址


注:对于中国移动的短信服务中心号是+861380xxxx500,其中xxxx是你所在的长途电话区号,不足4位就补0,比如我所在的北京是010,补0后是0100,就应该+8613800100500


AT+CSMP=171670240            //设置短消息发送相关参数:四参数分别为 FOVPPID DCS,代表意义与PDU 模式中参数相同,不同的是须以十进制表示,240 表示短消息内容为默认 GSM 编码且直接发送至目的终端,如改为 241 则表示短消息内容为 GSM 编码且发送至SIM 卡存储。


发送:AT+CMGS= 13XXXXXXXXX [CR]


收到[>]响应后再发送


[报文内容][ctrl-Z]


以下例子发送“Hello”到13912345678


报文是:Hello


AT+CMGS= 13912345678 //直接输入手机号码


> Hello [ctrl-Z]


使用TEXT 模式发送英文短消息时只需按照上述例子,改变手机号码和报文内容即可。


以上为如何发送短信的方法,那又如何接受刚收到的短消息呢?接受刚收到的短消息有两种方法:查询终端方式和使用事件方式。查询方式是先不处理网络上发来的信息,定期使用“AT+CMGL=0命令读取未读取的短信,如果有就读入,交给上级程序处理。然后将此短消息删除,该方法简单,但许多时候都在做无用功,效率低下。实际中我们使用事件方式,通过AT+CNMI指令设置接收到的短信息存储到SIM卡,并返回提示信息。


 


短消息类(class)的概念:根据指定储存的位置,短消息分为class 0 – 3四个类。也可以不指定类(no class),由ME按默认设置进行处理,存储到内存或者SIM卡中。在TPDUTP-DCS字节中,当bit7-bit400x1, 01x1, 1111时,bit1-bit0指出消息所属类:


00 – class 0:只显示,不储存
01 – class 1
:储存在ME内存中
02 – class 2
:储存在SIM卡中
03 – class 3
:直接传输到TE
GSM Modem
一般都支持一条“AT+CNMI”指令,可用于设定当有某类短消息到达时,如何处置它:只储存在指定的内存(易失的/非易失的)中,先储存后通知TE,还是直接转发到TE,等等。


 


"AT+CNMI"指令语法为


AT+CNMI=[<mode>[,<mt>[,<bm>[,<ds>[,<bfr>]]]]]


mode - 通知方式:


  0 – 不通知TE


  1 – 只在数据线空闲的情况下,通知TE;否则不通知TE


  2 – 通知TE。在数据线被占用的情况下,先缓冲起来,待数据线空闲,再行通知。


  3 – 通知TE。在数据线被占用的情况下,通知混合在数据中一起传输。


mt - 消息储存或直接转发到TE


  0 – 储存到默认的内存位置(包括class 3)


  1 – 储存到默认的内存位置,并且向TE发出通知(包括class 3)


  2 – 对于class 2,储存到SIM卡,并且向TE发出通知;对于其它class,直接将消息转发到 TE


  3 – 对于class 3,直接将消息转发到 TE;对于其它class,同mt=1


bm, ds, bfr的含义,请参考相关标准文档。一般不需要去关心它们。


在程序中具体实现时,使用mode=2, mt="1",即AT+CNMI=2,1,0,0,0:比较简单。对所有类型的短消息,只要在收到ME送来的"+CMTI"通知后,用"AT+CMGR"指令读取消息内容就行了。


举例如下:


蓝色表示PC机发送的数据红色表示模块返回的数据


AT+CMGF=1                                  //设置短消息格式为TEXT格式


OK


AT+CCS=”CSM”                            //设置字符格式为GSM模式


OK


AT+CSCA=”+8613800100500”,145     //设置短消息服务中心地址


OK


AT+CNMI=2,1,0,0,0                       //设置收到新短信存于SIM卡中并发CMTI通知


OK


 


+CMTI:”SM”,1             //收到了短信,自动弹出,其中1表示存在SIM中的序号


AT+CMGR=1                                  //读取短信,其中1要与上面序号对应


+CMGR:”REC UNREAD”,”8615810533873”,,”09/04/30,10:59:17+32”,145,36,0,0”8613800100500”,145,5


ABCD                               //收到来自手机15810533873的短信,内容为ABCD


 


OK


AT+CMGD=1                   //删除短信,其中1为短信序号


OK

PARTNER CONTENT

文章评论10条评论)

登录后参与讨论

用户1358589 2009-6-17 11:02

我有GPRS模块,美国MOTO的,性能稳定,价格超值,尺寸小(28*24.3.0MM) 有需要的可以联系:0755-33631360,马生

用户227337 2009-5-13 22:20

想请教楼主一个问题哈(本人外行) 问题: 英文输入状态下,在(PC上)编辑短信时,[]\{}| 这六个符号输入时,输入一个符号,短消息计数+2,也就是说,每个符号记为2个字符,这是正常的吗?中文输入状态下为1个字符,楼主能否给我讲解下哈,谢谢啦~~ 可以联系QQ:371236473

用户738303 2009-5-13 19:05

楼上的真是细心,现在改过来了

用户1321768 2009-5-13 16:02

呵呵,所以你那个码应该是00310033003900310032003300340035003600370038,你看看和你原来的比是少了点东西吧。而且我试过了,运用你上面给出的方法不能发短信,因为at+cscs这条指令无法设置成UCS2编码,只能为"GSM","PCCP437","CUSTOM","HEX"四种之一,可能GSM和GPRS模块确实不同。

用户738303 2009-5-13 15:13

这种方式是采用四位十六进制Unicode编码方式, ASCII码1所对应的十进制是49,十六进制为31,因为不足四位,所以在前面补两个0,结果就是0031

用户1321768 2009-5-13 08:49

那我不明白0031003300390032003300340035003600370038代表了手机号为13912345678,那手机号中的那个1是如何体现的?也就是这种表示手机号码的方式我不太明白。

用户738303 2009-5-12 14:59

AT+CMGS=” 0031003300390032003300340035003600370038”中间没有少位啊,对应手机号码13912345678。unicode编码和数字,汉字的之间的转换可以在word里用Alt+x实现。 至于你提的在TEXT模式下传送的汉字的unicode编码能被对方手机不当成英文字母识别吗?这个我只试了两个模块之间通信,向手机上发送能否识别你可以试一下,试了别忘了告诉我,互相交流嘛!

用户1321768 2009-5-10 14:16

我最近在研究用单片机控制GSM模块。请问在TEXT模式下传送的汉字的unicode编码能被对方手机不当成英文字母识别?你举得例子AT+CMGS=” 0031003300390032003300340035003600370038”中间是不是少了一位?

用户738303 2009-5-8 10:55

GPRS模块有TCP/IP通讯方式和短消息方式,我说的是短消息方式,短消息方式的AT命令是通用的。TCP/IP方式的AT当然是不一样的。

tengjingshu_112148725 2009-5-8 08:49

不同GPRS模块的AT命令是不一样的
相关推荐阅读
用户738303 2009-05-07 15:48
AT91SAM9260的bootstrap(包括norflash)
公司的一个项目用AT91SAM9260的ARM,从百特买了一个AT91SAM9260的开发板,上面有一个norflash,但没有焊。公司要求用norflash,结果却发现开发板资料中并没有norfla...
用户738303 2008-12-30 21:04
AT91SAM9260学习——用WINARM编译bootstrap
一、下载安装WinARM编译工具(winarm.rar文件)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:o...
用户738303 2008-11-11 16:19
89C51控制ZY12864D点阵液晶显示数字
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />图1所示是<?xml:name...
用户738303 2008-11-06 15:52
虚拟机下Linux和windows的文件共享――共享方式
本人使用的是vmware workstation6.0绿色版,Linux为Redhat Linux9.0。首先在虚拟机下设置windows的共享文件,然后安装vmware tools实现共享。<...
用户738303 2008-10-25 16:56
MCS51的LED1602液晶显示控制电路及程序
图1所示是80C51单片机与LED1602的接口电路。其中,74HC573作为地址锁存器。LED1602的D0~D7为8位双向数据线;RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器;R/...
EE直播间
更多
我要评论
10
9
关闭 站长推荐上一条 /3 下一条