关键词 GSM;SMS;AT命令;PDU
2007年全国手机短信发送量达到5921亿条,日均发送量超过16亿条。短信的应用也扩展到各个领域,本文介绍了多媒体电话短消息发送模块的实现原理和具体的实现方法。由短消息发送流程可以了解短信息发送过程的每一个环节,对短信息安全,屏蔽垃圾短信有一定的作用。
GSM(Global System for Mobile communication)系统是目前基于时分多址技术的移动通讯体制中比较成熟、完善、应用最广泛的一种系统。目前已建成的覆盖全国的GSM数字蜂窝移动通信网,是我国公众移动通信网的主要方式,主要提供话音、短信息、数据等多种业务。基于GSM短消息功能可以做成传输各种检测、监控数据信号和控制命令的数据通信系统,能广泛用于远程监控、定位导航、个人通信终端等。由于公众GSM网络在全球范围内实现了联网和漫游,建立上述系统不需再组建专用通信网络,所以具有实时传输数据功能的短消息应用将得到迅速普及。
SMS是由Etsi所制定的一个规范(GSM 03.40 和 GSM 03.38)。它可以发送最多160个字符,当使用7-bits编码的时候,8-bit编码(最多140个字符)通常无法直接通过手机显示,通常被用来作为数据消息。16-bit信息(最多70个字符)被用来显示Unicode(UCS2)文本信息,可以被大多数的手机所显示。一个以class 0 开头的16-bit的文本信息将在某些手机上作为Flash SMS显示。
GSM模块支持两种方式来发送和接收SMS短信息,文本模式和PDU(Protocol Description Unit)模式,文本模式只能发送普通的Ascill字符,要发送图片,铃声,其它编码的字符(如中文)就必须采用PDU模式。
PDU模式中,可以采用三种编码方式来编码要发送的内容,分别是7bit编码,8bit编码,16bit编码,7bit编码用于发送普通的Ascill字符,8bit编码通常用于发送数据信息,如图片和铃声,而16bit编码用于发送Unicode字符。三种编码可以发送的最大字符分别是160,140,70。
发送中文短信要采用PDU模式的Unicode编码方式,具体步骤描述如下:
(1)GB2321编码到Unicode编码的转换。
● 操作系统提供函数(有些系统不提供,如deltaos)。
● 手动查表。
(2)Unicode编码到16bit编码的转换。
● 得到的Unicode编码后,还需要转换成PDU的16bit编码才可以正确的发送。
●这个转换过程中Unicode编码最开始的0xffff标志要去掉,在0xffff之后的内容才是真正的Unicode字符。
● Unicode是双字节,根据系统如果是小端字节序(little-endian),也就是说,存储的时候,先存低位再存高位,例如:“中”的Unicode编码是0x4E2D,储存的时候是2D4E,在转换到16bit编码的时候要转换顺序,如果是大端字节序(big-endian)如本系统,就不需要转换了。
● 正确计算16bit编码的消息体长度,PDU规范中,包括消息体本身。
● 正确设置TYPE,TP-MR,TP-PID,TP-VP,在下文PDU格式中,依次设置为:11,00,00,08,01(以上都为16进制数)。
(3)形成标准的发送包。
处理器通过向串口发送接收AT命令与GSM模块形成通信回路,通过AT命令实现对GSM模块的基本操作,用于发送短信的AT命令如表1所示。
发送短信可用文本模式和协议数据单元模式(PDU,protocol data unit)。大多手机不支持文本模式,只支持PDU模式。PDU模式是把短信正文经十六进制编码后被传送,其编码总体上分为三个部分:服务中心号、接收方手机号、短信内容,如“你好”短信PDU编码是这样的(其中xyz是手机号具体数字): 0011000B8131258698yxFz000801044F60597D,其意义如表2所示。
表1 发送短信使用的AT命令
AT命令 | 功能 | 例子 |
AT+CMGF | 设置短信的格式,0=PDU模式(默认),1=文本模式 | AT+CMGF=0 |
AT+CSCA | 获取服务中心的号码 | AT+CSCA? |
AT+CMGS | 发送AT+CMGS= YYY ;其中 YYY 为TPDU的十进制长度 | AT+CMGS=19 |
接收到“>” | 响应后发送短信内容 |
表2 发送数据分析
接收号部分 | 短信内容部分 |
00 11 00 0B 8131208698yxFz | 000801 04 4F605970 |
00:SCA以00写入,应用默认的服务中心地址,该服务中心地址用AT+CSCA指令写入 11:PDU类型 00:TP-MR表示MR 消息参考 0B:接收号字符数 81:表示是国内代码 31258698yxFz:接收号 编码时长度为奇数末尾追加“F”每两个字节进行位置交换,即13526889xyz | 00:TP-PID协议标示 08:TP-DCS数据编码方式 01:TP-VP有效期 04:UDL用户数据长度,用十六制表示 4F60597D:短信内容的UNICODE编码 |
如果发送成功,串口返回以下结果:
+CMGS: X这里的X是个数字
OK
1)接口函数_SendMessage()
当调用接口函数_SentMessage(unsigned char *message, unsigned char *telephone, unsigned char telephonetype)时,程序开始进入短信发送模块,流程如图1所示。
图1 SendMessage()函数流程图
2)发送短信主体函数Send_SMS()
完成 _SMS_appUnit结构填写以后,短信发送的内容及所需信息提取到结构_SMS_appUnit中,为下面对数据的处理提供了原始数据,接下来就调用Send_SMS函数,程序流程如图2所示。
图2 Send_SMS()函数流程图
3)数据处理函数MakeSSP()
函数MakeSSP是短信发送部分重要函数,把struct _SMS _appUnit结构中的数据转换成struct _SMS_SUBMIT_PDU结构,形成发送包。
以上详述了短信发送模块实现的步骤,本文内容通过测试。可以实现短信的发送,响应时间等参数符合要求。但如果要连续发送短信,或短信发送量要求比较高的情况还需要设计数据库实现数据的管理。对于短信发送的信息安全问题,将是下一个阶段的研究重点。
[1] SMS with the SMS PDU-mode[M].SiemensAG Version 1.2
[2] AT Command SetSiemens cellular engines version 2.10[S].Siemens AG,2001年
[3] 爱赛德无线小组.GSM模块使用文档(短信部分)[M].杭州:爱赛德无线小组,2002
[4] 杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003