使用MC55实现GPRS通信
1、概述
GPRS(General Packet Radio Service)是通用分组无线业务的简称。它是第二代移动通信技术GSM向第三代移动通信技术3G的过渡技术,经常被描述成2.5G,GPRS是GSM Phase2.1规范实现的内容之一,是在现有的GSM移动通信系统基础上发展起来的一种移动分组数据业务。GPRS通过在GSM数字移动通信网络中引入分组交换功能实体,以交换采用分组方式进行的数据传输。GPRS能提供比现有GSM网9.6kb/s更高的数据传输速率,最高可达171.2kb/s。
2、电力负荷管理系统对通信网络的要求
(1) 信号覆盖率:电力设备布点分散、量大面广,通信网络必须能够基本覆盖整个地区,这是衡量通信方案是否成功的关键因素。
(2) 通信实时性:电力监控系统要求数据能够进行实时的信息交互传送。
(3) 数据安全性:通信网络必须能够保证系统的数据和控制信息在网络传输中的安全性,不会受到来意不明的攻击而导致数据传输不能顺利进行造成停电破坏等事故的发生。
(4) 运行费用:信息采集所提供的通讯方式运行费用是系统组网的一个关键问题,尤其对公用配电变压器和负荷管理终端这样的电网低端设备。
(5) 技术的前瞻性:通讯技术的发展很快,所选用的通讯技术本身及其通讯网络必须保证未来5--10年不被淘汰,在技术层面上能平稳生级。
3、GPRS通信在电力系统中应用的可行性
GPRS采用分组交换技术,数据传输速率高,它支持多种带宽,是对有效带宽的高效利用。GPRS网络满足电力负荷管理系统中数据的通信速率的要求。GPRS具有“永远在线”的功能,当终端与GPRS网络建立连接后,即使没有数据传送,终端也一直与网络保持连接,再次进行数据传输时不需要重新连接,而网络容量只有在实际进行传输时才被占用,从而保证了数据交换的实时性。GPRS是以传输的数据量,而不是以连接时间为基准来收费的,接入GPRS网络但没有数据传输是不收费的,这使得通信信道的使用费用大大降低。GPRS网络是在现有的GSM网络系统的基础上引入新的部件而构成的无线数据传输系统,在一次性投入和网络维护上的开销小,可以节省耗费巨大的导线材料和人工费用,而且免除了日常检修和维护费用,同时,具有高可靠性,扩展性和抗干扰性。综上所述,在电力负荷管理系统中使用GPRS通讯模块,充分利用覆盖面广,运行可靠、费用低廉的GPRS公用无线网络,实现GPRS无线数据通讯功能进行数据传输,达到电力负荷管理的通讯要求,做到GPRS在电力数据采集的实用化。
4、GPRS 通信技术在电力系统通信网络中应用模式
GPRS的负荷管理系统通信网络是负荷管理终端中的CPRS无线终端与集中监控主站系统之间数据传输的通道,通信网络的构成有以下两种方案。
第一种通信网络构成方案采用GPRS 与Internet相结合的通信连接方式。集中监控主站通过这种通信连接方式,集中负荷数据采集终端的数据信息。每台分散的负荷数据采集终端上安装GPRS 无线终端,GPRS 无线终端通过串口与配变数据采集终端的串口通信,GPRS无线终端需要安装移动通信公司的SIM卡,并到移动通信公司申请开通普通的GPRS业务,无需申请开通专门的GPRS业务。CPRS无线终端上电后,经过初始化操作、激活PDP上下文、设定服务质量等级、拨号呼叫连接后登录到GPRS网络,再通过移动internet的接入点获得外部IP地址,建立访问internet的通道;具有独立IP地址的集中监控主站与internet相连。这样集中监控主站与GPRS 无线终端通过GPRS 与internet网络进行通信,实现集中监控管理的各项功能。
第二种通信网络构成方案是GPRS和虚拟专用网络(VPN)技术相结合的通信连接方式,虚拟专用网络采用隧道技术以及加密、身份认证等方法,利用公共网络设施在远端用户之间提供类似专网的连接技术。在每台配变数据采集终端装置上安装GPRS无线终端,硬件、软件的实现方式类似与第一种方案。与第一种方案不同之处是需要向中国移动通信公司申请 VPN业务,从而可以把所有的配变数据采集终端和集中监控主站连接成VPN。这样集中监控主站与负荷数据采集终端之间可以进行通信。
比较这两种方案,方案一通信网络构成成本较低,但GPRS 无线终端作为网络主机,暴露在Internet网络上,有遭受攻击的可能,并且GPRS 无线终端发送和接收的数据没有加密处理,数据传输安全性低;方案二GPRS 无线终端与集中监控主站系统之间数据是在加密后“虚拟专用网络”中传输的,数据传输的安全性强,而且终端设备之间也可以进行通信,但是这种方案建立“虚拟专用网络”费用很高。因此,在注重网络通信费用少,数据安全性要求不高的情况下,采用方案一较好。而在通信数据安全性要求高,可以承受高的网络通信费用的情况下,采用方案二。
5、应用实例设计
本设计在以TI公司的DSP芯片TMS320F2812为主控芯片的负荷管理终端上,通过扩展SIEMENS公司的MC55 GPRS模块,从而实现GPRS业务的数据传输功能,远方管理中心可以通过GPRS网络与负荷终端进行数据交换。本系统硬件上可以认为是由TMS320F2812通过外扩串口与GPRS模块连接构成。硬件系统的设计内容主要是指DSP芯片TMS320F2812与无线modem MC55模块的接口的设计,DSP芯片主要实现整个系统所需的协议栈以及监测数据的采集、中心主站命令的解析等;GPRS模块则完成无线上网功能。MC55 为Siemens公司推出的被誉为当今世上最具价值、尺寸最小的三频GSM/GPRS模块,除具有普通GSM模块的通话、短信、电话簿管理、CSD(电路交换数据)传输等功能和无线MODEM的GPRS连接功能外,内置完整的TCP/IP协议栈,不仅支持SOCKET 连接下的TCP/UDP数据传输,还支持HTTP,FTP,SMTP,POP3等上层应用协议。它支持标准ITU—T的AT命令集,可以通过串口对其进行控制。
6、GPRS实现数据传输的模式及其AT命令
GPRS模块在电力系统实际应用中,电力设备终端主要在 SOCKET/FTP/短信(SMS)3种通信方式下与主站进行数据通信,通信方式和任何通信相关的参数均可以AT命令的形式通过串口本地更改和通过短信远程切换。
(1)SOCKET通信主要是完成终端历史实时数据,主站控制命令的传输,它是整个GPRS通信的核心部分。
(2)FTP是MC55 GPRS模块所支持传输服务之一,它主要是完成程序的远程维护更新。
(3)短信通信的功能主要是主站修改终端参数,如终端的IP地址和端口号。
对于上述的3种数据传输方式,终端用于控制MC55 GPRS模块的AT命令主要有以下几种:
(1)ATE取消AT命令回显。
(2) AT+ CMGF=1设置短信格式为文本。默认值表示短信格式为PDU。
(3)AT+ CNMI=3,1设置新消息提示信息,包含存储类型和序号,收到新短消息将提示:+CMTI:" MT",2 表示新消息存储于“MT"空间第2条。MC55默认条件下收到新短信先存储于“ME"(模块内),如果已满,即存储于“SM"(SIM卡内)。
(4) AT+CMGR= 2 读出存储空间序号为2的消息。
(5) AT+ CMGD=2删除存储空间序号为2的消息。
(6) AT+ CSQ查询信号强度。
(7) Internet连接配置命令,可以配置6个连接。例如号连接配置连接类型为gprs0(相对于CSD方式),GPRS接人点APN(公网默认值为cmnet,专网由电信运营商分配),用户名(wap),密码(wap):
at ^sics =0,conType,gprs0
at^sics=0,user,wap
at^sics=0,passwd,wap
at^sics=0,apn,"cmnet"
(8) Internet服务配置命令,可配置10个服务,其中可配置SOCKET服务最多6个,FTP服务1个,HTTP服务2个,SMTP,POP3各1个。此处设置0号服务配置服务类型为SOCKET TCP客户端,按0号配置连接。IP地址和端口号为61.183.125.114:10010。
at^siss=0,srvType,socket;
at^siss=0,conld,0;
at^siss= 0, address,“socktcp://61.183.125.114:10010"<CR>
另外 ,1号服务配置为FTP下载服务,用于ftp方式远程更新终端程序:
at ^siss= 1,srvType, ftp ;
at^siss= l,conld, 0 ;
at^siss = 1,address,ftp: //usr: pswd@61.183.125.114:2121/ in;type=a<CR>
(9) 打开Internet服务命令,打开0号服务:
at^siso= 0<CR>
(10 )数据发送命令,请求0号服务发送256个字节数据:
at"^sisw=0 ,256
若返回^SISW :0 ,256 表示允许发送256字节数据。
为^SISW :0 ,0表示不允许发送
(注:TCP方式下请求发送的字节须不超过1 500个,UDP方式为1 460个,否则将被拒绝),允许后即可传输待发送的数据。
(11 )数据接收命令at^sisr=0,15 00请求从Internet上读取1 500(最大值)字节数据。如返回^SISR: 0, 72表示72个字节等待读取。(注:当服务器向SOCKET Client (MC55)发送数据时,MC55将接收的数据暂存于5千字节的数据缓冲中,并向数据终端发送提示码:" SISR. 0, 1表示已收到下行数据)。
(12 )关闭 Internet服务命令,关闭0号服务:at^sisc=0<CR>,当MC55检测到与主机的连接断开时会向终端发送提示码:^SISO, 0, 47。此时须先关闭服务才能重新打开。
7、GPRS通信应用程序的实现
由于MC55没有所谓在线模式和命令模式,所有对其的控制均通过AT命令来实现。对于MC55的操作主要包括二个步骤:第1步是GPRS连接服务的建立(SOCKET服务、FTP服务、短信),第2步是进行相关的数据传输操作。下面我们以建立SOCKET连接和进行数据传输为例,我们建立如下的结构体:
typedef struct
{
Uint16 WaitAckTime;
Uint16 FrameSize;
Uint16 RepeatTimes;
Uint16 BeatTime;
Uint16 Csq;
Uint16 GprsWaitingAck:1;
Uint16 SendDoing:1;
Uint16 CommSta:4;
Uint16 ATIndex:4;
Uint16 ATWLeng:1;// 写长度
Uint16 ATWData:1;// 写数据
Uint16 ATRLeng:1;// 读长度
Uint16 PowerOn:1;// 上电过程
Uint16 t10ms:1;// 10ms
Uint16 RES:1;
//******** AT 发送相关标志 ********
Uint16 SATRead:1 ;//发送AT读命令
Uint16 SATWrt:1 ; //发送AT写命令
Uint16 SATClose:1 ; //发送AT关机命令
Uint16 SATLgin:1 ;//发送AT登陆
Uint16 SATHeat:1 ;//发送AT心跳
Uint16 SATCmd:1 ;//发送数据
Uint16 SData:1 ;//发送数据
Uint16 Reset:1; //重启
Uint16 FrameOK:1; //帧处理
Uint16 DoCSQ:1; //场强
Uint16 DoClose:1; //close sorket
Uint16 HasLink:1; //在线标志
Uint16 Writed:1; //写完成
Uint16 HasErr:1; //有err
Uint16 BeatCnt:2;
}GPRS_DEV;
typedef struct
{
unsigned char DataOutBuf[GPRS_BUF_SIZE];//GPRS用于准备发送的缓存区
unsigned char DataInBuf[GPRS_BUF_SIZE];// GPRS用于接收的缓存区
unsigned char ATCmdBuf[64];
unsigned char ATCmdLen;
unsigned char DataInLen;
unsigned char DataOutLen;
unsigned char DataInBeg;//接收数据开始位置
unsigned char DataInPos;
unsigned char DataOutPos;
}GPRS_BUF;
const char ModemCommand[][50] =
{ "ATE\r",
"at^sics=0,conType,GPRS0\r",
"at^sics=0,user,gprs\r",
"at^sics=0,passwd,gprs\r",
"at^sics=0,apn,CMNET\r",
"at^siss=0,srvType,socket\r",
"at^siss=0,conID,0\r",
"at^siss=0,address,\"socktcp://60.168.82.178:1121\"\r",
"at^siso=0\r",
"AT+CSQ\r",
};//控制MC55的AT命令数组
(1) 初始化MC55并建立SOCKET服务连接
函数名称 功能描述
void InitModem(int times) 初始化MC55
int GetIpPortAtStr(char * textstr ) 设置模块的IP地址和端口号
void SetAtCmd(char *pdst) 发送AT命令到命令缓冲区
void GPRSSendCmd() 将命令缓冲区中的命令发给MC55
void HandleAtComm() 建立连接服务的处理函数
(2) 数据传输操作
函数名称 功能描述
void HandLogin(); 登陆处理
void HandHeart(); 心跳发送,维持链路的连接
void HandSISR() 数据传输时的读操作
void HandSISW() 数据传输时的写读操作
void GetCSq() 获得GPRS的信号强度
void HandleLinkComm() 数据传输操作的处理函数
整个GPRS的操作处理函数如下:
void HandGprsCom()// GPRS处理
{ static int gprs_tick=0;
if(GprsDev.Reset) //Reset
{ InitModem(1000);
GprsDev.Reset=0;
}
gprs_tick++; //时间处理
if(gprs_tick==100) //1s
{ gprs_tick=0;
if(GprsDev.BeatTime>0) //Gprs BeatTime
{
GprsDev.BeatTime--;
if(GprsDev.CommSta==GPRS_COMMSTA_LINK)
{
if(GprsDev.BeatTime==devRunParam.BeatCycle*60+250)
GprsDev.DoCSQ=1;
if(GprsDev.BeatTime==300)
{
if(GprsDev.BeatCnt==0) GprsDev.SATLgin=1;
else GprsDev.SATHeat=1;
GprsDev.BeatCnt++;
}
}
if(GprsDev.BeatTime<180) GprsDev.Reset=1;
}
}
if(GprsDev.WaitAckTime)
{ GprsDev.WaitAckTime--; if( GprsDev.GprsWaitingAck && GprsDev.WaitAckTime==0)
{
GprsDev.GprsWaitingAck=0;
GprsDev.RepeatTimes++;
if(GprsDev.RepeatTimes<4)SendAtCom();
}
}
if(!GprsDev.PowerOn) //上电过程
{
if(GprsDev.WaitAckTime==550)
{ EN_ON; }
else if(GprsDev.WaitAckTime==480)
{ IGT_HIGH; }
else if(GprsDev.WaitAckTime==470)
{ IGT_LOW; }
else if(GprsDev.WaitAckTime==420)
{ IGT_HIGH; }
else if(GprsDev.WaitAckTime==0)
{ GprsDev.PowerOn=1;
GprsDev.CommSta=GPRS_COMMSTA_ATCOM;
SendAtCom();
}
}
if(ComParm[2].RxEnd)//通讯处理
{
if(GprsDev.PowerOn)
{
if(GprsDev.CommSta<=GPRS_COMMSTA_ATCOM)
HandleAtComm();
else if(GprsDev.CommSta>=GPRS_COMMSTA_LINK)
HandleLinkComm();
}
ComParm[2].RxEnd=0;
}
if(GprsDev.PowerOn)
{
HandleUartCRX();//收处理
if(GprsDev.SATLgin)
{
HandLogin(); //发送AT登陆
GprsDev.SATLgin=0;
}
if(GprsDev.SATHeat)
{
HandHeart(); //心跳发送
GprsDev.SATHeat=0;
}
if(GprsDev.SATCmd)
GPRSSendCmd();
if(GprsDev.FrameOK)
{
GprsDev.FrameOK=0;
if(GprsDev.HasLink) //i add
SendATDataLen();
}
if(GprsDev.DoCSQ && !GprsDev.SATCmd )
{
SetAtCmd((char *) ModemCommand[9]);
GprsDev.DoCSQ=0;
}
if(GprsDev.DoClose && !GprsDev.SATCmd)
{
SetAtCmd((char *)"at^sisc=0,1\r");
GprsDev.DoClose=0;
GprsDev.HasLink=0;
}
if(GprsDev.SData) //发处理
HandleUartCTX();
}
}