0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GPRS模块TCP虚连接的解决方法

物联网资讯 ? 2018-08-17 09:57 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在GPRS数据模式通信中,TCP服务器端意外断开时,GPRS模块仍然保持连接状态造成虚连接现象。提出了缩短未确认时间和定时判断的方法,较好地解决了虚连接现象,实现了GPRS模块自动联网功能。 关键词: GPRS;TCP;虚连接 在路灯监控、水文情况调查等众多数据采集与监控场合,GPRS模块得到广泛应用。然而,由于PC机意


1 TCP虚连接
通常客户端和服务器端之间断开需要经历4个过程。图1所示即为客户机主动与服务器断开连接的过程。客户机端完成任务后,发送FIN码,表明这个方向上不再有数据要传送;服务器收到后,以ACK进行回应;服务器端如果要结束到客户端的连接,则发送FIN码,客户机以ACK进行回应,此后客户机和服务器完成了安全的连接断开过程[1]。
图1以客户机要求结束连接为例,实际上服务器端也可以发出主动要求结束连接的FIN码。

2012111404372508399670.gif

如果服务器电脑断电、电缆断线、服务器软件被强制关闭等情况下,服务器来不及安全地关闭,而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所示。

2012111404372513086671.gif

从表1可以看出,如果PC机端突然断开,则tcpOt需要100 min才能感知到,造成了虚连接。
指令AT^SISI=0可以返回0号连接的当前状态。返回字符串格式如下:
^SISI:,,,
,,
OK
其中, 表明是哪个连接profile,表明当前状态。可能的状态如表2所示。

2012111404372514649672.gif

从表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模块应用案列

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    用于四频 GSM / GPRS 的 iPAC? PA 模块 skyworksinc

    电子发烧友网为你提供()用于四频 GSM / GPRS 的 iPAC? PA 模块相关产品参数、数据手册,更有用于四频 GSM / GPRS 的 iPAC? PA 模块的引脚图、接线图
    发表于 08-20 18:31
    用于四频 GSM / <b class='flag-5'>GPRS</b> 的 iPAC? PA <b class='flag-5'>模块</b> skyworksinc

    Tx–Rx iPAC? 前端模块 – 四频 GSM/GPRS skyworksinc

    电子发烧友网为你提供()Tx–Rx iPAC? 前端模块 – 四频 GSM/GPRS相关产品参数、数据手册,更有Tx–Rx iPAC? 前端模块 – 四频 GSM/GPRS的引脚图、接
    发表于 06-25 18:31
    Tx–Rx iPAC? 前端<b class='flag-5'>模块</b> – 四频 GSM/<b class='flag-5'>GPRS</b> skyworksinc

    Modbus TCP连接多个客户端解决方法-深圳市振鑫通信科技

    ZP-MBS008多主站模块是实现Modbus-TCP连接多个客户端或者服务器通讯设备
    的头像 发表于 06-25 11:07 ?677次阅读
    Modbus <b class='flag-5'>TCP</b><b class='flag-5'>连接</b>多个客户端<b class='flag-5'>解决方法</b>-深圳市振鑫通信科技

    激光焊锡中焊产生的原因和解决方法

    激光焊锡是发展的非常成熟的一种焊接技术,但是在一些参数控制不好的情况下,依然会产生一些焊接问题,比如说焊的问题。松盛光电来给大家介绍一下激光锡焊中焊问题产生的原因及其解决方案。
    的头像 发表于 06-25 09:41 ?561次阅读

    连接器焊接后引脚焊要怎么处理?

    焊接是连接电子元器件与PCB(印刷电路板)的关键步骤,焊接过程中可能会出现焊问题,即焊点未能形成良好的电气和机械连接焊会导致电路接触不良、信号传输不稳定,甚至设备无法正常工作。本
    的头像 发表于 04-08 11:51 ?1202次阅读
    <b class='flag-5'>连接</b>器焊接后引脚<b class='flag-5'>虚</b>焊要怎么处理?

    SMT加工焊大揭秘:判断与解决方法全攻略

    Solder Joint)问题可能会导致电子设备无法正常工作,甚至引发长期可靠性问题。因此,准确判断和有效解决SMT加工中的焊问题对保证产品质量至关重要。 SMT加工焊的判断与解决方法 什么是SMT加工
    的头像 发表于 03-18 09:34 ?710次阅读

    321Y驱动器的常见故障及解决方法

    。 ? 过电流故障 ? ? 现象 ?:驱动器主回路电流超出保护范围?1。 ? 解决方法 ?:检查电源和电缆连接,确保电源线正确连接,电缆无损坏?1。 ? 编码器信号异常 ? ? 现象 ?:电机编码器故障或
    的头像 发表于 03-07 15:50 ?945次阅读

    常见电阻器故障及解决方法

    工作。 解决方法: 使用万用表测量电阻器两端的电阻值,如果为无穷大,则可能是开路。 检查电阻器的焊接点,确保没有焊或断裂。 更换损坏的电阻器。 2. 短路故障 故障现象: 电阻器两端电压为零,电流异常增大。 可能引起电路过热或
    的头像 发表于 01-24 16:41 ?2769次阅读

    电子焊接的常见问题及解决方法

    问题及解决方法: 焊点焊 原因分析 :焊是指焊点表面看似焊接良好,但实际上焊料与焊件之间没有形成良好的冶金结合。焊的原因可能是焊接时间过短、焊接温度过低、焊料质量差等.
    的头像 发表于 01-09 10:28 ?1341次阅读

    工业连接器常见故障及解决方法

    器故障及其解决方法: 1. 接触不良 故障原因: 接触表面氧化或污染。 接触压力不足。 接触件磨损或损坏。 解决方法: 清洁接触表面,去除氧化层和污染物。 检查并调整接触压力,确保接触良好。 更换磨损或损坏的接触件。 2. 连接
    的头像 发表于 12-29 10:13 ?1399次阅读

    Ubuntu系统常见问题及解决方法

    连接到互联网 问题描述: 用户在安装Ubuntu后发现无法连接到互联网。 解决方法: 检查网络连接: 确保网线已正确插入或Wi-Fi已连接
    的头像 发表于 12-12 14:32 ?1785次阅读

    常见伺服系统故障及解决方法

    问题:电源电压不稳、电源连接不良或电源损坏。 驱动器故障:驱动器内部电路损坏或参数配置错误。 电机故障:电机绕组断线、电机损坏或电机连接不良。 解决方法 : 检查电源电压和频率是否符合要求,确保电源线
    的头像 发表于 12-10 10:21 ?2571次阅读

    伺服电机常见故障及解决方法有哪些

    伺服电机在运行过程中可能会遇到多种故障,以下是一些常见故障及其解决方法: 一、伺服电机不转动 故障原因 : 电源未连接或接触不良。 驱动器与电机之间的连接线断裂或接触不良。 驱动器故障。 电机故障
    的头像 发表于 11-20 09:48 ?5191次阅读

    Mobaxterm 常见问题与解决方法

    强大,但用户在使用过程中可能会遇到一些问题。以下是一些常见问题及其解决方法: 1. 连接问题 问题: 无法连接到远程服务器。 解决方法: 确认服务器地址和端口号是否正确。 检查网络
    的头像 发表于 11-10 15:35 ?1.2w次阅读

    逻辑分析仪的常见故障及解决方法

    的建议。 常见故障及解决方法 无法连接设备 原因 :设备驱动程序未正确安装或设备接口故障。 解决方法 :首先检查设备驱动程序是否已正确安装。如果未安装,应下载并安装正确的驱动程序。如果已安装但无法
    的头像 发表于 10-12 15:43 ?2883次阅读