摘要:移动通信中的短消息是人们无线沟通的重要方式,更以其方便、可靠性得到广泛应用。针对嵌入式无线路由的迅速普及,为实现良好人机交互,提出将短消息功能植入可使用上网卡的无线路由的动态Web中。用C语言进行CGI程序设计,采用PDU短信模式,实现无线路由设备中短信的收发。实验结果也证实了此方案的正确性、实用性和可扩展性。
关键词:无线路由;动态Web;CGI;短信;PDU
为实现良好的人机交互及远程控制功能,如今大部分嵌入式Linux设备均引入Web服务器技术,无线路由的迅速普及更体现了这一点。Goa head是一款主要面向嵌入式系统的Web服务器,因其支持asp、cgi且兼容性良好备受无线路由等嵌入式设备的青睐。而通用网关接口(CGI)则是Web服务器与为添加功能编写的外部程序之间的一个接口。市面普及的无线路由器,管理界面鲜有收发短信的功能,这样用户可用功能受到限制。通过这个CGI接口实现从Web端编辑短信并发送,及上网卡接收短信并显示与Web端等功能,实现了无线路由更智能的一面。
1 嵌入式无线路由中的CGI技术
1.1 CGI工作原理
通用网关接口是Web服务器和外部扩展程序之间的一个接口。CGI可以使编写的程序处理WWW上客户端送来的表单和数据并对此做出相应反应。而且基于CGI的网页应用程序可工作于不同的浏览器平台,兼容性良好。
CGI程序的工作一般分为以下几个步骤:
1)客户端发出请求;
2)Web服务器激活相应的CGI程序;
3)CGI程序对客户端的请求做出反应;
4)Web服务器将CGI程序的处理结果传送给客户端;
5)Web服务器中断和客户端浏览器的连接;
6)Web服务器将CGI程序的输出显示在浏览器的窗体上。
1.2 CGIC函数库
CGIC是用来生成基于CGI的WWW应用程序的C语言函数库,C语言编程是一项复杂且容易出错的工作,选择合适的库CGIC成为必要。一般的Linux系统都支持ANSIC,增加相应的库函数和相应的h文件就可以实现CGI;而CGIC是一个完全符合ANSIC标准的程序库,在任何支持ANSIC标准的系统平台上都可以使用。
它有以下功能:
1)对数据进行语法分析;
2)接收以GET和POST两种方式发送的数据;
3)把FORM中的不同域连接成连续的串;
4)为检索FORM数据而提供字符串,整数,浮点以及单项和多项选择功能;
5)为数字字段提供边界检测;
6)把CGI环境变量加载到非空的C串中;
7)为调试而捕捉CGI状态;
8)提供相对安全的系统调用功能。
CGIC本身提供了一个main()函数,CGIC的用户编写的程序代码应该放在函数cgiMain()中。CGIC的main()函数主要用来完成CGI程序的初始化工作、获取客户端用户的输入以及相应的解码工作,最后main()函数会调用cgiMain()以执行用户编写的程序代码。
2 短信功能设计
短信息服务作为目前最方便快捷的交流方式,工作原理也变得越来越标准化。通常对短消息的控制有3种实现途径:Block模式,基于AT命令的Text模式和基于AT命令的PDU模式。使用Text模式收发短信代码简单,但最大的缺点是不能收发中文短信;而PDU模式不仅支持中文短信,也能发送英文短信。本文主要使用的是在Linux下用C语言来实现PDU模式的SMS收发。
2.1 PDU模式下短信发送原理
一个完整的SMS消息所包含的所有报头信息被以二进制字符串格式传送。这个二进制由十六进制格式的IA5字符组合而成。一般的PDU码由13项组成:1)短信息中心地址长度,2位十六进制数(1字节);2)短信息中心号码类型,2位十六进制数;3)短信息中心号码,2)和3)的长度由1)中数据决定;4)文件头字节,2位十六进制数;5)信息类型,2位十六进制数;6)被叫号码长度,2位十六进制数;7)被叫号码类型,2位十六进制数,取值同短信息中心号码类型;8)被叫号码,长度由被叫号码长度中的数据决定;9)协议标识,2位十六进制数;10)数据编码方案,2位十六进制数;11)有效期,2位十六进制数;12)用户数据长度,2位十六进制数。13)用户数据,其长度由用户数据长度中的数据决定。数据编码方案中设定采用UCS2编码,这里是中英文的Unicode字符。
常用AT命令如下表所示:
2.2 PDU模式编码
用PDU模式收发短消息可以使用3种编码:7-bit编码、8-bit编码和USC2编码。7-bit编码用于发送普通的ASCII字符;8-bit编码通常用于发送数据消息,如图片或铃声等;USC2编码用于发送Unicode字符。由于短信需实现中文短信的发送,所以选择用UCS2编码,即中文Unico de码。这些编码均有标准算法。
3 软件设计
3.1 串口通信
嵌入式无线路由是通过串口发送一系列AT命令实现与无线路由的各种通信,短消息的收发也是通过这种方式。串口通信是计算机与其他设备通信的常用方法,本系统采用libcsms这个基于Linux的串行通信函数库,来实现串行接口的异步事件驱动并发。采用该方法,只需要在cgi中编写数据处理函数,大大提高了工作效率。
3.2 短信发送页面设计
Html代码发送短信部分,为简化cgi程序工作,在web端通过脚本函数ucs2_code()将短信内容先做处理。ucs2_code()函数具体功能为:读取短信内容,循环获取短信的每一位并通过charCodeAt()和toString()方法结合转换为单独的Unicode码,再根据长度补齐;如此得到整个短信内容的Unicode码及此编码的长度。
再通过form提交表单,提交内容有:手机号码,手机内存写入状态,处理后的短信Unicode码和长度。部分代码如下:
3.3 CGI发送短消息
Cgi发送短信主函数处理消息部分通过环境变量,读取form表单提交的值;先读取手机号码,若成功则处理手机号码后继续读取短信内容的Unicode码,若成功则读取短信长度,若成功则将短消息参数结构中的SMSC地址的变量赋相应值。再读取短信是发送还是保存的状态。如此完成整个web页面短消息的处理过程。
发送短信主函数部分代码如下所示:
发送短消息在gsmSendMessage中实现,先根据PDU参数,编码PDU串;再通过PDU串和其中SMSC信息的长度,生成发送命令。向串口输入命令,根据返回值ans判断模块是否准备就绪,是则继续输入PDU串,返回TRUE,则发送成功;否则返回FALSE。
发送短信流程图如图1所示。
4 结束语
设计的创新之处在于提供了基于CGI的嵌入式无线路由中上网卡模块的短信收发功能的设计方法。短信收发采用PDU模式处理中文、英文短信;功能是通过用C语言编写的CGI实现。在web端与iavascript结合,实现动态web的高效运行。对于基于Linux的无线路由设备已慢慢渗透人们日用的各个角落成为必需品,如果将短信收发功能添加其中,更能增加此设备智能的功能,为用户提供更便利的服务。