最近接到一個調試 wifi 驅動的任務,使用的是 rtl8723bs 芯片組。要求是讓無線設備工作在 station 模式的時候同時開啟一個 ap 熱點。簡單來講就是連接其他 wifi 的同時發出一個 wifi 供其他設備使用。保證都能上網。
拿到這個項目,我首先就想到了 github 上的一個開源項目 create_ap 。這是一個1000多行的 bash 腳本。它能夠在無線網卡支持的時候實現上述的要求。當時,我想能不能直接那 create_ap 過來使用,如果可以,那么就太方便了。
然而測試了一下,果然不行。。。
折騰了一段時間后找到了一條簡單的出路。如下:
獲取到一份完整的 RTL8723BS 驅動代碼
RTL8723BS_driver_and_documents
閱讀了官方文檔(Realtek_WiFi_concurrent_mode_Introduction.pdf) 才發現廠商已經編寫了支持 sta/ap 模式的驅動代碼,只是默認沒有使用。按照文檔說明,我已修改了代碼。
編譯驅動模塊 ( 以 x86_64 為例 )
修改 Makefile 如下部分
ifeq ($(CONFIG_PLATFORM_ANDROID_X86), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
SUBARCH := $(shell uname -m )
ARCH := $(SUBARCH)
CROSS_COMPILE := /bin/gnu-unknow-
KSRC := /lib/modules/4.1.8-yocto-standard/build/
MODULE_NAME :=wlan
找到這幾行,相應修改 ARCH (平台架構) , CROSS_COMPILE (編譯器位置) , KSRC (內核模塊位置) 。
然后直接
$ make
編譯將得到 wlan.ko
加載驅動模塊
如果已經加載了 RTL8723BS 的驅動模塊,請先 # rmmod rtl8723bs
# insmod wlan.ko
成功加載模塊后,執行 $ ip link
即可看到兩個網口: wlan0 , wlan1
其中任意一個網口都可以做 station 模式,或 ap 模式
使用 wpa_supplicant + hostapd 測試模塊是否工作正常
開啟 STATION 模式 ( wlan0 )
# ip link set wlan0 up // 啟用網口
# wpa_passphrase ssid_name wifi_passwd > wifi.conf // 生成 wpa_supplicant 配置文件
# wpa_supplicant -D wext -i wlan0 -c wifi.conf -B // 連接設定的 wifi 並運行在后台
# dhclient wlan0 // 獲取ip (will take a while)
# ip addr // wlan0 已經獲取到 ip
同時開啟 AP 模式 ( wlan1 )
# ip link set wlan1 up
# ip a add 10.0.0.1/24 dev wlan1 //配置 wlan1 的ip
# killall dnsmasq && cp egg_wifi/dnsmasq.conf /etc && dnsmasq //使用 dnsmasq 服務
# ./hostapd egg_wifi/hostapd.conf & //使用源碼中的 hostapd (需要自行編譯) 開啟一個熱點
需要使用給出的 hostapd ,配置文件可自行修改
不出意外將會放出 SSID 為 mark 的 wifi 熱點。
兩個配置文件
dnsmasq.conf
interface=wlan1
dhcp-range=wlan1,10.0.0.2,10.0.0.9,255.255.255.240,12h
dhcp-authoritative
address=/#/10.0.0.1
server=/google/8.8.8.8
hostapd.conf
interface=wlan1
ieee80211n=1
ssid=mark // wifi 熱點名稱
hw_mode=g
channel=7
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
wpa_passphrase=12345678 // wifi 密碼
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
ctrl_interface=/var/run/hostapd
申明:原創文章,轉載請注明出處。