Android wifi 从连接态自动断开的解决办法(dhcp导致)【转】

摘要:
2、系统在wifi连接的前提下再次通电,保存的wifi热点无法自动连接。3.连接系统wifi后,一段时间后自动断开连接,wifi图标变暗。首先,当wifi在连接后自动断开时,Android上层似乎应该相对智能。连接的wifi肯定有逻辑在断开连接后尝试自动重新连接。但从日志中看,连接已重置并重新连接,但都失败了。未成功重新连接。所以我们开始向下分析重新连接失败的原因。最后,我们发现对dhcp:dhcp请求错误有一个很大的疑问:用于hcpcdtostart的超时。当出现问题时,这是日志的常见部分:dhcpstart失败。

本文转载自:http://blog.csdn.net/DKBDKBDKB/article/details/38490201

对wifi部分的代码流程已经看了段时间,前两天终于解决了工作中遇到的一个wifi问题,问题描述及解决过程如下:

硬件平台:iMx53

软件平台:Android2.3

bug描述:1,选中热点,输入密码之后,会显示“正在获取ip地址。。。”,之后变为已保存而没有连接。

                  2,系统在wifi连接的前提下,重新上电,无法自动连接已保存的wifi热点。

                  3,系统wifi连接后,过一段时间自动断开,wifi图标变暗。

       首先,感觉wifi连接后自动断开这种情况,Android上层应该还算是比较智能的,已连接的wifi在断开后肯定会有尝试自动重连的逻辑实现,但是从log看,connection是有reset和reconnect但是均失败了,没有重连成功。所以开始继续向下分析重连失败的原因,最终发现了dhcp的疑点很大:

 DHCP request error:Timed out waiting for dhcpcd to start

       这是出问题的时候log中通常出现的部分:dhcp start 失败。代码在/system/core/libnetutils/dhcp_utils.c 里边实现。start失败的原因是由于在指定的时间内,init.svc.dhcpcd_wlan0这个prop没有变为“running”态,于是,我在wait_for_property函数中做了重新开启的改动,添加代码如下:

[cpp] view plain copy
 
  1. if (strcmp(name, "init.svc.dhcpcd_wlan0") == 0 &&   
  2.     strcmp(desired_value, "running") == 0) {  
  3.     if (maxnaps == 7) {  
  4.         property_set("ctl.start", "dhcpcd_wlan0");    
  5.         LOGD("kevin 1st set init.svc.dhcpcd_wlan0");  
  6.     } else if (maxnaps == 4) {  
  7.         property_set("ctl.start", "dhcpcd_wlan0");    
  8.         LOGD("kevin 2nd set init.svc.dhcpcd_wlan0");  
  9.     }  
  10. }  

        问题有了很大改善,此后不会再出现start失败的问题,但随之而来的问题出现了:系统重新上电之后,wifi图标显示已连接,但是点击连接上的wifi热点,在弹出的的窗口里边没有ip地址,而此时上层的app确实不能上网,因为点击热点的弹窗是通过get_property接口获取的一系列属性信息,所以分析是两种可能:1,上层没捕获到property;2,底层没有把相应的property set进去。第一种可能性很低,所以直接从第二种情况入手分析,发现这些属性是在dhcp_start接近尾声的时候,通过dhcp的一些脚本执行set进去(/external/dhcpcd/dhcpcd-hooks 脚本路径),设置成功会将property “dhcp.wlan0.result” 设置为“OK”, 此时才能保证上层可获取相应的property, 鉴于此,分析还是dhcp start没有正常启动,因此在/system/core/libnetutils/dhcp_utils.c 里实现的自己的新接口:dhcp_reset(),具体实现如下

[cpp] view plain copy
 
  1. static const char DHCP_SERVER[]         ="dhcpcd_wlan0";  
  2. static const char DHCP_PROP[]           ="init.svc.dhcpcd_wlan0";  
  3. static const char DHCP_RES[]            ="dhcp.wlan0.result";  
  4.   
  5. static int dhcp_reset()  
  6. {  
  7.     int stop_wait = 5;  
  8.     int start_wait = 10;  
  9.     int result_wait = 20;  
  10.     char kvalue[PROPERTY_VALUE_MAX] = {'

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jenkins关闭,重启几种方式Keepalived+Nginx提供前端负载均衡+主从双机热备+自动切换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DD-wrt+Wiwiz搭建私人免费(收费)WiFi认证页面+详细的操作教程

系统需求硬件:已安装了DD-WRT固件的无线路由器注:DD-WRT的Wifidog功能是必须的。所以请选择正确的DD-WRT版本将无线路由器接入Internet。设置并启用无线网络,即使用无线路由器创建一个可用的Access Point。在无线路由器的Web用户界面中SSHD(或Telnet)功能。另外,需要确保:Cron服务已启用Wifidog服务已禁用...

三层交换机dhcp服务配置命令

每个二层交换机上配置好VLAN ,在三层交换机上配置好VLAN  ip  ,在三层交换机上打开fa0/1-fa0/3的trunk ,再给三层交换机配置dhcp服务,下面是VLAN10的,每个VLAN配一遍, sw1#conf t Enter configuration commands, one per line. End with CNTL/Z. sw...

【移动开发】WIFI热点通信(二)

相信大家在上一篇中已经了解了Android中WIFI热点通信的相关操作知识(http://smallwoniu.blog.51cto.com/3911954/1536126),今天我们将在上一篇代码基础之上进行Socket编程,实现一个简单的多人聊天室功能,以达到热点网络上的通信目的。     首先,我们先来看一张最终效果图: <=======>...

LINUX_RHEl6_DHCP服务器配置

安装DHCP服务器 DHCP配置文件 可以使用RHEL 6.0自身携带的RPM包安装,安装结束后DHCP端口监督程序dhcpd配置文件是/etc/dhcp目录中的名为dhcpd.conf的文件。下面手工建立/etc/dhcp/dhcpd.conf文件,该文件通常包括3个部分,即parameters参数、declarations声明和option选项。 1....

DHCP自动地址分配技术详解

一、DHCP 概述 DHCP 是一种运行在客户端和服务器之间的协议, DHCP 客户端向 DHCP 服务器动态地请求网络配置信息, DHCP 服务器根据策略返回相应的配置信息(IP 地址、子网掩码、缺省网关等网络参数)。 DHCP 基本架构DHCP 基本构架示意图    DHCP 基本协议架构中,主要包括以下三种角色: DHCP Client: DHCP...

采用dhcp的Failover协议实施dhcp的热备份

采用dhcp的Failover协议实施dhcp的热备份一、目前的备份方案及缺陷现在的DHCP服务器采用冷备方案,平时只有一台提供服务,只有在主用服务器宕机时才会启用备份服务器。这种方案的缺点是:1、 主用服务器故障时切换延迟大。此时需要将主用从网络上断开,将备用服务器的IP更改为主用的IP。2、 部分用户可能会出现短暂中断。因为lease文件不同步导致重复...