RK3588实现wlan直连
WLAN直连(Wi-Fi Direct),最初称为Wi-Fi P2P(Peer-To-peer),是Wi-Fi协议簇中一种允许两个或多个设备在没有传统无线接入点(Access Point)情况下直接通信的技术。它利用Wi-Fi标准,实现了设备间的点对点连接,具有传输速度快、连接稳定、无需额外网络设备等优点。本文将详细介绍如何在RK3588+WiFi模组的环境下实现WLAN直接的功能。
环境:
CPU:RK3588
WIFI模组:RTL8852bs
内核版本:linux 6.1.75
系统:ubuntu22.04
一、RTL8852bs驱动
实现WLAN直连之前先确定wifi功能可正常使用,因为RTL8852bs编译中添加了’-DCONFIG_PLATFORM_ANDROID’,所以系统中会出现wlan0和p2p0两个wifi网卡。下面的搭建过程以p2p0为例介绍。
驱动配置:
ifeq ($(CONFIG_PLATFORM_ARM_ROCKCHIP), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DCONFIG_RADIO_WORK
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
ifeq ($(shell test $(CONFIG_RTW_ANDROID) -ge 11; echo $$?), 0)
EXTRA_CFLAGS += -DCONFIG_IFACE_NUMBER=2
EXTRA_CFLAGS += -DCONFIG_PLATFORM_ROCKCHIPS
endifARCH := arm
CROSS_COMPILE := /home/android_sdk/Rockchip/Rk3188/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
KSRC := /home/android_sdk/Rockchip/Rk3188/kernelifeq ($(CONFIG_PCI_HCI), y)
EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS
_PLATFORM_FILES := platform/platform_linux_pc_pci.o \platform/platform_ARM_RK_pci.oOBJS += $(_PLATFORM_FILES)
# Core Config
# CONFIG_RTKM - n/m/y for not support / standalone / built-in
CONFIG_RTKM = m
EXTRA_CFLAGS += -DCONFIG_TX_SKB_ORPHAN
# PHL Config
EXTRA_CFLAGS += -DRTW_WKARD_98D_RXTAG
endififeq ($(CONFIG_SDIO_HCI), y)
_PLATFORM_FILES = platform/platform_ARM_RK_sdio.o
endif
endif
二、P2P测试
创建p2p.conf,内容如下:
ctrl_interface=/var/run/wpa_supplicant
update_config=1# Wi-Fi Protected Setup (WPS) parameters# Device Name
# User-friendly description of device; up to 32 octets encoded in UTF-8
device_name=RTL8852CS# Manufacturer
# The manufacturer of the device (up to 64 ASCII characters)
manufacturer=Realtek# Model Name
# Model of the device (up to 32 ASCII characters)
model_name=RTW_STA# Model Number
# Additional device description (up to 32 ASCII characters)
model_number=WLAN_CU# Serial Number
# Serial number of the device (up to 32 characters)
serial_number=12345# Primary Device Type
# Used format: <categ>-<OUI>-<subcateg>
# categ = Category as an integer value
# OUI = OUI and type octet as a 4-octet hex-encoded value; 0050F204 for
# default WPS OUI
# subcateg = OUI-specific Sub Category as an integer value
# Examples:
# 1-0050F204-1 (Computer / PC)
# 1-0050F204-2 (Computer / Server)
# 5-0050F204-1 (Storage / NAS)
# 6-0050F204-1 (Network Infrastructure / AP)
device_type=1-0050F204-1# OS Version
# 4-octet operating system version number (hex string)
os_version=01020300# Config Methods
# List of the supported configuration methods
# Available methods: usba ethernet label display ext_nfc_token int_nfc_token
# nfc_interface push_button keypad virtual_display physical_display
# virtual_push_button physical_push_button
# For WSC 1.0:
#config_methods=display push_button keypad
# For WSC 2.0:
config_methods=virtual_display virtual_push_button keypad# Disable P2P_GROUP_INTERFACE
p2p_no_group_iface=1
执行下面命令:
root@ubuntu:/# wpa_supplicant -i p2p0 -Dnl80211 -c /etc/wpa_supplicant/p2p.conf -B -dd &
root@ubuntu:/# wpa_cli -i p2p0
> status #查看状态
wpa_state=DISCONNECTED
p2p_device_address=ae:f4:2c:96:36:15
address=ae:f4:2c:96:36:15
uuid=cfefb313-4fc6-54f8-bcb5-7c0c53ffd633
>
> p2p_find 30 #发现设备,后面的30是超时时间。
OK
<3>CTRL-EVENT-SCAN-STARTED
<3>P2P-DEVICE-FOUND 7a:34:fd:83:89:db p2p_dev_addr=7a:34:fd:83:89:db pri_dev_type=10-0050F204-5 name='iQOO Neo9' config_methods=0x188 dev_capab=0x25 group_capab=0x0 new=1
> p2p_peers #查看可连接设备
7a:34:fd:83:89:db
> p2p_connect 7a:34:fd:83:89:db pbc #连接对端,如果连接的是手机,这个过程手机会弹出一个连接请求。
OK
<3>P2P-GO-NEG-SUCCESS role=client freq=5220 ht40=0 peer_dev=7a:34:fd:83:89:db peer_iface=7a:34:fd:83:89:db wps_method=PBC
<3>WPS-PBC-ACTIVE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE
<3>CTRL-EVENT-SCAN-STARTED
<3>CTRL-EVENT-SCAN-RESULTS
<3>WPS-AP-AVAILABLE-PBC
<3>Trying to associate with 7a:34:fd:83:89:db (SSID='DIRECT-qh-iQOO Neo9' freq=5220 MHz)
<3>CTRL-EVENT-STARTED-CHANNEL-SWITCH freq=5220 ht_enabled=1 ch_offset=1 ch_width=80 MHz cf1=5210 cf2=0
<3>Associated with 7a:34:fd:83:89:db
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>CTRL-EVENT-EAP-STARTED EAP authentication started
<3>CTRL-EVENT-EAP-STATUS status='started' parameter=''
<3>CTRL-EVENT-EAP-PROPOSED-METHOD vendor=14122 method=1
<3>CTRL-EVENT-EAP-STATUS status='accept proposed method' parameter='WSC'
<3>CTRL-EVENT-EAP-METHOD EAP vendor 14122 method 1 (WSC) selected
<3>WPS-CRED-RECEIVED
<3>WPS-SUCCESS
<3>P2P-GROUP-FORMATION-SUCCESS
<3>CTRL-EVENT-EAP-STATUS status='completion' parameter='failure'
<3>CTRL-EVENT-EAP-FAILURE EAP authentication failed
<3>CTRL-EVENT-DISCONNECTED bssid=7a:34:fd:83:89:db reason=3 locally_generated=1
<3>CTRL-EVENT-DSCP-POLICY clear_all
<3>Trying to associate with 7a:34:fd:83:89:db (SSID='DIRECT-qh-iQOO Neo9' freq=5220 MHz)
<3>CTRL-EVENT-STARTED-CHANNEL-SWITCH freq=5220 ht_enabled=1 ch_offset=1 ch_width=80 MHz cf1=5210 cf2=0
<3>Associated with 7a:34:fd:83:89:db
<3>CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
<3>WPA: Key negotiation completed with 7a:34:fd:83:89:db [PTK=CCMP GTK=CCMP]
<3>CTRL-EVENT-CONNECTED - Connection to 7a:34:fd:83:89:db completed [id=0 id_str=]
<3>P2P-GROUP-STARTED p2p0 client ssid="DIRECT-qh-iQOO Neo9" freq=5220 psk=55d09925d11b463aecee956d8b1620dce13d9c1e013e6836920714bb975d1b8b go_dev_addr=7a:34:fd:83:89:db [PERSISTENT]
>
> status #查看连接状态
bssid=7a:34:fd:83:89:db
freq=5220
ssid=DIRECT-qh-iQOO Neo9
id=0
mode=station
wifi_generation=6
pairwise_cipher=CCMP
group_cipher=CCMP
key_mgmt=WPA2-PSK
wpa_state=COMPLETED
p2p_device_address=ae:f4:2c:96:36:15
address=ae:f4:2c:96:36:15
uuid=cfefb313-4fc6-54f8-bcb5-7c0c53ffd633
ieee80211ac=1
上面是通过命令交互的方式进行连接测试,也可以直接通过"wpa_cli -i p2p0 p2p_peers"这样的方式执行命令。另外上面的p2p0也可以用wlan0,但需要确保wlan0未被使用。
三、Miraclecast
MiracleCast是一个基于Wi-Fi显示规范(也称为Miracast)的开源软件项目,旨在通过无线方式连接外部显示器到您的系统。可通过下面方式获取代码:
git clone https://github.com/albfan/miraclecast.git
编译依赖:
sudo apt-get install -y make cmake gcc g++ libsystemd-dev libreadline-dev check
编译安装:
# cd miraclecast
# mkdir build && cd build
# cmake ../
# make
# sudo make install
完成后会看到多个和miraclecast有关的命令,这里主要用到下面3个命令:
miracle-wifid:这个一个服务的进程,下面两个命令的执行都依赖它。
miracle-wifictl:作为peer用于连接其它设备。
miracle-sinkctl:作为sink用于被其它投屏设备连接
peer连接:
ubuntu@ubuntu:~$ sudo miracle-wifid -i p2p0
ubuntu@ubuntu:~$ sudo miracle-wifictl #另起一个终端执行下面命令
[ADD] Link: 7
[wifictl] # help #查看帮助信息
Available commands:list List all objectsselect [link] Select default linkshow [link|peer] Show detailed object informationset-friendly-name [link] <name> Set friendly name of an objectset-managed [link] <yes|no> Manage or unmnage a linkp2p-scan [link] [stop] Control neighborhood P2P scanningconnect <peer> [provision] [pin] Connect to peerdisconnect <peer> Disconnect from peerquit Quit programhelp Print help
[wifictl] # listLINK INTERFACE FRIENDLY-NAME MANAGED 7 p2p0 <unknown> yes LINK PEER-ID FRIENDLY-NAME CONNECTED 0 peers and 1 links listed.
[wifictl] # select 7
link 7 selected
[wifictl] # p2p-scan
[ADD] Peer: 7a:34:fd:83:89:db@7
[wifictl] # connect 7a:34:fd:83:89:db@7
[CONNECT] Peer: 7a:34:fd:83:89:db@7
[wifictl] # list #正常连接后。可查到连接状态是yesLINK INTERFACE FRIENDLY-NAME MANAGED 7 p2p0 <unknown> yes LINK PEER-ID FRIENDLY-NAME CONNECTED 7 7a:34:fd:83:89:db@7 iQOO Neo9 yes 1 peers and 1 links listed.
[wifictl] #
注意:通过这种方式可以正常连接但是无法实现投屏到,根据代码中的解释,这部分功能未实现,需要自己通过gstreamer之类的工具推流到对端中才行。这个测试过程可以用手机的wlan直连进行测试。
sink连接
ubuntu@ubuntu:~$ sudo miracle-wifid -i p2p0
ubuntu@ubuntu:~$ sudo miracle-sinkctl #另起一个终端执行下面命令
[ADD] Link: 7
[sinkctl] # help
Available commands:list List all objectsshow <link|peer> Show detailed object informationrun <link> Run sink on given linkbind <link> Like 'run' but bind the link name to run when it is hotpluggedset-friendly-name [link] <name> Set friendly name of an objectset-managed <link> <yes|no> Manage or unmnage a linkquit Quit programhelp Print help
[sinkctl] # listLINK INTERFACE FRIENDLY-NAME MANAGED 7 p2p0 <unknown> yes LINK PEER-ID FRIENDLY-NAME CONNECTED 0 peers and 1 links listed.
[sinkctl] # run 7
now running on link 7
[GO NEG] Peer: 7a:34:fd:83:89:db@7 Type: pbc PIN:
[CONNECT] Peer: 7a:34:fd:83:89:db@7
now running on peer 7a:34:fd:83:89:db@7
NOTICE: SINK connected
SINK set resolution 1920x1080
投屏效果如下:
四、问题汇总
使用Miraclecast源码编译的名称在进行connect时,无法正常连接。内核提示如果错误:
出现这个问题的原因是运行"miracle-wifid -i p2p0"会自动生成一个类似上面"p2p.conf"文件,通过进程可以看到这个问题被放在什么位置,查看文件可以看到配置文件中少了"p2p_no_group_iface=1",可以试着在p2p测试的时候将这个选项删除掉,p2p测试连接是也会报错。这里需要修改Miraclecast源码,将"p2p_no_group_iface=1"添加进去重新编译安装。
diff --git a/src/wifi/wifid-supplicant.c b/src/wifi/wifid-supplicant.c
index 9d8ef91..cb58e0c 100644
--- a/src/wifi/wifid-supplicant.c
+++ b/src/wifi/wifid-supplicant.c
@@ -2629,6 +2629,7 @@ static int supplicant_write_config(struct supplicant *s)"config_methods=%s\n""driver_param=%s\n""ap_scan=%s\n"
+ "p2p_no_group_iface=1\n""# End of configuration\n",s->l->friendly_name ?: "unknown","1-0050F204-1",