android手动连接wifi的过程

下面就以手动连接mtk5931的wifi为列,来说明手动连接wifi的过程。

在此之前,先说明下,手动连接的使用场景和作用:

a: 在纯linux的环境下,该手动连接过程,同样适用

b: 在wifi驱动的移植初期,可以通过手动连接来测试该款wifi的基本驱动和wpa_supplicant是否工作正常

c: 通过手动连接,你可以很容易了解wifi的工作过程

d: 通过手动连接,可以很容易的调试,可以很好的定位问题出现哪里。

先概括下wifi手动连接的几个步骤:

a:加载wifi驱动

b:给wifi上电(optional)

c:此时应该出来了网络接口(譬如wlan0),给网络接口上电(ifconfig wlan0 up)

d:对于支持sta/p2p共存的,这个时候可以通过iwpriv命令,生成p2p0网络接口

e:设定wpa_supplicant服务所需的配置文件:wpa_supplicant.conf

f:启动wpa_supplicant,在后台运行

g:启动wpa_cli,并且连接到wpa_supplicant,这个时候可以通过wpa_cli来发送命令给wpa_supplicant来执行。

譬如有时,通过android,有些ap连不上,或不能扫描,或是鉴权失败,则这个时候可以试试通过手动操作来验证问题。如果手动测试是ok的,说明问题是出现在android层的(wifi Setting, wifi framework, wifi service等层)

步骤a:加载wifi驱动

通过insmod命令加载wifi驱动模块,由于mt5931在系统启动阶段的init.rc中,就已经被加载了。所以此处不需要手动加载。见下图(高亮部分即为mt5931所需的驱动模块):

步骤b:由于mt5931的上电,是通过设备节点来控制的。如下:

步骤c:ifconfig wlan0 up

步骤d:通过iwpriv命令,生成了p2p0,通过ifconfig -a命令可以看到,此时已经有两个网络接口了。

步骤e:设置wpa_supplicant.conf文件,关键是设置ctrl_interface字段,因为该字段直接设定了控制socket的服务器端的节点位置。另外通过配置该文件,还可以在起wpa_supplicant时,让wifi直接连接上指定的AP.方法如下:

如上配置文件,是将wpa_supplicant的service端的socket节点设置在/data/misc/wpa_supplicant目录下,该service socket节点将在wpa_supplicant启动阶段根据这个配置的指定就会建立;并且还指定了自动连接wpa2加密方式的ap:ASUS_BEN_NEW

步骤f:启动wpa_supplicant,在后台运行

以上启动命令中,-i选项指定网络接口,由于是sta/p2p共存,所有需要同时指定两个网络接口了。每个接口对应的配置文件通过-c选项来指定;-D选项,用来指定wext方式还是netlink的方式跟内核进行的交互;-dd选项则是设置打印信息的级别为debug级;-N表示开始描述一个新的网络接口;&表示后台执行。

步骤g:启动wpa_cli,其中-p选项,指定该客服端程序要连接到wpa_supplicant中的service端的socket节点的位置,即控制socket的路径。该位置需要跟wpa_supplicant.conf文件中的设定要匹配

至此可以在wpa_cli的命令输入提示符后面,输入要测试的命令。还可以直接敲入help命令,可以得到wpa_cli所支持的命令。在这个下面,可以执行手动连接p2p,手动连接Ap等操作。

譬如测试pktcnt_poll命令:

以及手动执行扫描(scan),和获取扫描结果的命令(scan_results):

由于客服端程序wpa_cli连接到服务器端的控制socket,是通过wpa_ctrl_open函数实现的,该函数展开如下:

structwpa_ctrl * wpa_ctrl_open(constchar*ctrl_path)

{

structwpa_ctrl *ctrl;

staticintcounter = 0;

intret;

size_tres;

inttries = 0;

intflags;

ctrl = os_malloc(sizeof(*ctrl));

if(ctrl == NULL)

returnNULL;

os_memset(ctrl, 0, sizeof(*ctrl));

ctrl->s = socket(PF_UNIX, SOCK_DGRAM, 0);

if(ctrl->s

os_free(ctrl);

returnNULL;

}

ctrl->local.sun_family = AF_UNIX;

counter++;

try_again:   //如下语句指定了客服端的socket节点是在/data/misc/wifi/sockets路径下,并且节点名是有当前线程的ID和一个序号数组成。

ret = os_snprintf(ctrl->local.sun_path, sizeof(ctrl->local.sun_path),

CONFIG_CTRL_IFACE_CLIENT_DIR "/"

CONFIG_CTRL_IFACE_CLIENT_PREFIX "%d-%d",

(int) getpid(), counter);

if(ret =sizeof(ctrl->local.sun_path)) {

close(ctrl->s);

os_free(ctrl);

returnNULL;

}

tries++;

if(bind(ctrl->s, (structsockaddr *) &ctrl->local,

sizeof(ctrl->local))

if(errno == EADDRINUSE && tries

/*

* getpid() returns unique identifier for this instance

* of wpa_ctrl, so the existing socket file must have

* been left by unclean termination of an earlier run.

* Remove the file and try again.

*/

unlink(ctrl->local.sun_path);

gototry_again;

}

close(ctrl->s);

os_free(ctrl);

returnNULL;

}

#if defined(ANDROID) && !defined(PURE_LINUX)

chmod(ctrl->local.sun_path, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);

chown(ctrl->local.sun_path, AID_SYSTEM, AID_WIFI);

/*

* If the ctrl_path isn't an absolute pathname, assume that

* it's the name of a socket in the Android reserved namespace.

* Otherwise, it's a normal UNIX domain socket appearing in the

* filesystem.

*/

if(ctrl_path != NULL && *ctrl_path !='/') {

charbuf[21];

os_snprintf(buf, sizeof(buf),"wpa_%s", ctrl_path);

if(socket_local_client_connect(

ctrl->s, buf,

ANDROID_SOCKET_NAMESPACE_RESERVED,

SOCK_DGRAM)

close(ctrl->s);

unlink(ctrl->local.sun_path);

os_free(ctrl);

returnNULL;

}

returnctrl;

}

#endif /* ANDROID */

ctrl->dest.sun_family = AF_UNIX;

res = os_strlcpy(ctrl->dest.sun_path, ctrl_path,

sizeof(ctrl->dest.sun_path));

if(res >=sizeof(ctrl->dest.sun_path)) {

close(ctrl->s);

os_free(ctrl);

returnNULL;

}//开始发起连接到service端的socket节点

if(connect(ctrl->s, (structsockaddr *) &ctrl->dest,

sizeof(ctrl->dest))

close(ctrl->s);

unlink(ctrl->local.sun_path);

os_free(ctrl);

returnNULL;

}

/*

* Make socket non-blocking so that we don't hang forever if

* target dies unexpectedly.

*/

flags = fcntl(ctrl->s, F_GETFL);

if(flags >= 0) {

flags |= O_NONBLOCK;

if(fcntl(ctrl->s, F_SETFL, flags)

perror("fcntl(ctrl->s, O_NONBLOCK)");

/* Not fatal, continue on.*/

}

}

returnctrl;

} 如下你可以看到wpa_cli进程号是1517,而/data/misc/wifi/sockets下的client端socket节点的名字就是以该进程ID和序号组成的。两个节点,一个用来传输控制命令,一个用来接受wpa_supplicant报上来的事件。

再来看下services段的socket节点,如上wpa_supplicant.conf文件所指定的,service端的控制socket节点,是在如下路径的:

service端的socket节点名字就是各自的网络接口名字。

android 手动连接wifi,android手动连接wifi的过程相关推荐

  1. android网络的评分机制、连接国内ap wifi不回连问题

    前言: 本文介绍了android下网络的评分机制,同时分析wifi连接国内ap时,重新打开wifi后,wifi不回连ap的问题,并提供解决方法. android下可以有多种网络存在,如:wifi.mo ...

  2. Android中Wi-Fi扫描、连接和信息(一)

    1.Wi-Fi介绍 Wi-Fi是一种允许电子设备连接到一个无线局域网(WLAN)的技术,通常使用2.4G UHF或5G SHF ISM 射频频段.连接到无线局域网通常是有密码保护的:但也可是开放的,这 ...

  3. Android之Wifi学习(2)------连接Wifi

    之前有一篇文章已经简单的讲过Wifi的基本知识,请见Android之Wifi学习(1).本文主要在此基础上,进一步完善程序功能,主要功能有打开无线网卡.关闭无线网卡.检查网卡状态.扫描网络.扫描结果. ...

  4. android扫描隐藏wifi,安卓手机连接隐藏wifi 安卓连接隐藏wifi密码-192路由网

    安卓手机怎么连接隐藏wifi信号?近期有用户向小编咨询这个问题.下面小编用一部华为的荣耀3C手机为例,来给大家演示.介绍安卓手机连接隐藏wifi的操作方法.这里小编要提前说明一下,由于手机运行的安卓版 ...

  5. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  6. Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)

    1 需求 通过用户名和密码连接指定wifi热点,网上的代码乱七八糟,没几个可以用,我这边整理了下,测试了华为Android9.0和小米Android9.0和10.0和OPPO Android9.0 都 ...

  7. Android 监听网络连接状态,判断网络连接方式,9.0网络连接,获取已连接WiFi名称SSID和MAC

    获取已连接的WiFi名称 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> ...

  8. Android系统中通过shell命令实现wifi的连接控制

    简介 工作中遇到一个"变态"的需求,在android系统中不通过java层控制wifi的连接(主要是修改ap的essid和password),而是需要通过native层实现对wif ...

  9. Android官方开发文档Training系列课程中文版:连接无线设备之通过WIFI创建P2P连接

    原文地址:http://android.xsoftlab.net/training/connect-devices-wirelessly/wifi-direct.html#permissions Wi ...

最新文章

  1. CentOS 7 下用 firewall-cmd / iptables 实现 NAT 转发供内网服务器联网
  2. C#中数组、ArrayList和List三者的区别
  3. 在mac下安装matplotlib,xlrd
  4. selenium python_Python+Selenium基础入门及实践
  5. java spring 拦截器_Spring MVC拦截器(Interceptor)的配置及使用
  6. mfc打开一个.txt文件并进行处理_文件处理方法Python
  7. 使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
  8. [leetcode]5178. 四因数
  9. cron一点半到两点半之间每分钟_分辨率,定位精度,重复定位精度三者之间有什么关系?...
  10. android rtorrent 编译,rtorrent交叉编译
  11. 手机企业微信下载文件存储地址
  12. 使用 PHPMailer 配合 QQ邮箱 发送邮件
  13. 计算机二级MS office(word 01)
  14. 数据库树形结构存储方法的选择
  15. 【融云出海白皮书免费看】出海洞察之沙特的「土豪行为」盘点
  16. c 语言编译程序的首要工作,2017年计算机基础试题选择题「附答案」
  17. Excel区间数据拆分
  18. Framework学习之旅:Zygote进程
  19. 0x32 数学知识-约数
  20. linux教程for语句,Bash 中的 For 循环详解

热门文章

  1. 亚马逊测评系统软件搭建教程:luminati+候鸟防关联浏览器环境
  2. JAVA 中配置IKAnalyzer扩展词库和停止词库
  3. 电路之KCL和KVL的独立方程数总结
  4. Xilinx Zynq开发教程
  5. Kryo的基本简单使用
  6. Matlab(三)——图像处理实例:去除背景,提取指纹
  7. mysql时间函数详解
  8. 用Multisim14.0仿真电感L、电容C与电阻R的电压、电流相位关系
  9. Windows远程桌面提示CredSSP加密数据库修正
  10. 连接 MySql 数据库