主要内容

使用SDR前导检测的OFDM WiFi扫描仪

这个例子展示了如何使用软件定义无线电(SDR)和前导检测检索关于WiFi网络的信息。该示例扫描2.4 GHz和5 GHz通道,并使用一个SDR前导检测器来检测和捕获来自空中的正交频分复用(OFDM)包。然后,该示例解码OFDM包以确定哪些包是接入点(AP)信标。AP信标信息包括SSID (service set identifier)、MAC (media access control)地址(也称为基本SSID或BSSID)、AP通道带宽和AP使用的802.11标准。

介绍

此示例扫描一组WiFi通道,以检测在20 MHz子通道上传输的AP信标。扫描过程使用NI™USRP™无线电上的前导探测器。

扫描过程包括这些步骤。

  • 配置preambleDetector对象,该对象具有从遗留的长训练字段(L-LTF)生成的前导。

  • 设置前导探测器扫描的频带和通道。

  • 扫描每个指定的通道和每一个成功检测到OFDM包,捕获一个波形为一个设定的持续时间。

  • 通过在捕获的波形中搜索信标帧,并从每个成功解码的信标帧中提取相关信息,在MATLAB®中处理波形。

  • 显示检测到的ap的关键信息。

设置无线

调用radioConfigurations函数。该函数返回您使用“无线电设置向导”保存的所有可用的无线电设置配置。有关更多信息,请参见连接和设置NI USRP无线电

savedRadioConfigurations = radioConfigurations;

若要用保存的无线电设置配置名称更新下拉菜单,请单击更新.然后选择要在此示例中使用的无线电。

savedRadioConfigurationNames =(字符串({savedRadioConfigurations.Name}));无线电=savedRadioConfigurationNames (1);

配置序言探测器

使用指定的无线电创建一个前导探测器对象。要在后续运行时加快此示例的执行时间,请重用该示例第一次运行时的工作区对象。

清晰的pdpd = preambleDetector(电台);

若要使用收音机上可供捕获的天线更新下拉菜单,请调用hCaptureAntennashelper函数。然后选择与此示例一起使用的天线。

captureAntennaSelection = hCaptureAntennas(电台);pd。天线=captureAntennaSelection (1);

若要将捕获采样速率增加到40mhz,请指定过采样因子为2

osf =2;pd。SampleRate = 20 e6 * osf;pd。CaptureDataType =“替身”;pd。ThresholdMethod =“自适应”;

配置无线电前序

802.11标准要求所有WiFi ap必须在20mhz带宽上使用非高吞吐量(非ht)包传输OFDM信标。因此,生成一个20 MHz的L-LTF波形,并使用该波形中的一个长训练符号作为前导来检测WLAN OFDM包。

生化武器=“CBW20”;cfg = wlanNonHTConfig (ChannelBandwidth =生化武器);OversamplingFactor = osf lltf = wlanLLTF (cfg);

从L-LTF波形中提取第一个长训练符号。

cyclicPrefixLength = 1.6 e-6 * pd.SampleRate;trainingSymbolLength = 3.2 e-6 * pd.SampleRate;序言= lltf (cyclicPrefixLength + 1: cyclicPrefixLength + trainingSymbolLength);

因为前导检测器要求前导在-1到1之间,所以规范化并设置前导。

序言=序言/√总和(abs(序言)。^ 2));pd。序言=序言;

要捕获整个第一个非ht包,必须将触发器偏移量设置为负值。由于您基于L-LTF波形中的长训练符号创建了一个匹配的滤波器,因此偏移量至少是一个遗留的短训练字段(L-STF)、一个L-LTF循环前缀和一个长训练符号。

lstfLength = 8 e-6 * pd.SampleRate;pd。触发器偏移= -(lstfLength + cyclicPrefixLength + trainingSymbolLength + 5);

曲调序言探测器

配置适合本地环境的前置探测器的自适应门限增益、自适应门限偏移量和射频增益值。控件提供的触发点需要手动调优来配置这些值plotThreshold函数。有关调优这些值的更多信息,请参见使用前导探测触发捕获

要调优前导探测器,请指定一个已知OFDM包的频带和通道。

这些是有效的通道号。

  • 2.4 GHz频段为1-14。

  • 5 GHz频段为1-200。然而,对于使用5 GHz的APs,有效的20 MHz控制通道为32、36、40、44、48、52、56、60、64、100、104、108、112、116、120、124、128、132、136、140、144、149、153、157、161、165、169、173、177。

乐队=5;频道=52;pd。CenterFrequency = wlanChannelFrequency(通道、带);

调整这些值以调整前导检测器。

pd。AdaptiveThresholdGain =0.37;pd。AdaptiveThresholdOffset =0.00004;pd。RadioGain =30.;

绘制重新配置的前导检测器的滤波器输出功率、自适应阈值和触发点。生成的图包含每个OFDM包的两个触发点。每个触发点对应一个长训练符号。

当您生成plotThreshold如图所示,如果每个OFDM包没有至少两个触发点,请重新调整自适应门限增益、自适应门限偏移和无线电增益,直到每个OFDM包至少有两个触发点。

captureDuration =毫秒(120);captureDuration plotThreshold (pd);

通过沿着图的x轴放大检查触发点。例如,该图显示了OFDM包的放大视图,在相关峰值上有触发点。

扫描无线频道

指定扫描区域

指定SDR扫描的频带和通道。

乐队=5;渠道=(52 56 157);

生成与所选信道和频带值相关联的中心频率。

centerFrequencies = wlanChannelFrequency(渠道、带);

接收机的设计

此图表显示了用于扫描所选通道和频带的接收器的概述。

这些步骤提供了关于图表的进一步信息。

  1. 设置前导探测器的中心频率,然后初始化检测和捕获一个波形的设定持续时间。

  2. 检查前导检测器是否检测到OFDM报文。

  3. 确定并应用波形上的频率和定时校正,然后尝试恢复遗留信号(L-SIG)场位。

  4. 检查报文格式是否为非ht。

  5. 从恢复的L-SIG中提取调制编码方案(MCS)和PLCP业务数据单元(PSDU)的长度。然后恢复非ht数据,然后解码MAC协议数据单元(MPDU)。

  6. 使用恢复的MAC帧配置,检查非ht报文是否为信标。

  7. 恢复SSID、BSSID、AP的厂商、信噪比、主20 MHz信道、当前信道中心频率索引、支持的信道宽度、频带和AP使用的无线标准。

  8. 检查波形是否包含另一个数据包,你可以解码。

初始化变量

当你打电话给捕获函数要检测和捕获信号,则必须指定捕获的长度和信号检测超时时间。因为信标每100毫秒发送一次,设置captureLength毫秒(100)而且超时毫秒(200)

captureLength =毫秒(100);timeout =毫秒(200);

创建一个结构(APs),为每一个成功解码的信标存储此信息。

  • 名称

  • BSSID

  • 美联社的供应商

  • 信噪比(信噪比)

  • 主20mhz通道

  • 当前通道中心频率

  • 通道宽度

  • 频带

  • AP支持的运行模式

  • MAC帧配置

  • 信标存在的波形

  • 捕获波形中非ht信标包开始的索引值

APs =结构(...“名称”[],“BSSID”[],“供应商”[],“SNR_dB”[],“Beacon_Channel”[],...“Operating_Channel”[],“Channel_Width_MHz”[],“乐队”[],“模式”[],...“MAC_Config”wlanMACFrameConfig,“波形”[],“抵消”[]);

若要确定AP的硬件制造商,请选择retrieveVendorInfo盒子。选择retrieveVendorInfobox从IEEE®注册授权机构网站下载组织唯一标识符(OUI) CSV文件,用于供应商AP识别。

retrieveVendorInfo =真正的;counter = 1;印第安纳州= wlanFieldIndices (cfg);开始扫描和解码指定的频道。i = 1:length(centerFrequencies) pd。CenterFrequency = centerFrequencies(我);流("在波段%.1f.\n上扫描通道%d "、通道(i)、带);[capturedData, ~, ~, status] = capture(pd, captureLength, timeout);如果~状态%如果没有非ht报文被解码,转到下一个通道。流("在带宽%.1f的通道%d上没有检测到非ht数据包。"、通道(i)、带);继续;其他的流("在通道%d上检测到非ht数据包,位于频带%.1f.\n"、通道(我),乐队)结束重新采样捕获的数据到20兆赫,用于信标处理。capturedData =重新取样(capturedData 1 osf);searchOffset = 0;searchOffset <长度(capturedData)% recoverPreamble检测报文,并对非ht前导进行分析。[preambleStatus, res] = recoverPreamble(生化武器,capturedData searchOffset);如果匹配(preambleStatus“没有发现包”打破;结束检索同步数据并按所完成的LSTF功率缩放它%在recoverPreamble函数中。syncData = capturedData (res.PacketOffset + 1:结束)。/√(res.LSTFPower);syncData = frequencyOffset (syncData pd.SampleRate / osf, -res.CFOEstimate);在LLTF之后只需要4个OFDM符号(LSIG + 3个以上的符号)用于格式检测的%fmtDetect = syncData (ind.LSIG (1): (ind.LSIG (2) + 4 e-6 * pd.SampleRate / osf * 3));[LSIGBits, failcheck] = wlanLSIGRecover(fmtDetect(1:4e-6*pd.SampleRate/osf*1),...res.ChanEstNonHT res.NoiseEstNonHT,生化武器);如果~failcheck format = wlanFormatDetect(fmtDetect,res.ChanEstNonHT,res.NoiseEstNonHT,cbw);如果匹配(格式,“Non-HT”从L-SIG的前3位提取MCS。率=双(bit2int (LSIGBits (1:3), 3));如果速率<= 1 cfg。MCS =速率+ 6;其他的cfg。MCS = mod(速度,6);结束从L-SIG中确定PSDU长度。cfg。PSDULength =双(bit2int (LSIGBits(17), 12日0));ind.NonHTData = wlanFieldIndices (cfg,“NonHT-Data”);如果双(ind.NonHTData (2) -ind.NonHTData (1)) >...长度(syncData (ind.NonHTData(1):结束))%退出时,循环作为完整的包未捕获。打破;结束nonHTData = syncData (ind.NonHTData (1): ind.NonHTData (2));bitsData = wlanNonHTDataRecover (nonHTData, res。ChanEstNonHT,...res.NoiseEstNonHT cfg);[cfgMAC, ~, decodeStatus] = wlanMPDUDecode(bitsData,cfg,...SuppressWarnings = true);从信标提取有关通道的信息。。如果~ decodeStatus & & (cfgMAC匹配。FrameType,“灯塔”)流("在频带%.1f的频道%d上检测到信标。"、通道(i)、带);%用有关信标的信息填充表。如果isempty (cfgMAC.ManagementConfig.SSID) APs(柜台)。名称=“隐藏”;其他的APs(柜台)。名称=string(cfgMAC.ManagementConfig.SSID);结束APs(柜台)。BSSID= string(cfgMAC.Address3);如果retrieveVendorInfo APs(柜台)。供应商=determineVendor(cfgMAC.Address3);其他的APs(柜台)。供应商=“跳过”;% #好< UNRCH >结束(APs(柜台)。模式,APs(柜台)。Channel_Width_MHz operatingChannel] =...determineMode (cfgMAC.ManagementConfig.InformationElements);如果isempty (operatingChannel)%默认为扫描通道,如果操作通道%无法确定。operatingChannel =频道(i);结束APs(柜台)。Beacon_Channel =频道(i);APs(柜台)。Operating_Channel = operatingChannel;APs(柜台)。SNR_dB = res.LLTFSNR;APs(柜台)。MAC_Config = cfgMAC;APs(柜台)。抵消= res.PacketOffset; APs(counter).Waveform = capturedData; counter = counter + 1;结束%移动while循环下次迭代的包搜索偏移量。searchOffset = res.PacketOffset + double(ind.NonHTData(2));其他的%包不是非ht;移动包搜索偏移10个OFDM符号(最小值%非ht的包长度)用于while循环的下一次迭代。searchOffset = res.PacketOffset + 4e-6*pd.SampleRate/osf*10;结束其他的% L-SIG恢复失败;移动包搜索偏移10个OFDM符号(最小值%非ht的包长度)用于while循环的下一次迭代。searchOffset = res.PacketOffset + 4e-6*pd.SampleRate/osf*10;结束结束结束
在频段5.0上扫描52频道。
在频带5.0的52通道上检测到非ht报文。
在52频道5.0波段检测到信标。
从IEEE注册授权机构下载ui.csv…
在频段5.0上扫描56频道。
在频带5.0的56通道上没有检测到非ht报文。
在5.0波段扫描157频道。
5.0频段内157通道未检测到非ht报文。

转换APs中指定的信息步骤7通过使用local函数generateBeaconTable

乐队detectedBeaconsInfo = generateBeaconTable (APs)
detectedBeaconsInfo =1×9表SSID BSSID供应商信噪比(dB)主要20 MHz通道电流通道中心频率指数通道宽度(MHz)带模式  _________ ______________ _______________________ ________ ______________________ ______________________________________ ___________________ ____ __________ " WLAN_5G”“04 d4c451c584”“华硕电脑公司。”18.796 52 58 "80" 5 "802.11ax"

进一步的探索

  • detectedBeaconsInfo表中仅显示ap的关键信息。的MAC帧配置可获得有关信标的进一步信息,例如AP支持的数据速率APs结构。

  • 如果您可以访问可配置的AP,请更改AP的通道宽度并重新运行示例以确认通道宽度。

本地函数

这些函数帮助处理传入的信标。

函数供应商= determineVendor (mac)% DETERMINEVENDOR返回AP的供应商名称来自指定MAC地址的组织唯一标识符。持续的Ouis vendor = strings(0);试一试如果isempty(是的)如果~ (“oui.csv”,“文件”) disp (“从IEEE注册授权机构下载ui.csv…”如有必要,增加websave超时时间选择= weboptions (“超时”5);websave (“oui.csv”,“http://standards-oui.ieee.org/oui/oui.csv”、选择);结束是的= readtable (“oui.csv”VariableNamingRule =“保存”);结束从MAC地址提取OUI。是的= mac (1:6);根据OUI提取供应商名称。供应商=字符串(cell2mat(是的。(“机构名称”)(匹配(ouis.Assignment是的))));%重新抛出捕获的错误作为警告。警告(ME.message +要跳过determinevendoror函数调用,请设置retrieveVendorInfo为false。[]);结束如果isempty(供应商)供应商=“未知”;结束结束函数[模式,bw, operatingChannel] = determineMode (informationElements)% DETERMINEMODE决定AP使用的802.11标准。该函数检查是否存在HT、VHT和HE能力%元素,并确定AP使用的802.11标准。的元素% id在IEEE Std 802.11-2020和IEEE Std 802.11ax-2021中定义。elementIDs = cell2mat (informationElements (: 1));id = elementIDs (: 1);如果任何(id = = 255)如果任何(elementIDs (id = = 255, 2) = = 35)% HE报文格式模式=“802.11斧头”;其他的模式=“未知”;结束vhtElement = informationElements {id = = 192, 2};htElement = informationElements {id = = 61, 2};[bw, operatingChannel] = determineChannelWidth (htElement vhtElement);elseif任何(id = = 191)VHT报文格式模式=“802.11交流”;vhtElement = informationElements {id = = 192, 2};htElement = informationElements {id = = 61, 2};[bw, operatingChannel] = determineChannelWidth (htElement vhtElement);elseif任何(id = = 45)% HT报文格式模式=“802.11 n”;htElement = informationElements {id = = 61, 2};[bw, operatingChannel] = determineChannelWidth (htElement);其他的非ht报文格式%排除b,因为只支持DSSS模式=“802.11 a / g / j / p”;bw =“未知”;operatingChannel = [];结束结束函数[bw, operatingChannel] = determineChannelWidth (htElement变长度输入宗量)对象返回通道的带宽%信标在IEEE Std 802.11-2020中定义的HT/VHT操作信息元素第9.4.2.56节和第9.4.2.158节。msbFirst = false;图9-382和表9-190定义了% htOperationInfoBits%转换为位得到STA通道宽度值在第3位。htOperationInfoBits = int2bit (htElement (2), 5 * 8, msbFirst);operatingChannel = 0;如果输入参数个数= = 2图9-163和表9-274定义了每个octet%在vhtElementvhtElement =变长度输入宗量{1};VHT操作通道宽度字段连续波= vhtElement (1);信道中心频率段0CCFS0 = vhtElement (2);信道中心频率段CCFS1 = vhtElement (3);以下逻辑定义如表11-23所示如果htOperationInfoBits(3) == 0 bw =“20”;operatingChannel = CCFS0;elseif连续波= = 0操作通道宽度字段为1bw =“40”;operatingChannel = CCFS0;elseifCCFS1 = = 0操作通道宽度字段为1和操作通道宽度字段为1bw =“80”;operatingChannel = CCFS0;elseifabs(CCFS1 - CCFS0) == 8操作通道宽度字段为1和操作通道宽度字段为1和% CCFS1大于0bw =“160”;operatingChannel = CCFS1;其他的操作通道宽度字段为1和操作通道宽度字段为1和% CCFS1大于0且% |CCFS1 - CCFS0|大于16bw =“80 + 80”;结束结束如果operatingChannel = = 0如果htOperationInfoBits(3) == 1 bw =“40”;secondaryChannelOffset = bit2int (htOperationInfoBits(1:2), 2,假);如果secondaryChannelOffset = = 1次要通道高于主通道。operationingchannel = htElement(1) + 2;elseifsecondaryChannelOffset = = 3次要通道低于主通道。operationingchannel = htElement(1) - 2;其他的警告(“无法确定运营渠道。”结束其他的bw =“20”;operatingChannel = htElement (1);结束结束结束函数带台= generateBeaconTable (APs)GENERATEBEACONTABLE将接入点结构转换为表和%清理变量名。台= struct2table (APs,“AsArray”,真正的);资源描述。乐队= repmat(乐队,长度(tbl.SSID), 1);台= renamevars(资源描述,“SNR_dB”,“Beacon_Channel”,“Operating_Channel”,“Channel_Width_MHz”),...“信噪比”(dB),“主20兆赫频道”,“当前渠道中心频率指数”,...“通道宽度(MHz)”]);台=(资源(:1:9);结束

另请参阅

功能

对象

相关的话题

Baidu
map