SSU_WLAN使用参考


1. WLAN内核配置说明

1.1. 配置WEXT

Wext是Wireless Extension,是内核中WIFI驱动和用户态进程的标准接口,iwpriv命令依赖这个配置。

image.png

1.2. 配置CFG80211

CFG80211是内核中WIFI驱动和用户态进程的标准接口,在CFG80211出现之前是WEXT,现在越来越多的使用CFG80211。

image.png

1.3. 配置桥接

使用wlan及p2p实现板端WIFI桥接

make menuconfig
1:
Networking support -> Wireless:
[*] cfg80211 - wireless configuration API
2:
Device Drivers->Generic Driver options
[*] Support for uevent helper
3:
Networking support → Networking options
[M] 802.1d Ethernet Bridging

2. 工具使用

2.1. wap_supplicant使用

wpa_supplicant是一个独立运行的守护进程,用来启动无线网络后台服务,在消息循环中处理WPA状态机、控制命令、驱动事件、配置信息等。

常用命令参数如下:

-I <ifname>         // 网络接口名称
-c <conf>           // 配置文件名称
-C <ctrl_intf>      // 控制接口名称
-D<driver>      // 驱动类型名称
-p <driver_param>   // 驱动参数
-b <br_ifname>      // 桥接口名称
-d              // 增加调试信息

使用样例:

/customer/wifi/wpa_supplicant -Dnl80211 -i wlan0 -c /customer/wpa_supplicant.conf -d &

启动无线网络服务,驱动类型为nl80211,使用网络端口名称为wlan0,配置文件路径为/customer/wpa_supplicant.conf。若配置文件中有保存热点信息,则发起连接。

2.2. wpa_cli使用

wpa_cli是客户端程序,与wpa_supplicant通信,搜索、设置和连接网络。

常用命令参数如下(如当前网络接口为wlan0):

wpa_cli –i wlan0 scan           // 扫描附近的热点
wpa_cli –i wlan0 scan_result        // 显示扫描结果
wpa_cli –I wlan0 status         // 查看当前连接信息
wpa_cli –I wlan0 add_network        // 新建一个链接,返回network id
wpa_cli –I wlan0 set_network <network id> <variable> <value> // 设置网络参数,如ssid,psk,keymgmt
wpa_cli –I wlan0 select_network  <network id>       // 选择指定的网络(会断开其它的连接)
wpa_cli –I wlan0 enable_network <network id>        // 使能指定网络
wpa_cli –I wlan0 disable_network <network id>       // 禁用指定网络
wpa_cli –I wlan0 save_config        // 保持连接信息至wpa_supplicant.conf

2.3. iwlist使用

iwlist用于对/proc/net/wireless文件进行分析,得出无线网卡相关信息。

常用命令参数如下(如当前网络接口为wlan0):

iwlist wlan0 scanning               // 扫描当前无线网络
iwlist wlan0 frequen                // 显示频道信息
iwlist wlan0 rate                   // 显示连接速度
iwlist wlan0 power                  // 显示电源模式

2.4. udhcpc使用

udhcpc作为dhcp客户端,动态获取ip。

常用命令参数如下:

-i <ifname> // 网络接口名称
-s <script> // udhcpc script
-a          // 使用arping验证提供的地址
-t <count>  // 发送数据包次数
-T <time>       // 数据包间时间间隔(默认是3s)
-f          // 前台执行
-b          // 后台执行
-n          // 租约获取失败时退出
-q          // 获取到租约后退出

使用样例:

udhcpc -q -i wlan0 -s /etc/init.d/udhcpc.script &

2.5. hostapd使用

hostapd用来将当前设备作为热点,允许其它网络设备接入。

使用样例:

hostapd -B /customer/wifi/hostapd.conf        // -B:在后台执行守护进程

2.6. dnsmasq使用

dnsmasq是一个轻量级的,易于配置的DNS转发器和DHCP服务器。它的目的是给一个小网络提供DNS和可选的DHCP。

常用命令参数如下:

-i <ifname> // 网络接口名称
-C <path>     // 指定配置文件路径(默认为/etc/dnsmasq.conf)
--no-daemon // 非后台执行

使用样例:

dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &

2.7. hostapd_cli使用

hostapd_cli作为hostapd的客户端,使用时,首先需要先启动hostapd主程序。hostapd启动后,运行cli客户端时,会自动去连接当前正在工作的hostapd进程,连接成功后,cli客户端就可以对hostapd应用程序进行参数的获取和控制。

常用命令参数如下:

-i <ifname>     // 网络接口名称
-p <path>       // 控制套接字路径(默认为/var/run/hostapd)
-B              // 后台执行守护进程

使用样例:

/customer/wifi/hostapd_cli -I p2p0 –p /var/run/hostapd all_sta &

3. WIFI功能测试

3.1. 加载WIFI驱动

先insmod加载WIFI驱动,以ssw102b为例,对应驱动是ssw102b_wifi_sdio.ko。执行insmod ssw102b_wifi_sdio.ko,使用ifconfig –a查看,可以看到新生成wlan0及p2p0节点: image.png

3.2. STA模式测试

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/lib:/customer/wifi
mkdir -p /tmp/wifi/run
chmod 777 /tmp/wifi/run
ifconfig wlan0 up

创建wpa_supplicant.conf文件,编辑如下,使用测试热点为“sstest”,密码为“12345678”。

image.png

测试连接:

/customer/wifi/wpa_supplicant -Dnl80211 -i wlan0 -c /appconfigs/wpa_supplicant.conf -d &

获取IP:

udhcpc -q -i wlan0 -s /etc/init.d/udhcpc.script &

查看wlan0信息: image.png

扫描热点:

/customer/wifi/iwlist scanning

系统会自动连接wpa_supplicant.conf中设置好的wifi网络。

3.3. AP模式测试

mkdir -p /var/run/hostapd
mkdir -p /var/wifi/misc
mkdir -p /var/lib/misc
ifconfig p2p0 up
ifconfig p2p0 192.168.1.100 netmask 255.255.255.0

hostapd配置文件在/customer/wifi/hostapd.conf,其中ssid为当前设备的热点名称,wpa_passphrase为设备的连接密码。可修改此文件变更设备名称和密码。

开启热点:

./customer/wifi/hostapd -B /customer/wifi/hostapd.conf
./customer/wifi/dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &

网络设备可以搜索到热点“ssw101bap”,使用手机连接该热点.

3.4. 桥接模式测试

修改/appconfigs/wpa_supplicant.conf,添加外部AP热点信息:

/ # vi appconfigs/wpa_supplicant.conf
ctrl_interface=/tmp/wifi/run/wpa_supplicant
update_config=1

network={
    ssid="sstest"
    psk="12345678"
}

加载驱动:

cd /customer/wifi

mkdir -p /tmp/wifi/run/wpa_supplicant

insmod llc.ko
insmod stp.ko
insmod bridge.ko

hostapd.conf需要添加一项配置项:

interface=p2p0  //ssw101/2b 采用p2p0做ap interface。
bridge=br0      //固定
hw_mode=g       //固定
channel=1

注意: 桥接使用channel,前后端都是一致的。取决于wlan0 连接到ap的channel,此处要填写相应channel。

添加环境变量,将wifi用到的so添加到系统中。一般放置在/customer/wifi下面export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:pwd

初始化wifi模块

ssu938x系列参考脚本./sigma_wifi_init.sh

注:如果遇到 sh: write error: Invalid argument 可以忽略。

建立网卡桥接:

ifconfig wlan0 up
ifconfig p2p0 up
ifconfig wlan0 0.0.0.0
ifconfig p2p0 0.0.0.0
brctl addbr br0
brctl addif br0 wlan0
brctl addif br0 p2p0
ifconfig br0 up

sta连接wifi:

./wpa_supplicant -Dnl80211 -i wlan0 -c /appconfigs/wpa_supplicant.conf -b br0 &
udhcpc -S /etc/init.d/udhcpc.script -i br0

开启AP模式:

./hostapd -B /customer/wifi/hostapd.conf
./dnsmasq -i p2p0 --no-daemon -C /customer/wifi/dnsmasq.conf &
AP: SSID:ssw101bap pwd:12345678

如果sta可以连接外网,那么通过pc连接ssw101bap后,也可以正常连上网络。

注:如果sta连接wifi,出现 wlan0 is not sta mode的错误信息,可能是wifi驱动和kernel没有匹配。请找对应的wifi模组厂,提供新的ko。