|
项目选用的GPRS模块是华为的EM310,主要是利用其内置的TCPIP协议栈进行数据的传输功能。
我先大概描述一下项目中使用EM310进行数据传输时的流程:
方案1:
Step1: 设备开机时,EM310上电并初始化,在初始化过程中主要是关闭回显、检查SIM卡是否正常、检查模块的信号强度、查询模块是否自动搜网成功、设置为自动休眠模式、Set PDPContext。
Step2: 拨号上网,获得移动内网分配的IP地址和端口号;
Step3: 链接服务器并发送一个数据包(链接之前都会先查询是否在线,AT%ETCPIP?);
Step4: 等待服务器响应;
Step5: 收到响应或者等待响应超时,断开与服务器的链接(AT%IPCLOSE=1);
...
(重复步骤3到5)
....
设备关机时,模块从网络注销(AT%IPCLOSE=5),模块断电。
方案2:
Step1: 设备开机时,EM310上电并初始化,在初始化过程中主要是关闭回显、检查SIM卡是否正常、检查模块的信号强度、查询模块是否自动搜网成功、设置为自动休眠模式、Set PDPContext。
Step2: 拨号上网,获得移动内网分配的IP地址和端口号;
Step3: 链接服务器并发送一个数据包;
Step4: 等待服务器响应;
Step5: 收到响应或者等待响应超时,断开与服务器的链接(AT%IPCLOSE=1);
Step6: 从网络上注销(AT%IPCLOSE=5);
...
(重复步骤2到6)
....
设备关机时,模块断电。
刚开始的时候用的是方案1,调试的时候简单的测试似乎还跑得比较理想,没什么大问题,偶尔有点异常,我也将问题归咎于网络异常或者信号不好的原因上去了。后来进行大强度的测试的时候,问题一个一个都开始冒出来了,现将我碰到的问题大致的列一下:
异常1: Step1中,模块上电进行初始化(模块上电到模块内部的AT命令解释器跑起来,这个之间的时间有点长的说)。等待模块自动搜网(AT+CGREG?查询模块的状态),一般情况下搜个5--10S左右就可以搜网成功了,异常情况就是模块返回的数据表明其没有搜到网络而且已经停止搜索网络了。这个时候应该怎么处理?
异常2:在链接服务器之前先查询模块是否已经掉线了,在没有掉线的情况下(AT%ETCPIP?命令的返回值表明模块仍旧有分配的IP地址和端口号)。可是链接服务器超时,EM310的手册上说“AT%IPOPEN=”这条命令的响应超时为75S,而且在这75S内不允许发送其它AT命令给模块,对于上层应用程序来说这个超时时间有点长。关键是模块如果一旦链接服务器超时了,你哪怕重试N次也还是返回链接超时或者ERROR:2,而这个时候服务器其实是正常工作的。必须重启模块才能连接到服务器。
异常3: 模块刚刚发送一包数据给服务器,立即收到%IPCLOSE的非请求结果码的提示,而这个时候服务器返回的响应数据肯定是收不到了。
碰到这些异常,很是抓狂,因为上层要么就只能丢出异常要么采取一些重试的方法看会不会再来一次就OK了。
在坛子里看到Appcat的解释之后,总算明白自己之前的想法有些想当然了,以为模块只要开机拨号上去之后就会一直在线,以为模块回复的状态表明其在线那就是真的在线了。
原来拨号之后再链接服务器超时是因为其实模块这个时候已经被移动的网关给踢掉了,而模块自身并不知道而已。碰到这个异常也不是一定需要重启模块的,只需要重启模块内部的协议栈就可以了(依次发送AT%IPCLSOE=1 和 AT%IPCLOSE=5,这个方法EM310的手册上还真没有!!!)。大家还提到用心跳包的方式来避免模块被网关踢掉的方法,但是由于我们的应用要求与服务器之间的链接必须是短链接,收发一包数据之后就会断开的,而且系统也会进入低功耗模式,所以心跳包的方法并不能解决我遇到的问题。
于是就有了第二个方案,每次结束与服务器的通讯之后就断开与服务器的链接,并且主动从网络上注销。然后下一次与服务器通讯时再重新拨号,重新链接服务器。
可是第二个方案仍然存在上面碰到的异常1,而且经常会碰到从网络上注销之后,重新拨号时,模块不响应AT%ETCPIP命令的情况。
以上是我这段时间调试EM310时碰到的问题,贴出来大家讨论一下,高人可以指点一下用哪个方案比较合理。又碰到类似情况的朋友也可以出来讨论一下解决方法。
另外,测试方案1的时候发现上午11:00--12:00这个时间段通讯的成功率很低,经常出现无法连接服务器的异常,刚开始我们一直怀疑是公司的网络问题,因为测试服务器是挂在公司的防火墙后面的,后来又专门拉了一个ADSL测试,发现情况有所改善,当我们以为已经找到问题的时候,又发现通讯的成功率和所用的SIM卡也有很大的关系,Oh,MyGOD!!!这下我都傻掉了,似乎与那么多因素相关但又不确定,谁能帮我解释一下!!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|