关于WIFI的工作模式--AP MODE/STATION MODE
wifi的concurrent mode
所谓wifi的共存模式,有以下几种:
- station mode + station mode
- station mode + ap mode
- station mode + p2p mode
- p2p mode + ap mode
WIFI模块通常支持几种工作模式,但也可以支持两种模式并存,即AP MODE & STATION MODE。注意,这两个网络接口,都是在驱动中虚拟出来的,共享同一个物理硬件
AP MODE通用应用在无线局域网成员设备(即客户端)的加入,即网络下行。它提供以无线方式组建无线局域网WLAN,相当际WLAN的中心设备。
那STATION MODE,即工作站模式,也可以理解为某个网格中的一个工作站即客户端。那当一个WIFI芯片提供这个功能时,它就可以连到另外的一个网络当中,
如家用路由器就是这种,AP MODE提供给手机设备等连接,提供上网功能,实际能提供上网功能的就是STATION MODE做为INTERNET的一个工作站,所以
STATION MODE通常用于提供网络的数据上行服务。
在芯片支持的前提下,LINUX或EMBED LINUX SYSTEM都提供了相应的驱动支持,可以使两种模式同时存在,同时工作。
目前android自从JB version后,就开始支持station + p2p的共存,但其他的共存模式目前在android上都还未支持。现在市面上的wifi驱动主要是支持前三种共存,目前第四种共存模式,暂未见到;而station+ap mode,目前我们有在BXXX项目中使用,使用场景就是:
做Ap供其他的mid或phone来连接,同时自己又做station mode来连接外面可以上网的路由器,这样在mid或phone上,就可以在访问BXXX的同时,还可以上网。BXXX自己当然也可以上网了。
但需要主要的是,以上各模式中的station,ap,p2p在驱动中都需要对应的网络接口的,所以如果要支持concurrent mode,你的驱动insmod后,必须吐出两个网络接口才行,如果只有一个网络接口,那肯定是不支持concurrent mode的,见下图,加载驱动后就会出现wlan0,p2p0两个网络接口。
2.1:station的启动方式
inmod wifi drivers modules //加载wifi驱动模块,在这里可以指定各个网络接口的名字,正常会出wlan0和p2p0两个网络接口。
ifconfig wlan0 up //打开station mode对应的wlan0网络接口
如下设置wpa_supplicant.conf,这样让station mode一起来就自动去链接指定的ap
/ # cat /data/misc/wifi/wpa_supplicant.conf
ctrl_interface=wlan0
update_config=1 network={
ssid="ASUS_BEN_NEW"
psk="33333333"
priority=1
}
/system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf //启动wpa_supplicant后台服务
执行wpa_cli,就可以查看这个时候station 是
/ # wpa_cli
wpa_cli v2.0-devel-4.2.1
Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> and contributors This software may be distributed under the terms of the BSD license.
See README for more details. Using interface 'wlan0' Interactive mode <3>CTRL-EVENT-SCAN-RESULTS
sta sta_autoconnect status
> status
bssid=50:46:5d:00:68:e8
ssid=ASUS_BEN_NEW
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.1.136
p2p_device_address=00:92:cc:0c:e0:89
address=00:92:cc:0c:e0:89
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=50:46:5d:00:68:e8 SSID=ASUS_BEN_NEW
<3>CTRL-EVENT-CONNECTED - connection to 50:46:5d:00:68:e8 completed (reauth) [id=0 id_str=]
> p2p0: STA a0:f4:59:45:fc:d5 WPA: group key handshake completed (RSN)
否已经跟路由器连接上了,在确认已经跟路由器连接上后,这个时候只是关联,鉴权完成,data port打开,但还未分配ip地址。
/ # wpa_cli
wpa_cli v2.0-devel-4.2.1
Copyright (c) 2004-2012, Jouni Malinen <j@w1.fi> and contributors This software may be distributed under the terms of the BSD license.
See README for more details. Using interface 'wlan0' Interactive mode <3>CTRL-EVENT-SCAN-RESULTS
sta sta_autoconnect status
> status
bssid=50:46:5d:00:68:e8
ssid=ASUS_BEN_NEW
id=0
mode=station
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
ip_address=192.168.1.136
p2p_device_address=00:92:cc:0c:e0:89
address=00:92:cc:0c:e0:89
<3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=50:46:5d:00:68:e8 SSID=ASUS_BEN_NEW
<3>CTRL-EVENT-CONNECTED - connection to 50:46:5d:00:68:e8 completed (reauth) [id=0 id_str=]
> p2p0: STA a0:f4:59:45:fc:d5 WPA: group key handshake completed (RSN)
设置/system/etc/dhcpcd/dhcpcd.conf文件
/ # cat /system/etc/dhcpcd/dhcpcd.conf
# dhcpcd configuration for Android Wi-Fi interface
# See dhcpcd.conf(5) for details. # Disable solicitation of IPv6 Router Advertisements
noipv6rs interface wlan0
# dhcpcd-run-hooks uses these options.
option subnet_mask, routers, domain_name_servers
system/bin/dhcpcd -aABKL -f/system/etc/dhcpcd/dhcpcd.conf -handroid-e4cf57339578c6dc wlan0//开始申请ip地址
ifconfig -a //通过这个命令,可以看到这个时候wlan0已经被分配了ip地址。这个时候如果可以ping通路由器的ip地址,说明station mode的启动已经ok。
ap的启动方式
- 设定/data/misc/wifi/hostapd.conf内容,由于上面已经加载了wifi驱动,所以这里不需要再加载
/ # cat /proc/1261/cmdline
hostapd/data/misc/wifi/hostapd.conf/ #
/ #
/ # cat /data/misc/wifi/hostapd.conf
interface=p2p0
ssid=CAST-0CE089
channel=1
auth_algs=1
wpa=2
wpa_passphrase=198d02d6
wpa_key_mgmt=WPA-PSK
rsn_pairwise=TKIP CCMP ctrl_interface=/data/misc/wifi/hostapd
beacon_int=100
hw_mode=g
ieee80211n=1
wme_enabled=1
max_num_sta=8
上面的配置文件中:interface关键字指定ap mode使用的网络接口名字;ssid字段指定了ap的ssid名字;wpa*相关字段设定了ap的加密鉴权方式及密码;ctrl_interface设定控制接口,一般用于hostap_cli来跟他连接。
ifconfig p2p0 up //打开p2p0网络接口
ifconfig p2p0 192.168.5.1 //配置p2p0网络接口的ip地址
hostapd /data/misc/wifi/hostapd.conf & // 启动hostapd后台,至此ap应该可以被其他wifi设备搜索到,说明启动成功,这个时候应该可以关联,鉴权成功,但由于ap端还未启动dhcp service,所以最终未能分配到ip地址而连接失败
/system/bin/dnsmasq --no-daemon --no-resolv --no-poll --address=/b.tv/192.168.5.1 --dhcp-range=192.168.5.2,192.168.5.254,24h //dnsmasq有两个作用:一个是可以起到dhcp service的作用,另一个可以实现dns的forward;上面的--address指定了域名和ip地址的对应关系,--dhcp-range指定了dhcp的地址分配范围
设定dnsmasq的dns转发,通常设定为8.8.8.8或8.8.4.4//不设定的话,mid或phone后面虽然可以通过ip地址ping通百度,但却不能够通过浏览器来浏览网页,原因就是dnsmasq的dns没有设置好
这个时候,其他wifi设备如果能够扫描到它,并且还能连上它,分配的ip地址也是在192.168.5.2到192.168.5.254之间,并且能够ping通路由器的ip(在这里是192.168.5.1),说明ap mode的启动是成功。
station 与 ap之间的路由
至此,station mode和ap mode都已经启动成功,并且wlan0和p2p0都有ip地址,但这个时候,你在BXXX或mid上却不能ping通百度的ip地址(ping 180.76.3.151),但是在BXXX上可以ping 通route,在mid上可以ping通BXXX(见上面的框架图),为什么呢,因为你没有设置默认路由的关系。
- route add 192.168.1.1 wlan0 //在BastCast上,为wlan0接口添加路由
- route add 192.168.5.1 p2p0//在BastCast上,为p2p0接口添加路由
- route add default gw 192.168.1.1 ////在BastCast上,添加默认路由
- iptables -t nat -A natctrl_nat_POSTROUTING -o wlan0 -j MASQUERADE //设定nat,这样内网才能给外网通讯
- echo 1 > /proc/sys/net/ipv4/ip_forward //是能内核的ip转发功能,默认是禁止的。
- ping 180.76.3.151 //这个时候在BXXX上应该就可以ping通百度的ip地址了
- 如果正确设置了dnsmasque的dns转发功能,应该可以通过浏览器上网了
参考资料
关于iptable:http://kuangkuang.blog.51cto.com/838/247230
关于dnsmasq:https://wiki.archlinux.org/index.php/Dnsmasq
关于dnsmasq:http://blog.chinaunix.net/uid-192452-id-3991843.html
关于realteck wifi的参考文件:
Realtek_WiFi_concurrent_mode_Introduction.pdf
Quick_Start_Guide_for_Station_Mode.pdf
Quick_Start_Guide_for_SoftAP.pdf
wpa_cli_with_wpa_supplicant.pdf
关于WIFI的工作模式--AP MODE/STATION MODE的更多相关文章
- ESP8266开发之旅 网络篇② ESP8266 工作模式与ESP8266WiFi库
在网络篇①中,博主主要讲解了Arduino上开发ESP8266的插件库 Arduino Core For ESP8266.但是,并没有讲到关于这个模块的工作模式,所以本篇讲着重讲解ESP826 ...
- 【转载】wifi的两种工作模式
AP:即无线接入点,是一个无线网络的中心节点.通常使用的无线路由器就是一个AP,其它无线终端 可以通过AP相互连接. STA:即无线站点,是一个无线网络的终端.如笔记本电脑.PDA等. 1>工作 ...
- wifi两种工作模式
AP:即无线接入点,是一个无线网络的中心节点.通常使用的无线路由器就是一个AP,其它无线终端 可以通过AP相互连接. STA:即无线站点,是一个无线网络的终端.如笔记本电脑.PDA等. 1>工作 ...
- ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式
Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下 ...
- 实战Java虚拟机之二“虚拟机的工作模式”
今天开始实战Java虚拟机之二:“虚拟机的工作模式”. 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实 ...
- 2.2 ARM处理器工作模式
ARM Architecture Reference Manual Arm 指令框架手册 种工作模式 Processor mode Mode number Description User usr 0 ...
- apache 的工作模式
总结:访问量大的时候使用 worker模式: 每个进程,启动多个线程来处理请求,每个线程处理一次请求,对内存要求比较高. prefoek模式 : 每个子进程只有一个线程,一次请求一个进程. 什么是a ...
- Apache常用2种工作模式prefork和worker比较
Apache两种常用工作模式:prefork和worker. prefork MPM prefork是一个非线程型的.预派生的MPM,使用多个进程,每个进程在某个确定的时间只单独处理一个连接,效率高, ...
- apache查看工作模式及调优
一,查看工作模式 /usr/sbin/httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c 如果出现prefo ...
随机推荐
- [置顶] 《Windows编程零基础》__2 一个完整的程序
Windows开发的常识 1)窗口 Windows中最基本的概念也许就是窗口了,每一个前台程序都至少有一个窗口,一个窗口也是你可以看到的部分,比如,QQ有如下的登录窗口 基本上你在Windows中可见 ...
- VIM复制粘贴大全!
原文地址:http://lsong17.spaces.live.com/blog/cns!556C21919D77FB59!603.entry 内容: 用vim这么久 了,始终也不知道怎么在vim中使 ...
- 在 SUSE 11 sp2 上安装 freeradius
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- spring mvc --自己定义converse
在MVC中我们能够非常轻松的依据项目需求进行必要的信息转换,如设置默认的日期格式,自己定义String类型的格式等等... 配置中我们须要自己定义converseService: <bean i ...
- 教你使用Android SDK布局优化工具layoutopt
创建好看的Android布局是个不小的挑战,当你花了数小时调整好它们适应多种设备后,你通常不想再重新调整,但笨重的嵌套布局效率往往非常低下,幸运的是,在Android SDK中有一个工具可以帮助你优化 ...
- 理解WebKit和Chromium: 调试Android系统上的Chromium
转载请注明原文地址:http://blog.csdn.net/milado_nju 1. Android上的调试技术 在Android系统上,开发人员能够使用两种不同的语言来开发应用程序,一种是Jav ...
- python selenium自动化(一)点击页面链接测试
需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回到原始页面. 要完成这个需求就必须实现3点: 1. 找 ...
- shell脚本分为三类:登录脚本、交互式脚本、非交互式脚本
shell脚本分为三类:登录脚本.交互式脚本.非交互式脚本 一. 登录脚本类似于windows下的计算机设置中的登录脚本和账户设置下的登录脚本的合集(我是这么理解的哈). 其配置文件的关键词为pref ...
- 网络IPC:套接字之非阻塞和异步I/O
通常,recv函数没有数据可用时会阻塞等待.同样地,当套接字输出队列没有足够空间来发送消息时函数send会阻塞.在套接字非阻塞模式下,行为会改变.在这种情况下,这些函数不会阻塞而是失败,设置errno ...