网上看到一篇GPRS的文章,发现有些东西自己想错了,于是结合文章对照broncho平台的实现,对GPRS做了一下了解。有不对的地方还请多指教。
先来看张图:GPRS传输平台
SGSN:GPRS服务支持节点 GGSN:GPRS网关支持节点 BSS:基站子系统
以前以为应用处理器上运行的应用通过PPPD后台 进程拨号连接GPRS,是通过基带模组透传和GGSN建立PPP连接,对于GGSN提供PPP数据分组服务,并且MT对PPP数据透传的情况确实是这样。 但是对于GGSN提供IP数据分组服务或者GGSN提供PPP数据分组服务,MT对PPP数据中继传输的情况,这个ppp连接其实只是应用处理器运行的应 用和基带模组里的ppp服务器之间的建立起来的。
上图中的MS指代了整个移动台(手机),其实逻辑上可以分为TE(termianl Equipment)和MT(Mobile Termianl),对一般手机来说,TE就是应用处理器及其上面运行的应用,MT就是基带模组。
图中从IP层到SNDCP层实际上隐藏了TE和MT之间的传输结构,对broncho平台的实现大致是这样的:其中mux1是gsmmux多路复用进程提供的伪终端,pppd把mux1当作普通串口使用就可以了,最终数据流向ttyS0串口
application
ip
- - - - - - - - - - - - - - - - - - - - - - - - -
ppp----------------------------------------------------| ppp
- - - - - - - - - - - - - - - - - - - - - - - - - -|- - - - - -
mux1 <----> ptmx <--- ttyS0 <|> 模组串口
那pppd拨号连接时,对应的做了什么呢?看一下ppp拨号的脚本:
'OK' 'AT+CGDCONT=1,"IP","cmnet","",0,0'
'OK' 'AT'
'OK' 'ATD*99***1#'
'CONNECT' ''
AT+CGDCONT=1,"IP","cmnet" 这是定义PDP上下文,就是告诉模组一些信息。这里定义了一个ID为1的PDP上下文的参数值,IP是这个PDP上下文中分组数据包地址类型,cmnet 是APN,用来选择GGSN的,不同名称选择不同的GGSN。在我们的应用看来GGSN就相当一个网关,后边连接到internet或wap网络, 或者连接到对应网络的网关。
ATDT*99***1# ,上面已经把必须的信息告诉模组了,这就是请求模组激活这个PDP上下文了,99是ip数据服务代码,1#代表PDP上下文的ID,这是1#,就是上面AT+CGDCONT新建的。这个命令会让模组执行下列动作:
1) 激活PDP上下文,大体过程:基带模组向SGSN发送SNDCP消息包,请求激活PDP上下文,SGSN通过解析APN找到对应的GGSN并请求该 GGSN激活PDP上下文。 如上图,SGSN和GGSN通过GTP协议(GPRS隧道协议)交互,每个逻辑隧道连接都有一个TID标识)。GGSN激活PDP上下文成功,将返回 PDP地址(对我们的例子来说就是IP地址)和对应的GTP隧道TID(当然还有其他QoS,计费标识啊什么的),SGSN记录下PDP上下文和TID对 应关系,将获得PDP地址,PDP配置信息等返回给基带模组,从而建立的基带模组到GGSN的分组数据路由。
2) 建立TE和模组之间的PPP数据连接,模组里的PPP server将获得ip信息在PPP连接过程中使用IPCP协议告诉应用处理器侧的应用,就是pppd
当然还有一些其他的交互:连接之前,MT要和SGSN交互做附着,MT移动时可能发生小区更新,MT发送数据的上行链路和BSS寻呼MS的下行链路的建立,这些和基带模组关系比较大。
后记:看pppd输出log,ATDT*99***1# AT命令很快返回CONNECT,说明这个AT应该没有让MT向网络发起激活PDP上下文的过程,应该是在TE和MT的PPP连接过程完成LCP,PAP后的IPCP过程时,MT才向发起激活PDP上下文的过程。