随着GPRS 技术在移动通信领域中的发展,目前此技术已经能够实际应用到许多需要无线数据传输的领域,也为许多行业提供了一种新的数据传输方法。GPRS网覆盖面广、可靠性高。基于GPRS 的远程仪表控制系统具有维护费用低、可靠性高、费用合理等特点,可以广泛应用于水、电、气的远程抄表和各种工业远程仪表的控制系统。
当前,绝大多数基于GPRS 网络应用系统所使用的GPRS 模块为法国Wavecom 公司的WISMO 系列和德国Siemens 公司的S 系列等。这些GPRS 模块都通过RS232接口和外部进行数据传输,且支持多种传输速率。例如:MS35 是Siemens 公司生产的GPRS 调制解调器,它提供RS232 数据口,用AT 指令进行控制。MS35 的主要特征如下:支持语音、数据传输、短消息、传真业务;三种语音编码方式(FR/EFR/HR);四种数据传输模式CS-1、CS-2、CS-3、CS-4 下行速率最大为85.6Kbit/s,上传速率最大为21.4Kbit/s;提供RS232 全双工数据口;使用AT指令进行控制。但这些模块都有一个缺点,那就是不支持TCP/IP 协议,也就是在其内部传输的数据必须符合TCP/IP 协议的要求,这就为GPRS 模块的使用造成了一些障碍。现在,一些公司为了适应市场要求,也制造了一些协议转换模块,功能仅限于数据透明的传输,保证数据的完整性;但在以后的维护中却增加了一些麻烦,并且一些内部的结构是不能公开的,当用户升级或增加新的功能时,就不得不增加费用。
现在,有几种方式可以实现协议转换的功能。其中可以使用Dragonball、ARM 这种高级一些的微处理器,配合uClinux 等类Linux 的嵌入式操作系统,则可以较容易地实现TCP/IP 协议。这种解决方法比较适合系统应用范围小且性能要求比较高的场合,但成本较高。当然,也可以使用x86 体系的CPU 和主板,这样编写软件会更方便。通过地址锁存器外接RAM 和ROM 分别作为程序存储器和数据存储器,由软件编程分层实现TCP/IP 协议;但为了节省成本,在功能比较单一的情况下,可以考虑使用单片机实现IP 协议,这时可以使用uC/OS-II或RTX51 等简单的操作系统,以降低难度。如果操作系统占用大量的存储资源,又想进一步节省成本,可以不使用操作系统,而用编程直接实现部分IP 协议栈。
仔细分析中国移动GPRS 网络的特点,可以知道数据传输过程中的一些要求。GPRS 网是通过网关支持节点(GGSN)连接外部网络的。在这里,GGSN 相当于ISP,为内部GPRS 网络用户提供服务。中国移动要求用户通过拨号的方式登陆Internet。当然,这是在GRPS 网络中才能完成的。具体的方法是:拨“*99***1#”,其中身份验证时,用户名、密码都为空。拨号成功后通过GGSN登陆到外部Internet,同时获得一个动态的IP 地址。这其中最主要的就是拨号的过程。和通过Modem 上网的方式一样,GPRS 模块于网关的通信也要符合点对点协议(Point to Point Protocol ,PPP)。从以上分析可以看出,一次上网的过程也就是一次点对点协议的实现过程。
1 PPP 的实现
PPP 是为在同等单元之间传输数据包而设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计的目的主要是,通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。
PPP 中提供了一整套方案来解决链路建立、维护、拆除、上层协议协商、认证等问题。PPP 包含这样几个部分:链路控制协议LCP(Link Control Protocol);网络控制协议NCP(Network Control Protocol);认证协议,最常用的包括口令验证协议PAP(Password Authentication Protocol)和挑战握手验证协议CHAP(Challenge-Handshake Authentication Protocol)。
LCP负责创建、维护或终止一次物理连接。NCP是一族协议,负责解决物理连接上运行什么网络协议,以及解决上层网络协议发生的问题。
一个典型的PPP 链路建立过程分为三个阶段: 创建阶段、认证阶段和网络协商阶段。
LCP 负责创建链路。在这个阶段,将对基本的通信方式进行选择。链路两端设备通过LCP 向对方发送配置信息报文(configure packets)。一旦一个配置成功的信息包(configure-ack packet)被发送且被接收,就完成了交换,进入LCP 开启状态。
在这个阶段,客户端会将自己的身份发送给远端的接入服务器。该阶段使用一种安全验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。在认证完成之前,禁止从认证阶段前进到网络层协议阶段。如果认证失败,认证者应该跃迁到链路终止阶段。认证阶段完成之后,PPP 将调用在链路创建阶段选定的各种网络控制协议(NCP)。选定的NCP 解决PPP 链路之上的高层协议问题。在该阶段IP 控制协议(IPCP)可以向拨入用户分配动态地址。
这样,经过三个阶段以后,一条完整的PPP 链路就建立起来了。
中国移动在GPRS 与Internet 网中间建立了许多相当于ISP 的网关支持节点(GGSN),以连接GPRS 网与外部的Internet 网。GPRS 模块可以通过拨“*99***1#”登录到GGSN 上,动态分配到Internet 网的IP 地址。其间,GPRS模块与网关的通信要符合点对点协议,其中身份验证时用户名、密码都为空。使用PPP 登录之后,就可以通过GGSN 接上Internet 了。
由于移动梦网的GGSN 与GPRS 模块通信时遵循PPP协议,所以要在微控制器中也实现一部分PPP 协议才能与之对话。GPRS 模块在拨号后首先要与GPRS 网关进行通信链路的协商,即协商点到点的各种链路参数配置。协商过程遵守LCP、PAP(Password Authentication Protocol)和IPCP(Internet Protocol Control Protocol)等协议。其中LCP 协议用于建立、构造、测试链路连接;PAP 协议用于处理密码验证部分;IPCP 协议用于设置网络协议环境,并分配IP 地址。协商机制用有限状态机的模型来实现。一旦协商完成,链路已经创建,IP 地址已经分配就可以按照协商的标准进行IP 报文的传输了。根据应用的不同,IP 报文中可以携带UDP 报文,也可以是TCP 或ICMP 报文。本系统正是采用UDP 报文传送数据信息的。
数据传输完成之后,微控制器会向GGSN 发送LCP 的断开连接报文,以终止网络连接。微控制器的串口中断接收程序首先以包起始和结束符来判断是否有完整的PPP包,并对PPP 包的内容进行校验,以确定数据包的完整性和正确性。PPP 数据帧的结构如下:
2 系统设计
协议转化模块的任务主要是,将用户数据转换为TCP/IP 协议的数据包,从而能够通过GPRS 网络发出。其中在系统初始化过程中,首先使GPRS 模块拨号上网。图1 为程序的总体结构。
2.1 系统初始化
在GPRS 模块使用之前,必须先进行初始化设置。这个过程可以通过AT 命令进行,同样也可以在程序中设置。根据ISP 的要求进行一些必要的设置。例如,设置ISP 的拨号号码、用户名称、用户密码等。同时进行拨号连接,使GPRS 模块能与Internet 通信。在拨号过程中,图1 左半部分有三个阶段:接收PAP 帧、PAP 验证、接收IPCP 报文(获得动态IP 地址)。发送空的LCP 应答(VoidLCPFrame)数据帧是为了达到使ISP 回发LCP_REQ_FRAME 数据帧的目的。空的LCP应答数据帧的内容为(协议字段+ 信息字段):0xc0, 0x21,0x20, 0x01, 0x00, 0x04。部分代码实例如下:
//函数GPRSInit(ispnumber,username,password)功能:设置ISP拨号号码、用户名和用户密码。
// 函数GPRSDial()功能:开始拨号,直到PPP 协商成功。
GPRSInit (ispnumber, username, password);
GPRSDial ();
SendVoidLCPFrame ()
While (FRAME_TYPE==0); //等待应答帧
If (FRAME_TYPE==LCP_REQ_FRAME) //表示收到应答帧
FRAME_TYPE=0;
While (FRAME_TYPE==0); //等待PPP协商是否成功
If (FRAME_TYPE==IPCP_FRAME) // 表示PPP 协商成功
…… //处理IPCP帧
Sysock.localaddr=IPCP.ip; //初始化变量
Sysock.remoteipaddr=IPCP.dnsip;
Sysock.localport=0x0510;
……
2.2 数据处理
基于GPRS 应用系统的主要功能就是进行数据传输,因此数据处理是GPRS 模块的主要任务。当GPRS 模块已经附在Internet 时,也获得了一个动态的IP 地址,数据传输的过程也就开始了。在GPRS 网络中,数据传输就是IP 数据报通信过程,模块向网关发送的PPP 报文都会传送到Internet 网中相应的地址;而从Internet 传过来的应答帧也同样会根据IP 地址传到GPRS 模块。从而实现采集数据和Internet 网络通过GPRS 模块的透明传送,而对于用户来说并不用关心数据的格式。数据传输过程可分为以下几个过程,如图1 右半部分所示。
从外部来的数据经历三个过程:装入UDP 包( 这里用UDP 协议,还可以用TCP 协议)、装入IP 包、装入PPP帧。经历这三个过程后就成为了符合标准的数据包,能够在网络中传送了。部分代码如下:
void UDPInit(data userdata ){ // 数据装入UDP 包
UDPOption.data=userdata
UDPOption.localport=Syssock.localport;
UDPOption.destport=Syscock.destport;
……
}
void IPInit(UDPData UDPOption){ //UDP 包装入IP包
IPOption.data=UDPOption;
IPOption.localaddr=Syssock.localaddr;
IPOption.remoteaddr=Syssock.remoteipaddr;
……
}
void PPPInit (TCPData TCPOption) {
PPPOption.flag=0x73; // PPP数据报的开始/结束标志
PPPOption.protocol=0x0021 //IP数据报的标志
PPPOption.address= 0Xff
PPPOption.control= ox03;
PPPOption.data=IPOption;
……}