在gprs数据模式通信中,tcp服务器端意外断开时,gprs模块仍然保持连接状态造成虚连接现象。提出了缩短未确认时间和定时判断的方法,较好地解决了虚连接现象,实现了gprs模块自动联网功能。 关键词: gprs;tcp;虚连接 在路灯监控、水文情况调查等众多数据采集与监控场合,gprs模块得到广泛应用。然而,由于pc机意
1 tcp虚连接
通常客户端和服务器端之间断开需要经历4个过程。图1所示即为客户机主动与服务器断开连接的过程。客户机端完成任务后,发送fin码,表明这个方向上不再有数据要传送;服务器收到后,以ack进行回应;服务器端如果要结束到客户端的连接,则发送fin码,客户机以ack进行回应,此后客户机和服务器完成了安全的连接断开过程[1]。
图1以客户机要求结束连接为例,实际上服务器端也可以发出主动要求结束连接的fin码。
如果服务器电脑断电、电缆断线、服务器软件被强制关闭等情况下,服务器来不及安全地关闭,而tcp客户端又没有关闭连接,就造成了虚连接。
2 目前连接存在的问题
单片机与mg323模块之间通过串口连接,如果需要流控,可以使用9线的串口连接方式,如果只是简单地收发,可以使用3线(tx、rx、gnd)连接即可。本文使用3线连接方式,单片机型号为f020,晶振12 mhz。
应用中,pc机上运行的数据收发软件采用多线程机制异步接收,同时接收界面线程的关闭/打开通信功能的指示。mg323设计为自动连接服务器端,连接后以113 s为周期发送心跳协议包,维持与中心计算机的连接。若判断服务器断开则由mg323负责自动重连服务器。
实践中发现,在以下情况下,gprs模块并不能准确地判断服务器的状态:(1)pc机突然断电;(2)利用进程管理器强行关闭pc机端软件;(3)正常关闭pc机端运行的tcp服务器软件。
上述3种情况模拟了现场实际可能存在的误操作。前两种情况发生时,打开tcp端软件,发现超过10 min仍无客户端连接请求。模拟情况(3)下,共进行30次测试,发现有2次10 min以内无法连接服务器端。对于更长的时间则没有测试,因为通常认为10 min已超过客户忍耐极限。
通过调试,发现在这些情况下,发送“at^sisi=0”命令,返回结果为:“sisi:0,4,20,55,55,0”。其中的‘4’表明gprs模块依然判定和服务器保持着联系。从而出现了虚连接。
查阅资料,了解到gprs模块的默认设置是如果tcp包没有得到确认,需等待6 000 s才关闭当前链接[2]。这将漏记录大量监控数据,是工程上不能接受的。
3 mg323模块相关指令
mg323指令at^scfg=[,],其中str和value如表1所示。
从表1可以看出,如果pc机端突然断开,则tcpot需要100 min才能感知到,造成了虚连接。
指令at^sisi=0可以返回0号连接的当前状态。返回字符串格式如下:
^sisi:,,,
,,
ok
其中, 表明是哪个连接profile,表明当前状态。可能的状态如表2所示。
从表2可以看出,共有5种可能的取值。当服务器异常断开时,通过调试可以看到连接仍然为4。当服务器正常断开时,调试中也能观察到srvstate为4或者5。这说明发生了虚连接。需要程序去发现这种情况。根据以上所述,采用了以下两种方法来处理。
4 解决虚连接措施
4.1 缩短tcp/ip包未确认连接时间
单片机在初始化时发送at^scfg=120指令,设定如果发送的数据2 min内没有获得确认,就关断连接。从而能在at^sisi指令中得到真正的tcp/ip连接状态。程序如下:
str1=”ate0\r”;
i=0;
while(str1[i]!=’\0’)
{
sbuf=str1[i];
i++;
while(ti==0);
}
delay(100); //延时100 ms等待命令完成
str1=”at^scfg=tcpot,120\r”;
i=0;
while(str1[i]!=’\0’)
{
sbuf=str1[i];
i++;
while(ti==0);
}
delay(100);//延时100 ms等待命令完成
4.2 采用定时器周期判断法
使用at^sisi指令查询当前状态,即使有虚连接的可能,数据也表明了已经发送的数据。如果在一定时间内,考虑到心跳协议也要发送数据,则可以判断这一段时间里是否增多。如果数据没有增加,则说明网络实际上已经断开,需要重新连接。部分程序如下:
pt=strstr(recbuf,”^sisi: 0,4);
if(pt!=null)
{
if(timeclk>200*60*5)
{
timeclk=0;
ackdata2=0;
i=11;
while(recbuf[i]!=’,’)
{
ackdata2=ackdata2*10+recbuf[i]-0x30;
i++;
}
if(ackdata2-ackdata1<1)
{ ackdata2=ackdata1=0;
connect();
}
else{ ackdata1=ackdata2;
break;
}
}
以上程序中,recbuf为串口接收的mg323的返回信息,timeclk为经过的时钟节拍,本项目中采用5 ms定时器,在定时器中给timeclk加1,则200×60×5相当于5 min。收到mg323模块返回的数据中,第11个字节开始表明成功发出去的数据,采用数字的ascii编码表示,因此要转成数字数据。程序中,第1行判断是否返回连接串。如果确实是对查询作出了正确的响应,则进行进一步的检查。第4行表明每5 min查一次,如果不设定时查询,则连续执行本程序两次但是确实没有数据被发送的话,将会把确已连接但暂无数据交互的连接误判为虚连接,因为gprs模块要在2 min内发送一个心跳包给服务器,所以5 min内肯定有数据应该发送出去。第9~13行程序得到ackdata数据。第14行进行比较,ackdata2是当前回应的数据,ackdata1是5 min以前的结果,如果两次的数据差值太小的话,说明实质上连接中断了,此时要启动连接服务器的过程,connect()函数执行实际的连接工作。如果处于连接状态,第18行将数据赋予ackdata1保存,以便下次比较。
本文详细分析了gprs模块和服务器计算机tcp通信中tcp三次握手安全断开流程,在意外情况下有可能产生虚连接。在单片机平台上采用了两种方法,利用软件来解决虚连接,均收到良好的效果。测试中,强制关闭服务器软件,拔掉网线或者pc机直接重启,任何时候再打开服务端进行连接,均能保证可靠的连接,说明了设计思路是正确的。
本设计已经应用到水产养殖水质监测系统中,迄今为止已有上千模块的应用,均能保证自动联网。本文的设计思路可以为开发gprs/cdma数据模块的人员提供参考,有较好的应用价值。
参考文档
相关阅读:
gprs模块介绍
gprs模块应用案列
中芯国际:公司未来5-7年有共约34万片12吋新产线建设项目
LED视频处理器故障解决方法
Agilent8594E频谱分析仪2.9GHz原装供应
游泳训练用水下耳机、游泳听音乐最好的耳机推荐
Portal是由Facebook研发的一系列新设备
GPRS模块TCP虚连接的解决方法
如何运用物联网技术2/3D组态搭建出一个智慧大棚?
基于VB的霍尔传感器性能测试系统设计
阻尼二极管型号大全
嵌入式Linux工程师需要了解哪一些知识点
MediaTek召开 ”驾智能 驭未来”车用技术研讨会
蒸汽拖把好用吗?细菌、尘螨、灰尘它统统搞定!
怎样构建显示人的心电图的设备
红魔氚锋全场景TWS耳机体验报告:全场景声音魔法,畅享绝妙视听
为什么说学习PLC不能只看教程,不能手里没实物?
印度法院已禁止该国银行向加密货币相关的公司提供服务
机房内网络设备布局设计
稳压二极管应用于场效应管驱动时的基本介绍
LED驱动器集成电路需要具有的特点
电容器在不放电的情况下为什么不能长期储存电能呢?