wfb-ng 锁定WiFi接口
wfb-ng 锁定WiFi接口
- 1. 源由
- 2. 需求
- 3. 分析
- 4. 步骤
- 4.1 确认网卡MAC地址
- 4.2 修改udev配置文件
- 4.3 配置重载&重启
- 4.4 确认逻辑网卡接口
- 4.6 修改wfb-ng逻辑WiFi通信接口
- 5. 参考资料
- 6. 补充资料
为了更加方便的调试和使用wfb-ng软件,解决由于设备枚举发现时命名可能存在无法与硬件一一对应的问题,需要锁定实际硬件网卡与逻辑WiFi接口。
1. 源由
Raspberry Pi Zero W硬件本身自带一个WiFi网卡,其内置PCB天线的特殊性,仅能用于调试和近距离维护使用。
wfb-ng真正需要的是大功率发射的无线网卡,如果在设备发现阶段将设备逻辑WiFi接口自动命名为调试,那将会极大的影响传输距离和性能。
2. 需求
- Raspberry Pi Zero W硬件自带WiFi网卡,用于调试维护。
- 外置usb大功率无线网卡,用于远距离传输。
3. 分析
udev(userspace/dev)是Linux内核的设备管理器。作为devfsd和热插拔的继承者,udev主要管理/dev/目录中的设备节点。同时,udev还处理将硬件设备添加到系统或从系统中移除时引发的所有用户空间事件,包括某些设备所需的固件加载。
这里我们将使用到这软件来处理上述需求。
4. 步骤
因为网卡MAC地址是唯一的,因此用于绑定WiFi接口是不二之选。
4.1 确认网卡MAC地址
- Raspberry Pi Zero W
板载WiFi:b8:27:eb:53:31:30
USB-WiFi:0c:91:60:03:5b:62
- Raspberry Pi 3b+
板载WiFi:b8:27:eb:a6:3c:f3
USB-WiFi:20:0d:b0:32:da:3a
4.2 修改udev配置文件
- Raspberry Pi Zero W
pi@piCamera:~ $ sudo nano /etc/udev/rules.d/75-wifi-interface-name-change.rulespi@piCamera:~ $ cat /etc/udev/rules.d/75-wifi-interface-name-change.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:53:31:30", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="w*", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="0c:91:60:03:5b:62", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="w*", NAME="wfb-rf1"
- Raspberry Pi 3b+
pi@piGs:~ $ sudo nano /etc/udev/rules.d/75-wifi-interface-name-change.rulespi@piGs:~ $ cat /etc/udev/rules.d/75-wifi-interface-name-change.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="b8:27:eb:a6:3c:f3", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="w*", NAME="wlan0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="20:0d:b0:32:da:3a", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="w*", NAME="wfb-rf1"
4.3 配置重载&重启
$ sudo udevadm control --reload$ sudo reboot
4.4 确认逻辑网卡接口
- Raspberry Pi Zero W
pi@piCamera:~ $ ifconfig
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 8 bytes 752 (752.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 8 bytes 752 (752.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wfb-rf1: flags=4099<UP,BROADCAST,MULTICAST> mtu 2312ether 0c:91:60:03:5b:62 txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.68.245 netmask 255.255.255.0 broadcast 192.168.68.255ether b8:27:eb:53:31:30 txqueuelen 1000 (Ethernet)RX packets 10380 bytes 873141 (852.6 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 9753 bytes 780746 (762.4 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- Raspberry Pi 3b+
pi@piGs:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.68.232 netmask 255.255.255.0 broadcast 192.168.68.255ether b8:27:eb:f3:69:a6 txqueuelen 1000 (Ethernet)RX packets 32 bytes 4708 (4.5 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 24 bytes 2705 (2.6 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 8 bytes 770 (770.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 8 bytes 770 (770.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wfb-rf0: flags=4099<UP,BROADCAST,MULTICAST> mtu 2312ether 20:0d:b0:32:da:3a txqueuelen 1000 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 192.168.68.231 netmask 255.255.255.0 broadcast 192.168.68.255ether b8:27:eb:a6:3c:f3 txqueuelen 1000 (Ethernet)RX packets 267 bytes 23990 (23.4 KiB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 275 bytes 36457 (35.6 KiB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.6 修改wfb-ng逻辑WiFi通信接口
$ cat /etc/default/wifibroadcast
#WFB_NICS="wlx00c0caa578a9"
#WFB_NICS="wlan1 wlan2"
#WFB_NICS="wlan0"
WFB_NICS="wfb-rf2"
5. 参考资料
【1】RPI zero W doesn’t find wlanx interface on Release 23.01 image #287
【2】udev @Wikipedia
【3】An introduction to Udev: The Linux subsystem for managing device events
【4】write udev rules for changing network interface name
【5】wfb-ng Release 23.01镜像无头烧录&配置
【6】Raspbian镜像无头烧录
【7】the next generation of long-range packet radio link
6. 补充资料
- 确认usb设备被识别到
$ dmesg|tail
[ 97.293626] usb 1-1.4: new high-speed USB device number 3 using dwc_otg
[ 97.423965] usb 1-1.4: config 1 interface 0 altsetting 0 endpoint 0x85 has an invalid bInterval 0, changing to 7
[ 97.424424] usb 1-1.4: New USB device found, idVendor=0bda, idProduct=881a, bcdDevice= 0.00
[ 97.424456] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 97.424477] usb 1-1.4: Product: 802.11n NIC
[ 97.424495] usb 1-1.4: Manufacturer: Realtek
[ 97.424510] usb 1-1.4: SerialNumber: 123456
[ 5528.320934] 88XXau_wfb: loading out-of-tree module taints kernel.
[ 5528.639401] usbcore: registered new interface driver rtl88xxau_wfb
[ 5529.849054] rtl88xxau_wfb 1-1.4:1.0 wfb-rf1: renamed from wlan1
- 确认88XXau_wfb驱动已经加载
$ lsmod |grep wfb
88XXau_wfb 1916928 0
cfg80211 782336 2 brcmfmac,88XXau_wfb
- 确认内核版本
$ uname -r
5.15.84+
相关文章:
wfb-ng 锁定WiFi接口
wfb-ng 锁定WiFi接口1. 源由2. 需求3. 分析4. 步骤4.1 确认网卡MAC地址4.2 修改udev配置文件4.3 配置重载&重启4.4 确认逻辑网卡接口4.6 修改wfb-ng逻辑WiFi通信接口5. 参考资料6. 补充资料为了更加方便的调试和使用wfb-ng软件,解决由于设备枚举发现时命名可能存…...
Python所有方向的入门和进阶路线,20年老师傅告诉你方法
干了20多年程序员,对于Python研究一直没停过,这几天把我自己对Python的认知和经验,再结合很多招聘网站上的技术要求,整理出了Python所有方向的学习路线图,基本上各个方向应该学什么,都在上面了,…...
RLOAM/RO-LOAM
LOAM框架 LOAM框架包含三个步骤: Scan registration:从原始激光扫描点数据中提取点特征。点特征是角点或者面点。 odometry estimation:在特征提取之后,特征点传递到里程计模块,通过特征匹配和优化步骤计算相对坐标变…...
JUC并发编程之Semaphore-应用与深度源码剖析
目录 JUC并发编程之Semaphore-应用与深度源码剖析 1. Semaphore 是什么? 2.怎么使用Semaphore? 2.1构造方法 2.2 重要方法 2.3 基本使用 需求场景 基础版代码实现 tryAcquire()引入代码实现 acquireUninterruptibly(),acquire()对比代码实现 3.…...
JWT详细介绍使用
一、JWT介绍 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌。 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。 JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务…...
C/C++开发,无可避免的多线程(篇六).线程池封装类
一、线程池概念 线程池是一种多线程处理方式,它包含一个线程工作队列和一个任务队列。当有任务需要处理时,线程池会从线程工作队列中取出一个空闲线程来处理任务,如果线程工作队列中没有空闲线程,则任务会被放入任务队列中等待处理…...
HIVE中如何实现针对IPv6 CIDR的查询
Hive默认情况下不支持IPv6 CIDR查询,因为IPv6 CIDR查询需要使用一些额外的函数。 但是可以通过使用UDF(用户自定义函数)来实现这一点。 IPv6 CIDR表示为网络地址/前缀长度,其中网络地址是一个IPv6地址,前缀长度是一个介于0和128之间的整数,表示网络地址中前多少位是网络…...
【微信小程序】-- 生命周期(二十八)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
Kafka 概述
Kafka 概述Broker消费者Kafka 属于分布式的消息引擎系统,主要功能 :提供一套完备的消息发布与订阅解决方案 生产者和消费者都是客户端(Clients): 生产者(Producer):向主题发布消息…...
详解Java8中如何通过方法引用获取属性名/::的使用
在我们开发过程中常常有一个需求,就是要知道实体类中Getter方法对应的属性名称(Field Name),例如实体类属性到数据库字段的映射,我们常常是硬编码指定 属性名,这种硬编码有两个缺点。 1、编码效率低&#x…...
0106广度优先搜索和最短路径-无向图-数据结构和算法(Java)
1 单点最短路径 单点最短路径。 给定一幅图和一个起点s,回答“从s到给定目的顶点v是否存在一条路径?如果有,找出其中最短的那条(所含边数最少)。“等类似问题。 深度优先搜索在这个问题上没有什么作为,因为…...
僵尸(Zombie)进程
文章目录1.僵尸进程2.产生僵尸进程的原因3.利用 wait 函数销毁僵尸进程4.使用 waitpid 函数销毁僵尸进程1.僵尸进程 进程完成工作后(执行完 main 函数中的程序后)应被销毁,但有时这些进程将变成僵尸进程,占用系统中的重要资源。这…...
JS实现:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 数列是 1,1,2,3,5,8,13,21....观察可以看出来从第三个数字开始…...
Verilog如何编写一个基础的Testbench
本文将讲述如何使用Verilog 编写一个基础的测试脚本(testbench)。在考虑一些关键概念之前,先来看看testbench的架构是什么样的。架构包括建模时间、initial块(initial block)和任务(task)。此文…...
基于JavaEE社区物业管理系统开发与实现(附源码资料)
文章目录1. 适用人群2. 你将收获3.项目简介4.技术栈5.测试账号6.部分功能模块展示6.1.管理员6.2.业主1. 适用人群 本课程主要是针对计算机专业相关正在做毕业设计或者是需要实战项目的Java开发学习者。 2. 你将收获 提供:项目源码、项目文档、数据库脚本、软件工…...
问一下ChatGPT:DIKW金字塔模型
经常看到这张DIKW金字塔模型图,还看到感觉有点过份解读的图,后面又加上了insight,impact等内容。 Data:是数据,零散的、无规则的呈现到人们眼前,如果你只看到这些数字,如果没有强大的知识背景&a…...
javaScript基础面试题 ---闭包
闭包1、闭包是什么?2、闭包可以解决什么问题?3、闭包的缺点1、闭包是什么? 闭包是一个函数加上到创建这个函数的作用域的链接,就是一个作用域可以访问到另一个作用域的变量,闭包‘关闭’了函数的自由变量 function f…...
如何自定义您的网站实时聊天图标
实时聊天图标是您网站上的一个按钮,可在访问者单击时打开实时聊天。它代表了您的企业与客户沟通的门户。这是您的网站访问者与您联系、提出问题和接收个性化推荐的一种方式,聊天图标的设计最好是简单且引人入胜,个性化的图标往往更能提现企业…...
Vue侦听器Watch
31. Vue侦听器Watch 1. 定义 Watch是Vue.js提供的一个观察者模式,用于监听数据的变化并执行相应的回调函数。虽然计算属性Computed在大多数情况下更合适,但有时也需要一个自定义的侦听器Watch。因为在有些情况下,我们需要在状态变化时执行一…...
云快充研发中心平台架构师谈云原生稳定性建设之路
作者:吕周洋 大家好,我是来自云快充研发中心的平台架构师吕周洋,今天我给大家分享云快充云原生稳定性之路。 点击查看:云快充研发中心平台架构师 吕周洋:云快充云原生稳定性治理之路 云快充成立于2016年,…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
