引 言
GSM数字蜂窝移动通信技术已得到成熟而广泛的应用,目前已建成的覆盖全国的GSM数字蜂窝移动通信网,是我国公众移动通信网的重要方式。它能提供话音、短消息、数据等多种业务。短消息服务是GSM网络的一项重要业务,在远距离监控、数据采集、GPS定位、无线报警、缴费通知、车辆调度等领域有着广泛的应用。
GSM模块通常都提供UART串行接口,因此很容易和单片机在物理层上互联。使用符合GSM07.05和GSM07.07标准的AT指令集,可以使GSM模块方便地完成短消息接收/发送等各种操作。其通信框图如图1所示。
移动设备ME主要负责与GSM网络进行无线通信,终端适配器TA负责ME与外部终端设备TE的信息交换,AT指令就是在TA与TE之间传送的。TE可以是PC,或者是单片机系统,通过AT指令与ME进行信息交互。现在市场上的GSM模块,如TC35、FALCOM等,都把ME和TA集成在一起,这样整个通信就变成了TE与GSM模块之间的通信了。
一般地,GSM模块在处理短消息时,采用一问一答的信息交互方式,这比较符合AT指令集的精神。但在实际应用中,发现这种方法存在一定的缺点:模块接收到短消息并存储起来,用户再用查询方式,发送指令“AT+CMGL”或“AT+CMGR”,使短信传送到TE,这中间会有一定的延时。另外,由于SIM卡容量有限,要保证短消息及时准确地接收,还要经常删除SIM卡中的短消息,这样多次的读写操作,势必会影响SIM卡的寿命。因此,有必要进行一些软件设置,使短消息不通过SIM卡,而直接发送至终端设备。本文给出一种在嵌入式系统中实时处理短消息的实现方法,当移动设备GSM模块接收到短消息时,直接将消息转发到终端设备,提高系统的响应速度和处理效率。
1 硬件接口实现
一般,GSM无线通信控制终端采用标准的GSM模块进行二次开发,目前市场上很多,如TC35、FALCOM、WISM03等。它们都具备GSM无线通信的全部功能,支持GSM07.05,GSM07.07所定义的AT指令集。在本设计中,采用的GSM通信模块为FALCOMC2D,单片机使用的是Atmel公司的高速8位处理器AT-megal28。ATmegal28内集成有4 KB的RAM,4 KB的EEPROM,128 KB的Flash,以及2个UART串行接口等。其高速和大容量RAM的特性,为处理短消息这样的大数据包提供了便利;同时,节省了外围器件,使得硬件结构简化,提高系统可靠性。中文液晶屏用来显示接收到的中英文短信。系统的硬件接口框图如图2所示。
2 系统参数设置
短消息的发送和接收控制模式有三种:Block模式、PDU模式和Text模式。使用Block模式需要手机生产厂家提供驱动支持。目前,PDU模式已取代Block模式,而
Text模式不支持中文。因此,为了系统的通用性,兼容中英文短消息的发送接收,本系统使用PDU模式来处理短消息。
在进行系统设置前,先简要说明一下短消息类(class)的概念:根据指定存储的位置,短消息分为classO~3四个类,也可以不指定类别(no class),由移动设备按默认设置进行处理,存储到内存或者SIM卡中。在TPDU的TP-DCS字节中,当bit7~bit4为00xl、1111时,bit1~bit0指示消息所属类。
00——ctass O,可直接显示。
01——class 1,默认储存在ME内存中。
02——class 2,储存在SIM卡中。
03——class 3,可直接传输到终端设备TE。
默认的短消息存在SIM卡中,无类别的短消息通常也存在SIM卡中。
GSM Modem一般都支持一条“AT+CNMI”指令,用于设定当有某类短消息到达时,如何处理它——只储存在指定的内存(易失的/非易失的)中;先储存后通知TE;直接转发到TE,等等。
“AT+CNMI'’指令语法为:
AT+CNMI=<mode>,<mt>,<bm>,<ds>,<bfr>
①<mode>控制通知TE的方式。
O——先将通知缓存起来,再按照<mt>的值进行发送。
l——在数据线空闲的情况下,通知TE,否则,不通知TE。
2——数据线空闲时,直接通知TE;否则先将通知缓存起来,待数据线空闲时再行发送。
3——直接通知TE。在数据线被占用的情况下,通知TE的消息将混合在数据中一起传输。
②<mt>设置短消息存储和通知TE的内容。
O——接收的短消息储存到默认的内存位置(包括class 3),不通知TE。
1——接收的短消息储存到默认的内存位置,并且向TE发出通知(包括class3)。通知的形式为:
+CMTI:”SM”,<index>
2——对于class 2短消息,储存到SIM卡,并且向TE发出通知;对于其他class,直接将短消息转发到TE:
+CMT:[<alpha>],<length><CR><LF><pdu>(PDU模式)或者+CMT:<oa>,[<alpha>,]<scts>[,<tooa>,<fo>,<pid>,<dcs>,<sca>,<tosca>,<length>]<CR><LF><data>(text模式)
3——对于class 3短消息,直接转发到TE,同<mt>=2;对于其他class,同<mt>=l。
③bm、ds、bfr的含义,请参考相关标准文档。一般不需要去关心它们,设置为0即可。
综合以上分析,若使短消息不经过SIM卡,直接发送至TE,可以设置:
AT+CNMI=2,2,0,0,0
但是这样还有一个问题,对于class 2的短信,还是会存入SIM卡中,并发送+CMTI:”SM”,<index>。那么,接收程序需要处理短信通知和内容两种情况,增加了复杂性。如果发送方也由程序控制,可以只发no class和class1的短信。这里选用no class的配置。PDU模式下,令TP—DCS的bit7~bit4为00x0,即可设置发送的短信为no class。通常用手机发送的短信,也是无类别的。
通信时,发送接收双方要统一短信格式。在发送方设置AT+CMGF=0,确定短信发送格式为PDU方式。在接收方设置:
AT+CMGF=O //短信接收格式为PDU方式
AT+CSMS=0
如果AT+CSMS=1,接收到短信时,TE需在一定的时间内发送反馈消息至模块;若超时,<mode>和<mt>的值会强制复位到0。那么,再有新的短信将不能被正确处理,需要用“AT+CNMI'’指令重新设置参数才行。这增加了程序处理的复杂性。AT+CSMS=O时,省去了这些麻烦。
3 PDU模式下的中英文短信接收实现
系统参数设置好以后,当接收到新的短信时,GSM模块直接转发至TE的格式如下所示:
+CMT:,230891683108200105F0040BAl31193887421:F5000850802251739120044F60597D
“+CMT:”为短消息指示标识,由AT+CNMI的值确定。“23”指明该短信息PDU数据包长度为23字节。第2行为十六进制数据,总长度为32字节,其中SMSC地址占用9字节,其余23字节为TPDU数据。
需要指出的是,和AT指令中的指令符号、数字一样,PDU数据都是以ASCII编码的形式传送的,比如“A”的ASCIl编码为41H,“O”的ASCII编码为30H等。PDU数据包的内容是以十六进制表示的数据,但并不是直接向单片机传递十六进制数据,而是把每一位十六进制数以ASCII编码来发送。例如:08H会以30H(“0”),38H(“8”)的形式发送。这样,1个字节的十六进制数就变成2个字节的ASCIl码。但是,PDU数据包中的数据字节长度部分仍然是原始十六进制字节的长度。而不是变成ASCII码的字节长度,这在编程时应特别注意,否则,接收和处理数据就会不完整。单片机接收到P D U数据包数据后,必须将其恢复成十六进制数据,其算法如下:
设a为接收的ASCII码,b为转换后的十六进制数。如果a<39H,则b=a-30H;如果a>39H,则b=a-30H-07H,最后把前后2个数合并为1个字节。
PDU数据包有着严格的定义,现简单介绍如下:
PDU的这种格式,层次清楚,结构清晰,方便接收。在本系统中,采用LISART中断方式接收短信,充分利用了AVR系列单片机指令执行速度快的特点,并在接收过程中运用状态机的思想,解析出短信中的发送源号码、日期时间、数据编码方案和用户短信数据。接收到一个完整的PDU数据包后,中断程序中设置接收完成标志为1。在主程序中,检测到接收完成标志为1时,就根据数据编码方案,对接收到的短信解码并保存,并准备下一条短信的接收。如果短信到来时TA与TE的数据线忙,则短信会暂时保存在TA的缓存中,等数据线空闲时再转发至TE。
在PDU模式中,发送普通的ASCII字符用7-bit编码方式,将一串7-bit字符编码为8-bit数据,每8个字符可压缩成7个。如果发送中文字符,则采用USC2编码方式,每个中文字符用16位的Unicode字符表示;如果是中英文混合的短信,由于英文字符只占1字节,需要补O,成为16位的编码。例如,“你好!”的unicode编码为4F60597D0021,其中“!”的ASCII码为21H,编码后为0021H。PDU的用户数据段最大容量是140字节,GSM模块发送给单片机的是280个ASCII编码。除此之外,还要接收保存发送源号码、日期和时间等信息。由于ATmegal28有4 KB内部SRAM,为短信的接收和解码提供了足够的空间。这是它的一大优势。PDU串的用户信息长度TP-UDL,在7-bit编码时,指原始短消息的字符个数,而不是编码后的字节数;在UCS2编码时,指编码后的十六进制字节数,因为1个字符用2个字节表示,所以经UCS2编码后,字节数等于原始短消息字符数的2倍。
PDU模式下可以发送中英文短信,但是对英文字符和数字的7-bit编码/解码比较复杂,如果只需要发送和接收纯英文字符和数字字符,最好采用Text方式。
3.1 7-bit用户数据解码
7-bit数据解码时,将源数据每7个字节分为一组,解码成8个字符。基本思想是:将第n个字节左移n位,再加上前一字节的剩余数据,即第(n-1)个字节右移(8-n)位的数值,屏蔽最高位,即得到一目标字符数据,n=0…6。第7个字节右移1位就得到解码后的第8个字符数据。
3.2 中文字符解码
短消息的中文字符采用Unicode编码,占用2字节,不是目前国内常用的 GB-2312编码。巍峨了能够在GB-2312汉字库的液晶上显示,还需要进行中文编码的转换。
基本思想就是建立Unicode和gb-2312两个中文编码表,通过查找实现相互转换。具体过程这里不再叙述。
结 语
上述介绍的在嵌入式系统中,实时接受处理短消息的设计方案,已在车载GSM-GPS系统上应用。经过长时间的操作使用,系统工作稳定,拥护反映良好。