请教GPRS高手关于GPRS掉线重连的实时性问题
{:dizzy:}做了个项目,GPRS掉线是不可避免的,可是掉线后总是很久才会连上来,请问有什么办法能快速实时检测GPRS是否掉线呢?谢谢 程序不是你写的吗? gprs模块有检测链接状态的at指令 这不是关键。关键是楼主发送at指令后,怎么对返回的数据作区分。特别是在gprs网络正在工作的时候。后续的工作才繁琐。 发AT检测状态的话,岂不是要频繁退出数传模式?我想1S检测一下链路状态,如果在退出数传模式时刻有数据正常接收和发送,那样就不好了,我也找不到更好的方式 ourdev.cn 发表于 2012-8-28 11:41 static/image/common/back.gif发AT检测状态的话,岂不是要频繁退出数传模式?我想1S检测一下链路状态,如果在退出数传模式时刻有数据正 ...
在透传的基础上,通信双方遵守一定的约定,也就是添一种协议。
比如,DTU发出信息,上位机需要给个应答,没有应答,或应答错误,就判断链路不正常,转入错误处理
这个协议,可以参考I2C,xmodem,modbus等等,自己规定就好了。 加个心跳确认机制比较可行 我心跳确认是一分钟一次,检测心跳的话,重连速度还是会很慢 兄弟.慢是什么意思..是从断电后直到连接到网络.只是断开发服务器,但是模块的IP还在.然后重连到服务器的时候慢.这个要搞清楚.
应该都是加心跳包来检测的.信认模块自身检测的基础上,更要相信自己的心跳程序才好. 假如我一分钟一次心跳,检测到心跳后,链路断开了,这样如果要重连的话就得等一分钟后的下一次心跳检测了,这样重连比较慢 5楼正解! 不要过于依赖模块自己的透传。否则享受它带来的便利的同时也要忍受它的毛病。 苹果猫你好,其实我想问的是,如何实时检测GPRS链路的状态,也就是说如果掉线了,如何马上知道? 本帖最后由 dadatou 于 2012-8-31 16:51 编辑
我认为,一分钟内检测到链路断开,应该算是响应比较快的了.
我用过有方的模块,每次发送数据后,通过检测模块内可用缓冲区的大小,如果缓冲区大小会变化并最终到达最大值,则消息发送成功,如果缓冲区大小没有到最大值,并且没有变化,则判断掉线,重联并重新发送.
要做一个比较大的环形缓冲区,避免在数据发送失败或掉线的情况下,出现数据丢失的情况. Appcat 发表于 2012-8-31 10:46 static/image/common/back.gif
5楼正解! 不要过于依赖模块自己的透传。否则享受它带来的便利的同时也要忍受它的毛病。 ...
5楼确实是一种不错的方法,在DTU端主动发送信息的情况下,服务器必须要有应答,根据应答来判断GPRS是否掉线,但在有些应用场合,是服务器主动查询DTU端的数据,DTU为从机,这种情况下,用上述方法就显得繁了. ourdev.cn 发表于 2012-8-31 16:40 static/image/common/back.gif
苹果猫你好,其实我想问的是,如何实时检测GPRS链路的状态,也就是说如果掉线了,如何马上知道? ...
5楼说的不是很清楚了吗? 晕,不理解{:dizzy:} ourdev.cn 发表于 2012-8-31 18:08 static/image/common/back.gif
晕,不理解
不要依赖模块,模块是傻的,它没办法知道链路中间环节的情况,他只有在协议规定的时间内没有收到响应才会报错,TCPIP协议的各版本这个时间不是确定的,但是一般也要将近10分钟。
在应用协议层做文章,有发送有应答,超过10秒应答不到就认为出错,重新进行连接,这不是很好嘛? 我们也在用GPRS,SIM900,每10s向服务器汇报一次数据,服务器应答一条数据,如果多次没有收到服务器的应答,就认为掉线,转入重连。如果多次没有收到send ok 也认为掉线,转入重连。 可恨的是,我做的项目中GPRS使用心跳包保持与服务器的连接,但是服务器是每隔一个小时才会应答GPRS模块,服务器对于心跳包只是用作下位机的ID号,所以这里如果我掉线了,我得两个小时之后才能知道,我的更慢 你详细看看AT命令,里面有状态检测的
页:
[1]