所谓wifi的共存模式,有以下几种:
目前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两个网络接口。
另外需要注意,这两个网络接口,都是在驱动中虚拟出来的,共享同一个物理硬件,因此他们也共享物理硬件所能达到的throughput,由于他们共同一个物理硬件,所以wlan0和p2p0必须在同一个channel上,因此跟wlan0和p2p0连接的网络都在同一个channel上,这样这个大网络里所有的设备共同参与这个信道的载波侦听/冲突检测,即同一时间只能有一个站在空气中发送无线包。如果刚开始出现ap/p2p跟wlan0的channel不一致的情况,那一般都是ap/p2p断开之前的链接,重新调频到wlan0的信道建立新的链接。
wlan0,p2p0都是在linux下的wifi驱动中创建的,譬如进来一个数据包是根据什么标准来判断,该路由到wlan0还是该路由到p2p0,
这是一个很趣的问题;另外wlan0接口和p2p0接口他们的发送数据包是如何调度和管理的,也是一个值得关注的问题。
本节介绍station+ap的concurrent mode是如何建立的。先上一张整体的框架图:
在调试阶段,为了验证ap+sta是否正常工作,我们最好是step by step的先验证sta mode是ok的,然后验证ap
mode是ok的,最后才是sta+ap mode是否ok。
/ # cat /data/misc/wifi/wpa_supplicant.conf ctrl_interface=wlan0 update_config=1 network={ ssid="ASUS_BEN_NEW" psk="33333333" priority=1 }
/ # wpa_cli wpa_cli v2.0-devel-4.2.1 Copyright (c) 2004-2012, Jouni Malinen <[email protected]> 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)
/ # 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
/ # 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来跟他连接。
至此,station mode和ap mode都已经启动成功,并且wlan0和p2p0都有ip地址,但这个时候,你在BXXX或mid上却不能ping通百度的ip地址(ping 180.76.3.151),但是在BXXX上可以ping 通route,在mid上可以ping通BXXX(见上面的框架图),为什么呢,因为你没有设置默认路由的关系。
关于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