使用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(电台);
若要使用收音机上可供捕获的天线更新下拉菜单,请调用hCaptureAntennas
helper函数。然后选择与此示例一起使用的天线。
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(渠道、带);
接收机的设计
此图表显示了用于扫描所选通道和频带的接收器的概述。
这些步骤提供了关于图表的进一步信息。
设置前导探测器的中心频率,然后初始化检测和捕获一个波形的设定持续时间。
检查前导检测器是否检测到OFDM报文。
确定并应用波形上的频率和定时校正,然后尝试恢复遗留信号(L-SIG)场位。
检查报文格式是否为非ht。
从恢复的L-SIG中提取调制编码方案(MCS)和PLCP业务数据单元(PSDU)的长度。然后恢复非ht数据,然后解码MAC协议数据单元(MPDU)。
使用恢复的MAC帧配置,检查非ht报文是否为信标。
恢复SSID、BSSID、AP的厂商、信噪比、主20 MHz信道、当前信道中心频率索引、支持的信道宽度、频带和AP使用的无线标准。
检查波形是否包含另一个数据包,你可以解码。
初始化变量
当你打电话给捕获
函数要检测和捕获信号,则必须指定捕获的长度和信号检测超时时间。因为信标每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
盒子。选择retrieveVendorInfo
box从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);结束