1:wifi的concurrent mode

所谓wifi的共存模式,有以下几种:

    • station mode + station mode
    • station mode + ap mode
    • station mode + p2p mode
    • p2p mode + ap mode

目前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两个网络接口。

ap与sta共存_第1张图片

另外需要注意,这两个网络接口,都是在驱动中虚拟出来的,共享同一个物理硬件,因此他们也共享物理硬件所能达到的throughput,由于他们共同一个物理硬件,所以wlan0和p2p0必须在同一个channel上,因此跟wlan0和p2p0连接的网络都在同一个channel上,这样这个大网络里所有的设备共同参与这个信道的载波侦听/冲突检测,即同一时间只能有一个站在空气中发送无线包。如果刚开始出现ap/p2p跟wlan0的channel不一致的情况,那一般都是ap/p2p断开之前的链接,重新调频到wlan0的信道建立新的链接。

 

wlan0,p2p0都是在linux下的wifi驱动中创建的,譬如进来一个数据包是根据什么标准来判断,该路由到wlan0还是该路由到p2p0,

这是一个很趣的问题;另外wlan0接口和p2p0接口他们的发送数据包是如何调度和管理的,也是一个值得关注的问题。

ap与sta共存_第2张图片

2:station mode + ap mode

本节介绍station+ap的concurrent mode是如何建立的。先上一张整体的框架图:

ap与sta共存_第3张图片

在调试阶段,为了验证ap+sta是否正常工作,我们最好是step by step的先验证sta mode是ok的,然后验证ap

mode是ok的,最后才是sta+ap mode是否ok。

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.confctrl_interface=wlan0update_config=1network={        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 是否已经跟路由器连接上了,在确认已经跟路由器连接上后,这个时候只是关联,鉴权完成,data port打开,但还未分配ip地址。
/ # wpa_cli wpa_cli v2.0-devel-4.2.1Copyright (c) 2004-2012, Jouni Malinen  and contributorsThis 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:e8ssid=ASUS_BEN_NEWid=0mode=stationpairwise_cipher=CCMPgroup_cipher=CCMPkey_mgmt=WPA2-PSKwpa_state=COMPLETEDip_address=192.168.1.136p2p_device_address=00:92:cc:0c:e0:89address=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 Advertisementsnoipv6rsinterface 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。

2.2: ap的启动方式

    • 设定/data/misc/wifi/hostapd.conf内容,由于上面已经加载了wifi驱动,所以这里不需要再加载
/ # cat /proc/1261/cmdline hostapd/data/misc/wifi/hostapd.conf/ # / # / # cat /data/misc/wifi/hostapd.confinterface=p2p0ssid=CAST-0CE089channel=1auth_algs=1wpa=2wpa_passphrase=198d02d6wpa_key_mgmt=WPA-PSKrsn_pairwise=TKIP CCMPctrl_interface=/data/misc/wifi/hostapdbeacon_int=100hw_mode=gieee80211n=1wme_enabled=1max_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的启动是成功。

2.3: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转发功能,应该可以通过浏览器上网了

2.4:

3:参考资料

关于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

 

 

更多相关文章

  1. Android常用的api调用接口
  2. Android 通过代码实现控制数据网络的开关(仅适用于5.0以上)
  3. Android 中的网络操作(HttpURLConnection)
  4. Android 9 网络适配 (系统造成App内图片无法加载解决方案)
  5. Android P 中的网络安全配置指南 network-security-config
  6. Android 4.1模拟器访问服务器接口

随机推荐

  1. Android面经| 问题归纳
  2. inputType属性
  3. Android,采用AIDL编写接口实现IPC 入门
  4. android apk获得系统权限
  5. Android属性动画之XML定义方式
  6. android TextView的字体颜色设置的多种方
  7. Android(安卓)动画系列一:Drawable Animat
  8. Android(安卓)SQLite数据库操作实例
  9. Android动画详细探究
  10. Android——APK 安装位置管理