徒儿都好涩书包网分节:嵌入式系统中短消息实时处理的实现(转)_work party everywhere

来源:百度文库 编辑:中财网 时间:2024/05/01 19:17:18
嵌入式系统中短消息实时处理的实现(转)
2008-12-25 10:28
华东师范大学 李德领 马潮
引言
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、WISMO3等。它们都具备GSM无线通信的全部功能,支持GSM07.05,GSM07.07所定义的AT指令集。
在本设计中,采用的GSM通信模块为FALCOMC2D,单片机使用的是Atmel公司的高速8位处理器ATmega128。ATmega128内部集成有4KB的RAM,4KB的EEPROM,128KB的Flash,以及2个UART串行接口等。其高速和大容量RAM的特性,为处理短消息这样的大数据包提供了便利;同时,节省了外围器件,使得硬件结构简化,提高系统可靠性。中文液晶屏用来显示接收到的中英文短信。系统的硬件接口框图如图2所示。

2 系统参数设置
短消息的发送和接收控制模式有三种:Block模式、PDU模式和Text模式。使用Block模式需要手机生产厂家提供驱动支持。目前,PDU模式已取代Block模式,而Text模式不支持中文。因此,为了系统的通用性,兼容中英文短消息的发送接收,本系统使用PDU模式来处理短消息。
在进行系统设置前,先简要说明一下短消息类(class)的概念:根据指定存储的位置,短消息分为class0-3四个类,也可以不指定类别(no class),由移动设备按默认设置进行处理,存储到内存或者SIM卡中。在TPDU的TP-DCS字节中,当bit7-bit4为00x1、1111时,bit1-bit0指示消息所属类。
00——class 0,可直接显示。
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>
(1)<mode>控制通知TE的方式。
0——先将通知缓存起来,再按照<mt>的值进行发送。
1——在数据线空闲的情况下,通知TE,否则,不通知TE。
2——数据线空闲时,直接通知TE;否则先将通知缓存起来,待数据线空闲时再行发送。
3——直接通知TE。在数据线被占用的情况下,通知TE的消息将混合在数据中一起传输。
(2)<mt>设置短消息存储和通知TE的内容。
0——接受的短消息存储到默认的内存位置(包括class 3),不通知TE。
1——接收的短消息储存到默认的内存位置,并且向TE发出通知(包括class 3)。通知的形式为:
+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>=1。
(3)bm、ds、bfr的含义,请参考相关标准文档。一般不需要去关心它们,设置为0即可。
综合以上分析,若使短消息不经过SIM卡,直接发送至TE,可以设置:
AT+CNMI=2,2,0,0,0
但是这样还有一个问题,class 2的短信,还是会存入SIM卡中,并发送+CMTI:”SM”,<index>。那么,接收程序需要处理短信通知和内容两种情况,增加了复杂性。如果发送方也由程序控制,可以只发no class和class 1的短信。这里选用no class的配置。PDU模式下,令TP-DCS的bit7-bit4为00x0,即可设置发送的短信为no class。通常用手机发送的短信,也是无类别的。
通信时,发送接收双方要统一短信格式。在发送方设置AT+CMGF=0,确定短信发送格式为PDU方式。
在接收方设置:
AT+CMGF=0 //短信接收格式为PDU方式
AT+CSMS=0
如果AT+CSMS=1,接收到短信时,TE需在一定的时间内发送反馈消息至模块;若超时,<mode>和<mt>的值会强制复位到0。那么,再有新的短信将不能被正确处理,需要用“AT+CNMI”指令重新设置参数才行。这增加了程序处理的复杂性。AT+CSMS=0时,省去了这些麻烦。
3 PDU模式下的中英文通信接收实现
系统参数设置好以后,当接收到新的短信时,GSM模块直接转发至TE的格式如下所示:
+CMT:,23
0891683108200105F0040BA13119388742F5000850802251739120044F60597D
“+CMT:”为短消息指示标识,由AT+CNMI的值确定。“23”指明该短消息PDU数据包长度为23字节。第2行为十六进制数据,总长度为32字节,其中SMSC地址占用9字节,其余23字节为TPDU数据。
需要指出的是,和AT指令中的指令符号、数字一样,PDU数据都是以ASCII编码的形式传送的,比如“A”的ASCII编码为41H,“0”的ASCII编码为30H等。PDU数据包的内容是以十六进制表示的数据,但并不是直接向单片机传递十六进制数据,而是把每一位十六进制数以ASCII编码来发送。例如:08H会以30H(“0”),38H(“8”)的形式发送。这样,1个字节的十六进制数就变成2个字节的ASCII码。但是,PDU数据包中的数据字节长度部分仍然是原始十六进制字节的长度,而不是变成ASCII码的字节长度,这在编程时应特别注意,否则,接收和处理数据就会不完整。单片机接收到PDU数据包数据后,必须将其恢复成十六进制数据,其算法如下:
设a为接收的ASCII码,b为转换后的十六进制数。如果a<39H,则b=a-30H;如果a>39H,则b=a-30H-07H,最后把前后2个数合并为1个字节。
PDU数据包有着严格的定义,现简单介绍如下:

PDU的这种格式,层次清楚,结构清晰,方便接收。在本系统中,采用USART中断方式接收短信,充分利用了AVR系列单片机指令执行速度块的特点,并在接收过程中运用状态机的思想,解析出短信中的发送源号码、日期时间、数据编码方案和用户短信数据。接收到一个完整的PDU数据包后,中断程序中设置接收完成标志为1。在主程序中,检测到接收完成标志为1时,就根据数据编码方案,对接收到的短信解码并保存,并准备下一条段短信的接收。如果短信到来时TA与TE的数据线忙,则短信会暂时保存在TA的缓存中,等数据线空闲时再转发至TE。
在PDU模式中,发送普通的ASCII字符用7-bit编码方式,将一串7-bit字符编码为8-bit数据,每8个字符可压缩成7个。如果发送中文字符,则采用UCS2编码方式,每个中文字符用16位的Unicode字符表示;如果是中英文混合的短信,由于英文字符只占1字节,需要补0,成为16位的编码。例如,“你好!”的Unicode编码为4F60597D0021,其中“!”的ASCII码为21H,编码后为0021H。PDU的用户数据段最大容量是140字节,GSM模块发送给单片机的是280个ASCII编码。除此之外,还要接收保存发送源号码、日期和时间等信息。由于ATmega128有4KB内部SRAM,为短信的接收和解码提供了足够的空间。这是它的一大优势。PDU串的用户信息长度TPUDL,在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两个中文编码表,通过查找实现相互转换。具体过程这里不再叙述。请参考文献[1]。
结语
上述介绍的在嵌入式系统中,实时接收处理短消息的设计方案,已在车载GSM-GPS系统上应用。经过长时间的操作使用,系统工作稳定,用户反映良好。