RK3399 android7.1 实现双wifi功能STA+AP并发

wifi模组:
主板使用的wifi模块为海华AW-NM43438W模组以及客户提供了一款USB接口的5G双频无线网卡RTL8821CU

双wifi功能实现效果:
主板自带的wifi模组作为station正常连接外部wifi,USB接口的外接网卡作为AP(热点)供其他设备连接。


一.wifi的station和ap模式以及相关概念

1. AP

无线接入点,是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
在这里插入图片描述

2. AP应用模式

WIFI 串口服务器作为一个 AP 使用,其它 WIFI 串口服务器及电脑都可以作为 STA 连到这个 WIFI 串口服务器上,同时它也可以通过 UART 或GPIO 接口连到用户设备,如图所示:
在这里插入图片描述

3. STA站点

每一个连接到无线网络中的终端(如笔记本电脑、PDA及其它可以联网的用户设备)都可称为一个站点。站点(STA,Station)在无线局域网(WLAN,WirelessLocalAreaNetworks)中一般为客户端,可以是装有无线网卡的计算机,也可以是有WiFi模块的智能手机,可以是移动的,也可以是固定的。在无线环境中STA接入的过程包括:认证STA有没有权限和接入点(AP,AccessPoint)建立链路;STA能不能接入WLAN;以及STA接入WLAN网络之后,认证STA能不能访问网络的权限。
在这里插入图片描述

4. STA 应用模式

串口服务器作为 STA 连接到其它 AP(如局域网中的路由)上,组成一个无线网络。所有的 STA 都以该 AP 作为无线网络的中心,STA 之间的相互通信都通过 AP 转发完成,如图所示:
在这里插入图片描述

5. AP+STA 应用模式

串口服务器可同时支持一个 AP 接口,一个 STA 接口。开启 AP+STA 功能后,STA 和AP 接口同时可用。串口服务器的 STA 接口与路由器相连,并通过 TCPB 与网络中的服务器相连;同时 AP 接口可以被手机/PAD 等连接(通过 TCPA 连接)。如此,网络中的服务器 TCP Server、手机/PAD 等都可以对串口服务器所连接串口设备进行控制或者对串口服务器本身参数进行设置,如图所示:
在这里插入图片描述

6. 相关概念:

AP(Access Point):无线接入点:可以当做一个无线路由器,这个路由器的特点不能插入网线,没有接入Internet,只能等待其他设备的链接,并且智能接入一个设备。
STA(Station):任何一个接入无线AP的设备都可以称为一个站点。也就是平时接入路由器的设备。
SSID(Service Set Identifier):SSID,每个无线AP都应该有一个标示用于用户识别,SSID就是这个用于用户识别的的名字,也就是我们经常说到的wifi名。
BSSID:每一个网络设备都有其用于识别的物理地址,这个东西呢就叫MAC地址,这个东西一般情况下出厂会有一个默认值,可更改,也有其固定的命名格式,也是设备识别的标识符。BSSID是针对设备说的,对于STA的设备来说,拿到AP接入点的MAC地址就是这个BSSID。
ESSID:是一个比较抽象的概念,它实际上就和ssid相同(本质也是一串字符),只是能如果有好几个无线路由器都叫这个名字,那么我们就相当于把这个ssid扩大了,所以这几个无线路由器共同的这个名字就叫ESSID。(也就是如果在一台路由器上释放的wifi信号叫某个名字如“China_CMCC”,这个名字“China_CMCC”就称为SSID;如果在好几个路由器上都释放了这个wifi信号,那么大家都叫“China_CMCC”,这个时候大家都遵循的这个名字就是ESSID。
RSSI:通过STA扫描到AP站点的信号强度。


二,系统中station+ap模式的实现

  1. 首先将两颗wifi的驱动移植好能正常跑起来:
    编译内核可生成对应的ko文件,一般是在 Android系统/system/lib/modules/xxxx.ko

  2. 保证机器自带的wifi连接上路由器,能够正常使用station功能;

  3. 运行start_softap.sh脚本,该脚本默认加载8821cu.ko,通过ndc命令开启2.4G热点和nat路由转发功能;

#!/system/bin/sh

ssid=3399-AP #设置热点的SSID(无线网络名称)为"3399-AP"
passwd=12345678 #设置热点的密码为"12345678"
 
LOGCAT_TAG=softap #设置日志标签为"softap",用于在日志中标识软AP的相关信息
interface=wlan1 #设置接口名称为"wlan1",这是用于启动软AP的无线网络接口

stop(){
    
    
      ndc netd 6001 tether stop
      ndc netd 6002 softap stopap
}

start(){
    
    

       insmod /system/lib/modules/8821cu.ko #加载无线网卡驱动模块
       sleep 3
       busybox ifconfig $interface down
       ndc netd 5000 softap fwreload $interface AP
       busybox ifconfig $interface up
       # cat /sys/class/net/wlan1/address | busybox awk -F':' '{print "-"$5$6}'
       # ssid_suffix=`cat /sys/class/net/$interface/address | busybox awk -F':' '{print "-"$5$6}'`
       # ssid+=$ssid_suffix
       log -t $LOGCAT_TAG "Start wifi softap: name=$ssid, pwd=$passwd"
       echo "Start wifi softap: name=$ssid, pwd=$passwd"

       ndc netd 5001 softap set $interface $ssid broadcast 153 wpa2-psk $passwd
       ndc netd 5002 softap startap

       busybox ifconfig $interface 192.168.43.1
       ndc netd 5003 tether start 192.168.43.2 192.168.43.254

       echo 1 > /proc/sys/net/ipv4/ip_forward
       ndc netd 5004 nat enable $interface wlan0 1 192.168.43.1/24

       ip rule add from all lookup main pref 9999

       SYSTEM_DNS=$(getprop net.dns1)
       iptables -t nat -I PREROUTING -i $interface  -p udp --dport 53 -j DNAT --to-destination $SYSTEM_DNS
}

stop
start

start_softap.sh部分参数解析:
1> interface=wlan1 //默认作为热点的wifi端口为wlan1
2> insmod /system/lib/modules/8821cu.ko //默认加载8821cu驱动,可以根据自己挑选的wifi加载对应的ko,注意Android8.1的路径为/vendor/lib/modules/wifi/8188eu.ko;
3> ndc netd 5001 softap set $interface $ssid broadcast 6 wpa2-psk $passwd //默认是2.4G热点channel 6,如果选择的模块支持5G并且需要用5G作为热点,可以将6改成153;

  1. 生成一个AP热点:name=3399-AP, pwd=12345678(本地测试至少可以供10个设备连接,上限暂时没有测试出来);
    ifconfig可看到wlan0与wlan1两个节点:
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45639314/article/details/132858130