WiFi基础学习到实战(六:Beacon帧字段解析)

news2024/11/20 11:45:46

欢迎大家一起学习探讨通信之WLAN。上节我们基于Android设备分析了WiFi扫描的代码实现,具体执行WiFi网络扫描由WiFi模块实现。WLAN协议定义扫描方式有“被动扫描”和“主动扫描”。本节继续分析“被动扫描”依赖Beacon帧中的字段。

好。我们先来看Android11 WiFi扫描代码部分的一个小细节,与将分析Beacon Body部分时间戳字段有关,它可能造成扫描结果无法在列表上显示。上节分享WiFi扫描流程中,框架处理WiFi扫描命令时,会调用到startSingleScan()方法。

在该方法中,通过mClock.getElapsedSinceBootMillis()->SystemClock.elapsedRealtime()方法获取系统时间,并赋值给mLastScanSettings.startTime成员。

public boolean startSingleScan(WifiNative.ScanSettings settings,
        WifiNative.ScanEventHandler eventHandler) {
            ......
            mLastScanSettings = new LastScanSettings(
            mClock.getElapsedSinceBootMillis(),
            reportFullResults, allFreqs, eventHandler);
            ......
        }
}

在扫描完成后,框架处理WiFi扫描结束事件时,将调用pollLatestScanData()方法获取扫描结果。将通过getScanResult()获取扫描到的每一个WiFi网络实例。

这里很重要的一个点是“将用获取到WiFi网络实例中的时间戳(timestamp_ms)和startTime进行比较”。

如果其大于startTime则将WiFi网络加入到扫描结果列表中;若其小于则忽略该网络,将导致WiFi网络无法被正常扫描识别。

private void pollLatestScanData() {
            ......
            mNativeScanResults = mWifiNative.getScanResults(getIfaceName());
            List<ScanResult> singleScanResults = new ArrayList<>();
            int numFilteredScanResults = 0;
            for (int i = 0; i < mNativeScanResults.size(); ++i) {
                ScanResult result = mNativeScanResults.get(i).getScanResult();
                long timestamp_ms = result.timestamp / 1000; // convert us -> ms
                if (timestamp_ms > mLastScanSettings.startTime) {
                    if (mLastScanSettings.singleScanFreqs.containsChannel(
                                    result.frequency)) {
                        singleScanResults.add(result);
                    }
                } else {
                    numFilteredScanResults++;
                }
            }
            if (numFilteredScanResults != 0) {
                Log.d(TAG, "Filtering out " + numFilteredScanResults + " scan results.");
            }
}

在什么情况下会出现以上所述WiFi网络被忽略的情况呢?

回到这个问题,要追踪到扫描网络实例的时间戳。该时间戳来自每个WiFi网络的Beacon帧和probe respons帧的时间戳,与路由器有很大关系,如路由器断电重启,其值就会变化。

因此,如WiFi模块直接将扫描Beacon帧的内容上报,在Android上就会存在网络被忽略的情况。

解决方法:

在linux或WiFi框架将扫描网络实例时间戳重新赋值为自系统起来后的时间。对应到linux中的时间类型为CLOCK_BOOTTIME,可通过ktime_get_boottime()方法获取。

好。接下来继续分析Beacon帧的内容,如下图Beacon抓包实例。Beacon帧Body分为两种类型:字段(Fields)和元素(Elements)。

Beacon帧中的Field字段,如下图所示。

(1)时间戳字段(Timestamp field)

表示发送该帧的源设备时间同步功能,其值单位为us,占用8个字节。该字段有以下特点:

  • 一般该值代表路由器时间戳值,表明自网络工作以来经过的微秒数。

  • 时间戳值达到最大值后,其值将从0重新开始。因其占8个字节,需要经过580000年才可能发生。

  • WiFi网络中设备通过该时间戳调整网络设备时间钟。在TWT,设备PS功能等都会用到。

(2)Beacon间隔字段(Beacon Interval field)

表示Beacon传输间隔时间,其值单位为TUs,占用2个字节。一般默认值为100。

如 a DMG 设备发送的Beacon间隔字段值为0时,表明下一个TBTT的TBI是未知的。

注:协议规范【原文】

A 0 in the Beacon Interval field transmitted by a DMG STA indicates that the TBTT of the next BTI isunknown.

(3)网络能力信息字段(Capability Information field)

表示当前WiFi网络的能力信息,占用2个字节。较其他字段比较复杂,协议定义Bit位含义如下图所示。

以上表示的feature大部分可选实现。

  • ESS(B0):表示Beacon是否来自AP。

  • IBSS(B1):表示Beacon是否来自一个IBSS设备。

  • Privacy(B4):表示WiFi网络中是否所有数据帧都需要加密。

Slot Time和SIFS用于帧间隔时间值。802.11和802.11b协议定义标准的slot time为 20u。802.11g协议定义slot time为9us,即为short slot time,同时也表示WiFi网络是否支持802.11g。

关于该标志位有以下特定:

  • 有一个不支持short slot time的设备加入网络,则整个WiFi网络应表示不支持short slot time。

  • IBSS网络不支持short slot times,short slot time应被设置为0。

接下来分析Beacon帧中的Elements元素。

[1]SSID element:

协议定义格式如下图。element ID为0。SSID最大长度32个字符。当长度为0时,指SSID通配符。

[2]Rates Element:

协议定义格式如下图。element ID为1。最大长度为8,即最多可表示支持8种速率,每个速率对应1个字节

WLAN协议将速率分为基本速率和传输速率。基本速率对应字节的Bit(7)为1,其值乘500kb/s,即为对应的速率。

下图为Beacon帧中速率实例,如82:1000 0010,bit7=1,基本速率;bit0-bit6值为2, 2 * 500kb/s = 1Mb/s。

任何一个加入WiFi网络的设备,都需要全部支持该网络的基本速率。因基本速率是协议定义默认的一些调制方式,该网络中的设备都要可以解析,保证设备间的通信顺畅。

[3]DSSS Parameter Set element:

协议定义格式和实例如下图,element ID为3。包含当前网络工作的信道,让设备识别当前网络信道。

[4]Traffic Indication Map(TIM) element:

协议定义格式如下图所示,element ID为5。其他字段解析如下。

  • DTIM Count:表示下一个DTIM出现,需要经过几个Beacon帧(包括当前Beacon)。其值为0,表示当前TIM是DTIM。

  • DTIM Period:表示连续DTIM的间隔Beacon帧数。该间隔与AP的配置有关。其值为1,表示TIM都为DTIM。

  • Bitmap Control:表示路由器侧有无缓存的广播或组播包。

  • Partial Virtual Bitmap:表示路由器侧是否缓存有对应WiFi设备的数据包。

路由器利用Beacon帧中,DTIM字段通知整个网络当前缓存广播或组播帧状态。在发送每个DTIM的Beacon帧时,要求WiFi网络内的设备处于唤醒接收状态。

DTIM包含在TIM字段内,通常将TIM也叫做DTIM。关于Partial Virtual Bitmap字段,后面我们专用一节对其计算生成方法进行分享。下图是实例DTIM字段,指示当前路由器有缓存广播或组播包,且为AID为0x09的设备缓存有数据包。

注:协议规定【原文】

1.The DTIM Count field indicates how many Beacon frames (including the current frame) appear before thenext DTIM. A DTIM count of 0 indicates that the current TIM is a DTIM.

2.The Bitmap Control field is a single octet. Bit 0 of the field contains the Traffic Indicator bit associated withAID 0. This bit is set to 1 in TIM elements with a value of 0 in the DTIM Count field when one or more group addressed MSDUs/MMPDUs are buffered at the AP or the mesh STA. The remaining 7 bits of thefield form the Bitmap Offset.

[5]Country element

协议定义格式如下图所示,element ID为7。该元素可从实例字面意思理解。关于Environment字段重点分析下。

有些国家对WLAN网络室内和室外的信道、功率等有不同的要求。因此利用该字段识别当前环境。关于信道介绍可参考【第七节:通信之WLAN(信道)】。

  • “O”:室外环境。

  • “I”:室内环境。

  • “ ”:不对环境区分。

注:协议规范【原文】

country code as described in document ISO/IEC 3166-1. The third octet shall be one of the following:

1. an ASCII space character, if the regulations under which the station is operating encompass all environments in the country,

2. an ASCII 'O' character, if the regulations under which the station is operating are for an Outdoor environment only.

3. an ASCII 'I' character, if the regulations under which the station is operating are for an Indoor environment only.

4. an ASCII 'X' character, if the station is operating under a non-country entity. The first two octets of the non-country entity shall be two ASCII 'XX' characters."

[6]Power Constraint element

协议定义格式如下图所示,element ID为32。该元素与802.11h相关,有些地区国家要求发送功率最大值,因此,用其通知网络内设备可在该信道使用的最大发送功率。

[7]TPC Report element

协议定义格式如下图所示,element ID为35。该元素与802.11h相关。其元素解析见下:

  • Transmit Power:表明当前发送该帧的实际传送功率。

  • Link Margin:表明链路余量情况,根据接收包含TPC Request element帧的时间和接收速率计算所得。其在Beacon帧中做为保留位。

注:协议规范【原文】

The Link Margin field is reserved when a TPC Reportelement is included in a Beacon frame or Probe Response frame.

[8]AP Channel Report element

协议定义格式如下图所示,element ID为51。指明WiFi网络内在哪些信道可能发现该AP。仅会表明一个Operation class对应的多个信道。

抓包实例如下图所示。

[9]ERP element

协议定义格式如下图所示,element ID为42。ERP参数占1个字节,每个bit位指明含义如下解释。由于802.11b协议和早期802.11协议版本,不能与802.11g定义的ERP-OFDM 数据速率通信。

因此,需要WiFi网络表明其是否要用保护机制,改善WiFi网络的性能,是否可以使用长前导序列或短前导序列。

  • NonERP_Present(B0):表明WiFi网络中是否有仅支持802.11b协议或早期802.11的设备。有存在,则设置为1。

  • Use_Protection(B1):表明WiFi网络是否启用保护机制。

  • Barker_Preamble_Mode(B2):表明WiFi网络是否可以使用短前导序列。如有一个802.11b的设备,则设置为1。

关于ERP的基本服务集中,有以下几种场景都会触发保护机制:

  • 一个802.11b的设备连接到WiFi网络,将触发保护机制。

  • 一个ERP的AP听到附近的Beacon只支持802.11b或早期802.11 DSSS速率时,将触发网络内的保护机制。

  • 一个ERP的AP听到附近的管理帧其只支持802.11b或802.11 DSSS速率时,将触发网络内的保护机制。

从上可知,802.11b的设备会对附近802.11g的网络造成影响,网络内的保护机制触发后,影响网络整体吞吐速率。

[10]Extended Supported Rates element

协议定义格式如下图所示,element ID为50。该元素字段表明设备支持的速率不能完全携带在支持速率的元素中。信息元素1-255个字节,每个字节可描述支持一个速率。

前7bit(0-6)数值以500Kbps为单位,表示速率大小,最高位表示是否为基本速率。该字段仅当支持的速率大于8个时,才会被使用。

[11]Overlapping BSS Scan Parameters element

协议定义格式如下图所示,element ID为72。该元素参数基于Android代码有详细的分析,见【第二十节:通信之WLAN(OBSS)】。此处不做分析,抓包元素实例如下。

本节基于扫描网络实例的时间戳,分享了可能存在WiFi列表上无法显示正常WiFi网络的情况,并对Beacon帧中的Field字段和Element字段进行了详细解读,大家应该发现Beacon帧中还有HT和HE等Element,其内容比较多,为了专栏课节间的连续性,后续单独对其详细解读。WiFi基础学习到实战(六)探讨就到此,后续期待共同继续探讨学习。

注:

对以上所述专业知识有修正意见或建议,可随时留言反馈。如感兴趣更多通信知识,可关注“通信之WLAN” for WeChat 公众号。

谢谢大家支持~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/541144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

会计转行数据分析,可行性多高?

看到这样的问题&#xff0c;第一个想法是想劝退&#xff0c;毕竟通过不明真相的网友身上找自己的未来&#xff0c;这件事听着就不靠谱。转行难&#xff0c;转行做好更好&#xff0c;虽然会计也与数据有关&#xff0c;但是数据分析涉及的技术内容明显有很大的差别。所以&#xf…

重塑职业未来:在竞争激烈的职场上脱颖而出的关键策略

在竞争激烈的职场上&#xff0c;各种职场难题时常出现&#xff0c;如何进行有效沟通、如何应对工作压力、如何提升职业能力等&#xff0c;这都是需要去克服的问题。下面分享一下职场老人的经验&#xff01; 一、你遇到过哪些职场问题&#xff1f;分享一下你是怎么解决的呢&…

Type-C边充电边OTG转接器方案

随着生活水平的提高&#xff0c;大家的电子设备也多了起来&#xff0c;更有甚者会凑齐“全家桶”&#xff0c;手机&#xff0c;平板&#xff0c;笔记本电脑&#xff0c;智能手表&#xff0c;无线耳机&#xff0c;Switch&#xff0c;PS5&#xff0c;一样不落。那么多的电子设备&…

hibernate入门项目(一)

本节我们将演示如何搭建一个 Hibernate 工程。 搭建 Hibernate 工程需要以下 7 步&#xff1a; 下载 Hibernate 开发包 新建工程 创建数据库表 创建实体类 创建映射文件 创建 Hibernate 核心配置文件 测试 1. 下载 Hibernate 开发包 浏览器访问 Hibernate 官网 下载 Hibern…

520告白日!小红书关键词热度查询,今年的心动密码是什么?

520&#xff0c;又是一个有爱的日子&#xff0c;人们借机表达爱意的日子&#xff0c;品牌不会错过的好时机。今年520什么东西比较热呢&#xff1f;消费者比较关注什么&#xff1f;品牌有什么样动作&#xff1f;下面&#xff0c;借助小红书关键词热度查询、热词排行榜&#xff0…

基于C3D卷积神经网路的动作识别

对于基于视频分析的问题&#xff0c;2D卷积&#xff08;卷积核为二维&#xff09;不能很好得捕获时序上的信息&#xff0c;因此《3D convolutional neural networks for human action recognition》 这片论文提出了3D卷积并用于行为识别的&#xff0c;论文中将其用于行为识别&a…

商家中心之java商城 开源java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

cpp test

1. 以下程序在linux 64位系统的输出结果&#xff08; &#xff09; #include <stdio.h> int main(void) {int buf[100] { 0 };printf("%d,%d,%d,%d,%d",sizeof(int), sizeof(long long), sizeof(buf),sizeof(buf)/sizeof(buf[0]), sizeof(&buf));retur…

【Linux Network】网络层协议——IP

目录 网络层 IP协议 基本概念 协议头格式 网段划分 特殊的IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 路由表生成算法 Linux网络编程&#x1f337; 网络层 在复杂的网络环境中确定一个合适的路径&#xff1b; IP协议 基本概念 主机 : 配有 IP 地址 , 但是不进行路…

前端必学,crud,magic-Api

CRUD还要后端写&#xff1f; 前端自己搞定&#xff0c;只需要会写sql就行。 文档写的比我写的好太多&#xff0c;直接看文档 创建springBoot&#xff08;springBoot版本要小于3.0&#xff09; 引入pom <?xml version"1.0" encoding"UTF-8"?> &…

接口自动化——har 生成用例

这里写目录标题 一、目标二、应用场景三、Har 简介四、实现思路五、模板技术六、模版技术-环境安装&#xff08;Python&#xff09;七、har 生成用例实现思路1、python模板模板文件生成的测试文件 2、java模板模板文件生成的测试文件 3、httprunner模板模板文件生成的测试文件 …

数据库界的科技与狠活: 创邻科技Galaxybase X英特尔SGX数据加密解决方案正式发布

引言 近日&#xff0c;创邻科技入选与英特尔合作&#xff0c;在基于第四代英特尔至强处理器的支持下&#xff0c;利用软件防护扩展&#xff08;Software Guard Extension,SGX&#xff09; 技术&#xff0c;打造出了具备可信执行环境的图数据库产品&#xff0c;保护企业释放关联…

STM32单片机多功能电子秤点数秤食物热量卡路里称重

实践制作DIY- GC0132-多功能电子秤 一、功能说明&#xff1a; 基于STM32单片机设计-多功能电子秤 二、功能介绍&#xff1a; STM32F103C系列最小系统lcd1602HX7115Kg电子秤去皮键模式选择按键重量设置键上键下键 有3种模式普通模式、点数模式、卡路里模式。通过模式选…

Requests-get方法的使用

Requests-get方法使用 打开网页使用代码获取页面内容查看结果页面格式修改 爬取书名完整代码以及注释代码注释 翻页查询所有 以https://books.toscrape.com/网站为例&#xff1a; 打开网页 先把网页打开&#xff0c;然后右键检查&#xff0c;找到网络一栏&#xff0c;这个时候…

【Android】【Java】【每日练手1】字符串的二维码生成器

文章目录 一、需求二、创建android stdio工程三、设置好JDK四、创建activity五、编写activity_main.xml布局六、build.gradle增加zxing依赖七、MainActivity 一、需求 一个界面&#xff0c;界面上一个文本输入框、一个按钮、一个二维码显示view。可在文本输入框输入字符串&…

为什么分布函数的概率分布为均匀分布?

为什么分布函数的概率分布为均匀分布&#xff1f; 我先来解决这样一个常见的问题&#xff1a;已知随机变量X的概率分布&#xff0c;求Yg(X)的概率分布&#xff08;分布律或者概率密度函数&#xff09; 这种问题有三种类型&#xff08;如下图&#xff09; 我们以随机变量X为连续…

计算机技术是最容易引发第四次工业革命的方向吗? - 易智编译EaseEditing

计算机技术是当前推动第四次工业革命的关键方向之一&#xff0c;但并非是唯一的方向。 第四次工业革命是在信息技术、人工智能、物联网、生物技术等多个领域的交叉融合下发生的一次全球性变革。 计算机技术在其中发挥了重要的作用&#xff0c;但还需要与其他技术领域相互配合和…

【C++】C/C++内存管理,从底层汇编带你理解new和delete!

c内存管理 C/C内存分布C语言中动态内存管理的方式C动态内存管理new/delete操作内置类型new和delete操作自定义类型 operator new与operator delete函数new和delete的实现原理内置类型自定义类型 定位new表达式(placement-new)常见面试题malloc/free和new/delete的区别 &#x1…

【详解LinkedList与链表】

&#x1f320;作者&#xff1a;TheMythWS. &#x1f386;专栏&#xff1a;《集合与数据结构》 &#x1f387;座右铭&#xff1a;不走心的努力都是在敷衍自己&#xff0c;让自己所做的选择&#xff0c;熠熠发光。 目录 链表 概念 图解链表 链表的实现 1.创建链表 2.遍历链…

CST-FSS/周期谐振单元的仿真

引言 这几天要仿真超表面,上下求索CST有关相关内容的教程,视频倒是有不少,不过发现很多人忽略了官方帮助文档。本文以官方帮助文档为基础,写一个有关使用CST实现FSS/超表面这类周期结构的笔记。 官方帮助文档 CST有关FSS的内容使用了一个金属谐振圆环作为例子,这是由于…