当前位置: 首页 > ds >正文

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",
http://www.xdnf.cn/news/16940.html

相关文章:

  • 一致连续性背后的直觉是什么?
  • 【通用视觉框架】基于QT+Halcon开发的流程拖拽式通用视觉框架软件,全套源码,开箱即用
  • windows mamba-ssm环境配置指南
  • 洛谷P4479第K大斜率
  • c#保留小数点后几位 和 保留有效数字
  • 【智能体agent】入门之--4.1 autogen agentic rag
  • C++继承中虚函数调用时机问题及解决方案
  • CG--逻辑判断1
  • 译 | BBC Studios团队:贝叶斯合成控制方法SCM的应用案例
  • C++ --- stack和queue的使用以及简单实现
  • 第三章 网络安全基础(一)
  • PendingIntent相关流程解析
  • 京东零售在智能供应链领域的前沿探索与技术实践
  • 逻辑回归召回率优化方案
  • 《协作画布的深层架构:React与TypeScript构建多人实时绘图应用的核心逻辑》
  • 插件升级:Chat/Builder 合并,支持自定义 Agent、MCP、Rules
  • Spring Boot 2.1.18 集成 Elasticsearch 6.6.2 实战指南
  • 使用GPU和NPU视频生成的优劣对比
  • 修改DeepSeek翻译得不对的V语言字符串文本排序程序
  • (线段树)SP2916 GSS5 / nfls #2899 查询最大子段和 题解
  • 烽火HG680-KX-海思MV320芯片-2+8G-安卓9.0-强刷卡刷固件包
  • 一种新的分布式ID生成方案--ULID
  • 自学嵌入式 day40 51单片机
  • Web开发-PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较
  • sqli-labs:Less-17关卡详细解析
  • IIS 让asp.net core 项目一直运行
  • 8.1 开始新的学习历程
  • linux编译基础知识-工具链
  • 数据结构与算法——字典(前缀)树的实现
  • 抢占先机,PostgreSQL 中级专家认证的职业跃迁