摘要:短消息服务作为GSM网络提供的一种基本服务,已成为诸多领域远程控制的一种通信手段。讨论一类通用的SMS短消息收发系统的实现方法,主要内容包含短消息调度和SMS短消息处理控制机制。特别对STM32微处理器下短消息收发调度的实现过程与短消息处理状态机进行了详细讨论。通过对超时时间的控制和不同条件的切换,使得对短消息的收发处理动作在一个时间段内显示出并发特性。
关键词:状态机;STM32;SMS;短消息收发
短消息服务(Short Message Senice)作为GSM网络提供给用户的一种基本的数字业务,已成为诸多领域远程监控的一种通信手段。在很多应用场合中都通过PC机直接控制短消息收发模块完成系统的数据采集或远程信息传输,但对于偏远地区、架设通信线路比较困难的地方,需要一种方便携带的设备控制短消息收发模块。系统通过在STM32上完成对短消息模块的控制,提出了一种嵌入式短消息收发系统的实现方法。
本文讨论一类通用的SMS短消息收发系统的实现方法,包含短消息调度和SMS短消息处理控制器的实现机制,特别对STM32嵌入式微处理器下短消息收发调度的实现过程和短消息处理状态机进行了详细讨论。在嵌入式系统中,时间和并行性(concurrency)是必不可少的。通过对超时时间的控制和不同条件的切换,使得对短消息的收发处理在较小时间段内显示出并发特性。能够处理多条短消息同时控制的情况,具有良好的通用性。
1 系统的功能与结构
SMS是GSM系统提供给广大移动用户的一种双向通信、具有一定的交互能力、占用GSM网络的信令信道的数字业务。SMS提供了在GSM移动站台(MS)与一个短消息实体(SME)之间通过服务中心(SC)传送短消息的方法。SC提供了在MS与SME之间消息传送的相互联系和转播的功能。SMS采用存储转发模式,短消息被发送出去之后,不是直接地发送给接收方,而是先存储在短消息服务中心,然后再由服务中心将其转发给接收方。如果接收方当时关机或不在服务区内,服务中心会自动保存该短消息,捧队并尝试再次发送给接收方。由于短消息使用了服务中心的这种存储和转发机制,因此SMS具有较高的可靠性。这也意味着GSM模块收发SMS的响应速度受运营商服务中心的限制。因此,要提高响应速度,需要一个持续在线的终端一直运行。
系统在两个短消息实体间增加本地SMSC(短消息服务中心),通过SMSC完成短消息的解析并执行相应的动作、控制、无线通信功能。确保GSM终端模块持续运行,以提高响应速度。
系统由TC35i GSM模块和运行在STM32微处理器上的短消息处理控制机两部分组成。TC35i负责短消息的收发。短消息处理控制机用来向GSM模块发送或读取TC35i收到的短消息,并执行相应的动作和控制。二者之间通过RS232串口实现数据交换。用户可以利用手机通过GSM网络和系统进行交互完成控制功能。
2 STM32片上资源的分配和使用
STM32是意法半导体基于Cortex—M3的32位嵌入式处理器,Cortex—M3核性价比高,价格低,可以与8位51核单片机竞争。
处理器和GSM模块之间通过RS232串口实现数据交换,TC35i集成了标准的RS232接口,通过MAX232芯片做电平转换,与处理器USART接口进行通信。因此处理器需要提供两个串行通信接口,其中一个串口用于和GSM模块进行通信,另一个串口用于和上位机软件交换数据或调试。在处理器选型时需要考虑这个问题,而STM32全系列微处理器均能满足这个要求。系统选用的处理器型号为F103RBT6,该产品系列带有128k片内FLASH,20kRAM,无需外扩存储器即可以满足系统对于多条控制短消息同时处理耗费内存空间的需要。STM32F103RB带有3个USART接口,可以满足系统对串口资源的需求。芯片带有4个独立定时器,1个RTC实时时钟,系统只用到其中2路:1路用于产生较准确的系统延时,用于一般延时定时和状态切换超时判断。一路用于通过定时轮询方式读取短消息。GSM模块短消息收发和运行状态的监测通过USART的中断处理程序实现。
3 SMS短消息控制状态机的实现
由于系统旨在完成一类通用的SMS短消息控制机实现方法,因此在系统实现时从逻辑上将SMS提供方和使用方剥离,将发送子系统和接收子系统分离。这通过两个全局队列实现,发送队列和接收队列。
定义一个结构体类型:
作为短消息的基本数据单元。
并定义SMS_PDU类型的队列,分别作为发送队列和接收队列,即,SMS_PDU类型的结构体数组。如下:
SMS_PDU m_QuerySend[MAX_SMS_SEND];
SMS_PDU m_QueryRecv[MAX_SMS_RECV];
以上定义均为全局队列。对全局变量的操作会涉及到并发和多线程访问技术,本系统考虑到实时性采用前后台系统实现方式,通过STM32多路定时和中断功能来完成多线程的模拟,主程序调用一个无限循环的控制器处理函数,在控制器循环中调用相应的驱动函数完成相应的功能。同时中断系统作为前台,遇到外部触发条件则立即构造短消息并加入到输出队列中。
对发送队列缓冲区的操作分为人队操作和出队操作,入队操作是由外部采集模块产生的中断事件,在该中断的处理例程中构造好具有发送具体内容PDU编码、目标手机号等资讯的结构体,并将构造好的结构体存放到发送队列中,此时一旦主程序中的短消息控制器在进行收发处理完毕后处于idle状态,将立即切换到开始发送状态,完成对发送队列中历史积累SMS的发送处理,在发送前首先进行出队操作。
对接收队列缓冲区的操作也分为输入和输出部分。系统设定条件为一旦状态机处于idle状态达到5 ms时间(意味着发送队列中待发短消息已全部处理完毕)则状态切换到开始接收状态,即通过AT指令从模块读取短消息协议数据单元,解析为SMS-PDU格式并将其放入接收队列。输出部分主要通过定时器设置10 ms轮询,一旦有解析好的短消息到来,则马上控制被控设备产生相应动作。
系统实现中,通过main函数调用短消息控制器循环运作状态迁移转换处理程序来实时完成与GSM模块的交互,通过TIM2中断处理例程完成对接收队列中已到达短消息的调度(dispatch)处理,该处理程序会根据接收到的短消息内容的不同来实现具体的控制功能。发送SMS时,也采用类似的中断方式和队列形式来完成多线程的模拟。为了防止对接收指令的误响应和减小与模块交互读取时间,每次接收短消息后都将GSM模块上已收短消息删除。
系统采用状态机来实现不同状态处理的切换,过程中短消息数据收发的状态迁移图如图1所示。
4 STM32处理控制机与GSM模块的交互
STM32通过AT指令完成与GSM模块交互。与GSM模块交互读取短消息有多种方式,如AT+CMGR;AT+CMGL等。由于多个用户可以同时操作,考虑到可能到来的多条短消息,系统中使用CMGL AT指令完成STM32对GSM模块的通信操作,以便利一次读取,提高系统的响应速度。
CMGL指令在SMS PDU mode下的格式如下:
SMS规范中定义了message_status的5种不同状态下的操作:
0表示已接收到的未读短信,
1表示已接收到的已读短信,
2表示已存储的未发送短信,
3表示已存储的已发送短信,
4表示列出全部SMS短信。
如果GSM模块成功从存储区读到短消息,将会返回到形如:
格式的反馈信息。其中+CMGL后第一个1所在字段作为索引index,指示短消息在短消息存储区中的位置。注意这个位置小并不表明该短消息是先到达的控制短消息。第二个1所在的字段指示短消息的状态,同上述message_status的状态,但只有0~4的取值范围。24所在字段指示仅随其后的的TPDU编码的有效部分长度,以10进制表示。如果CMGL后面不加“=”号和任何数字,默认为“CMGL=0”的效果。系统中根据TPDU编码的内容进行解析,并将解析结果保存到一个临时SMS_PDU结构体类型的数据单元中。然后交由短消息处理状态机保存到队列中进行处理。
5 结束语
由于GSM模块收发SMS的响应速度受运营商服务的限制,短消息控制器的状态设计中需要把发送AT指令给模块和从GSM模块收到响应字符串区分为两种不同的状态,以及区分其它预备和执行状态,并利用MPU定时器产生精准毫秒延时来判定响应是否超时。但这只能提高状态切换精度,无法保证SMS服务响应的时间精度,即,系统必须等待GSM模块返回响应信息,这意味着系统实时性的高低瓶颈仍然取决与运营商。