nosun / skyiot

Document and Thought about IOT
1 stars 3 forks source link

sdk bug[5-11] 大小循环切换(切网)各种问题 #22

Open evanwang1021 opened 9 years ago

evanwang1021 commented 9 years ago

1、切网后,Android UI线程卡死。但过一段时间又可以恢复。 问题分析:切网过程中,会先后执行释放资源,以及重建资源的工作,如果两个工作间隔时间太短(10ms级),可能出现线程互锁卡死的问题。 解决思路:将释放资源和重建资源的工作移到workerThread,但需要保证workerThread之间的线程同步问题。另外,需要切网断开false和连接true相隔的时间太短,需要将true线程触发时机放在false线程执行完毕之后。

2、切网后,Mqtt重启失败 问题分析:一是可能开启两次mq,导致失败,二是可能抛出MqttException导致。 解决思路:暂时没有特别好的思路,可以尝试用AlarmManager的RTC定时器来定时检查连接的有效性,然后激活连接。最好还是尝试换一套开源程序试试(比如Paho)。

3、多次切到内网后,小循环指令发送没有反馈。在切到外网,大循环发送依然没有反馈(有的时候是大循环挂了,小循环依旧没问题)。 问题分析:可能是每次切到内网,都会和WiFi模块建立连接。但是再次切网的时候,TCP属于异常断开,WiFi模块端的连接没有释放,导致WiFi模块的连接数过多,阻塞了sockA,和sockB。 解决思路:模块的长连接回收时间缩短,设成10s无交互就回收。然后App需要不断发送心跳保活。

4、切到内网后,本来应该走小循环,但是还是大循环。 有可能是模块本身已经很难连接上了

5、切网后,Volley访问被重定向到了360免费WiFi的欢迎页,而且多次请求结果相同。 蛋疼。。。 解决思路:判断如果是HTML,释放掉缓存,重新请求一次。应该会重写Volley的重试类

Others、内网状态一直处于CONNECTING状态 出现过一次,需要整理一下逻辑

evanwang1021 commented 9 years ago

bug3 补充: 可以增加对发送超时的检测,2s钟执行一次对发送包缓存的检测。如果尚在缓存中(未收到回复),则再发一次。连续两次(4s)得不到回复,认为此模块负载重,断开连接,短时间内不再尝试重连。