ap与sta共存


分类: android wifi   328人阅读  评论(8)  收藏  举报
linux wifi apsta concurr

目录(?)[+]

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,目前我们有在Best Cast项目中使用,使用场景就是:

做Ap供其他的mid或phone来连接,同时自己又做station mode来连接外面可以上网的路由器,这样在mid或phone上,就可以在访问BestCast的同时,还可以上网。Best Cast自己当然也可以上网了。

 

但需要主要的是,以上各模式中的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
[cpp]  view plain copy
  1. / # cat /data/misc/wifi/wpa_supplicant.conf  
  2. ctrl_interface=wlan0  
  3. update_config=1  
  4.   
  5. network={  
  6.         ssid="ASUS_BEN_NEW"  
  7.         psk="33333333"  
  8.         priority=1  
  9. }  
    • /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf //启动wpa_supplicant后台服务
    • 执行wpa_cli,就可以查看这个时候station 是否已经跟路由器连接上了,在确认已经跟路由器连接上后,这个时候只是关联,鉴权完成,data port打开,但还未分配ip地址。
[cpp]  view plain copy
  1. / # wpa_cli   
  2. wpa_cli v2.0-devel-4.2.1  
  3. Copyright (c) 2004-2012, Jouni Malinen <[email protected]> and contributors  
  4.   
  5. This software may be distributed under the terms of the BSD license.  
  6. See README for more details.  
  7.   
  8.   
  9. Using interface 'wlan0'  
  10.   
  11. Interactive mode  
  12.   
  13. <3>CTRL-EVENT-SCAN-RESULTS   
  14. sta sta_autoconnect status  
  15. > status   
  16. bssid=50:46:5d:00:68:e8  
  17. ssid=ASUS_BEN_NEW  
  18. id=0  
  19. mode=station  
  20. pairwise_cipher=CCMP  
  21. group_cipher=CCMP  
  22. key_mgmt=WPA2-PSK  
  23. wpa_state=COMPLETED  
  24. ip_address=192.168.1.136  
  25. p2p_device_address=00:92:cc:0c:e0:89  
  26. address=00:92:cc:0c:e0:89  
  27. <3>CTRL-EVENT-STATE-CHANGE id=0 state=9 BSSID=50:46:5d:00:68:e8 SSID=ASUS_BEN_NEW  
  28. <3>CTRL-EVENT-CONNECTED - connection to 50:46:5d:00:68:e8 completed (reauth) [id=0 id_str=]  
  29. > p2p0: STA a0:f4:59:45:fc:d5 WPA: group key handshake completed (RSN)  
    • 设置/system/etc/dhcpcd/dhcpcd.conf文件
[cpp]  view plain copy
  1. / # cat /system/etc/dhcpcd/dhcpcd.conf  
  2. # dhcpcd configuration for Android Wi-Fi interface  
  3. # See dhcpcd.conf(5) for details.  
  4.   
  5. # Disable solicitation of IPv6 Router Advertisements  
  6. noipv6rs  
  7.   
  8. interface wlan0  
  9. # dhcpcd-run-hooks uses these options.  
  10. 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驱动,所以这里不需要再加载
[cpp]  view plain copy
  1. / # cat /proc/1261/cmdline   
  2. hostapd/data/misc/wifi/hostapd.conf/ #   
  3. / #   
  4. / # cat /data/misc/wifi/hostapd.conf  
  5. interface=p2p0  
  6. ssid=CAST-0CE089  
  7. channel=1  
  8. auth_algs=1  
  9. wpa=2  
  10. wpa_passphrase=198d02d6  
  11. wpa_key_mgmt=WPA-PSK  
  12. rsn_pairwise=TKIP CCMP  
  13.   
  14. ctrl_interface=/data/misc/wifi/hostapd  
  15. beacon_int=100  
  16. hw_mode=g  
  17. ieee80211n=1  
  18. wme_enabled=1  
  19. 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的启动是成功。

2.3:station 与 ap之间的路由

至此,station mode和ap mode都已经启动成功,并且wlan0和p2p0都有ip地址,但这个时候,你在BestCast或mid上却不能ping通百度的ip地址(ping 180.76.3.151),但是在BestCast上可以ping 通route,在mid上可以ping通BestCast(见上面的框架图),为什么呢,因为你没有设置默认路由的关系。

    • 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 //这个时候在Bestcast上应该就可以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

你可能感兴趣的:(android,wifi)