主要内容

使用软件定义无线电的OFDM信标接收机

这个例子展示了如何使用软件定义无线电(SDR)检索5 GHz频段上的WiFi网络信息。该示例扫描5 GHz信标通道,并捕获波形以在MATLAB®中进行分析。然后,该示例解码OFDM包以确定哪些包是接入点(AP)信标。AP信标信息包括SSID (service set identifier)、MAC (media access control)地址(也称为基本SSID或BSSID)、AP通道带宽和AP使用的802.11标准。

简介

本例扫描5 GHz频段的一组WiFi通道,以检测在20 MHz子通道上传输的AP信标。

扫描过程包括以下步骤。

  • 设置SDR需要捕获的频段和通道。

  • 为每个指定的通道捕获一个设定持续时间的波形。

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

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

这个示例支持这些sdr来捕万博1manbetx获5 GHz频段的波形。

  • ADALM-Pluto来自模拟设备通信工具箱支持包万博1manbetx

  • USRP™嵌入式系列无线电通信工具箱支持包中的USRP™E310/E312万博1manbetx

  • Xilinx®Zynq®基于无线电的通信工具箱支持包中的AD936x/FMCOMMS5万博1manbetx

  • USRP™无线电通信工具箱支持包中的USRP™N200/N210/USRP2/N320/N321/B200/B210/X300/X310万博1manbetx

另外,如果SDR无法用于波形捕获,则该示例支持导入带有预捕获波形的文件。万博1manbetx

示例设置

在运行示例之前,请确保为您打算使用的SDR安装了适当的支持包,并设置了硬件。万博1manbetx

ReceiveOnSDR的字段rxsim结构确定该示例是从空中接收波形还是从MAT文件导入波形。

rxsim。ReceiveOnSDR =

中指定预捕获波形的文件名文件名变量。确认MAT文件包含以下变量:capturedWaveforms渠道radioSampleRate,乐队

文件名=“capturedBeacons.mat”

默认情况下,该示例处理存储在MAT文件中的波形。如果使用SDR对5ghz频段进行实时扫描,需要指定SDR名称、无线电标识符、无线电采样速率、通道号等参数。对于5ghz频段,有效的通道号应在1 ~ 200之间。但是,AP的有效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。

如果rxsim。ReceiveOnSDR rxsim。SDRDeviceName =“AD936x”用于波形接收的% SDRrxsim。RadioIdentifier =“192.168.3.2”%用于标识无线电的值,例如IP地址、USB端口或序列号30AD2D5rxsim。RadioSampleRate =20000000%配置为20e6 Hz,因为这是信标传输BWrxsim。RadioGain =50;rxsim。FrequencyBand = 5;rxsim。ChannelNumbers =[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]% Default扫描所有5 GHz信标通道rxsim。ReceiveAntenna =1配置为只使用一个天线工作rxsim。CaptureTime =毫秒(100)期望类型为持续时间的值%派生参数rxsim。中心频率= wlanChannelFrequency(rxsim.ChannelNumbers,rxsim.FrequencyBand);rxsim。NumSamplesToCapture = seconds(rxsim.CaptureTime)*rxsim.RadioSampleRate;其他的rx = load(fileName);rxsim。ChannelNumbers = rx.channels;rxsim。RadioSampleRate = rx.radioSampleRate;rxsim。FrequencyBand = rx.band;%派生参数rxsim。NumSamplesToCapture = size(rx.capturedWaveforms,1);结束osf = rxsim.RadioSampleRate/20e6;

“可选信息”设置为“显示”

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

retrieveVendorInfo =真正的

若要显示所有成功解码的非ht包的附加包信息,如负载大小、码率和调制,请选择displayAdditionalInfo盒子。

displayAdditionalInfo =

要显示捕获波形的频谱和谱图,请选择displayScope盒子。

displayScope =

扫描5 GHz通道

初始化SDR对象

此示例使用与所选无线电相关的对象与无线电硬件通信。

通过任意调用创建一个SDR对象sdrrxcomm.SDRuReceiver.然后,应用设置的参数rxsim结构的上面的属性。

如果rxsim。ReceiveOnSDR如果(rxsim匹配。SDRDeviceName, (“AD936x”“FMCOMMS5”“冥王星”“E3xx”) sdrReceiver = sdrrx(...rxsim。SDRDeviceName,...BasebandSampleRate = rxsim。RadioSampleRate,...GainSource =“手动”);如果(rxsim匹配。SDRDeviceName, (“AD936x”“FMCOMMS5”“E3xx”])当捕获波形时,跳过FPGA并获得数据%直接发送到主机sdrReceiver。ShowAdvancedProperties = true;sdrReceiver。BypassUserLogic = true;sdrReceiver。IPAddress = rxsim.RadioIdentifier;其他的sdrReceiver。RadioID = rxsim.RadioIdentifier;结束其他的%表示USRP特别提款权sdrReceiver = comm. sdrReceiver (...= rxsim平台。SDRDeviceName,...EnableBurstMode = true);确定突发捕获值每帧将有100个符号sdrReceiver。SamplesPerFrame = 4e-6*rxsim.RadioSampleRate*100;sdrReceiver。NumFramesInBurst = rxsim.NumSamplesToCapture/sdrReceiver.SamplesPerFrame;[sdrReceiver。MasterClockRate sdrReceiver。DecimationFactor] =...hGetUSRPRateInformation (rxsim.SDRDeviceName rxsim.RadioSampleRate);如果(rxsim匹配。SDRDeviceName, (“B200”“B210”])%根据需要更改USRP B200/B210的序列号sdrReceiver。SerialNum = rxsim.RadioIdentifier;其他的sdrReceiver。IPAddress = rxsim.RadioIdentifier;结束结束sdrReceiver。增益= rxsim.RadioGain;sdrReceiver。OutputDataType =“替身”;sdrReceiver。ChannelMapping = rxsim.ReceiveAntenna;结束

接收机的设计

此图显示了用于扫描所选通道和频带并恢复信标信息的接收器的概述。

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

  1. 设置SDR的中心频率,然后为设置的持续时间初始化波形捕获。

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

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

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

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

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

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

开始抓包和处理

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

  • 名称

  • BSSID

  • AP供应商

  • 信噪比(SNR)

  • 主20mhz通道

  • 当前通道中心频率指数

  • 通道宽度

  • 频带

  • AP支持的运行模式万博1manbetx

  • MAC帧配置

  • 信标存在的波形

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

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

初始化一个非ht配置对象以用于处理传入波形。

生化武器=“CBW20”;cfg = wlanNonHTConfig(ChannelBandwidth=cbw);ind = wlanFieldIndices(cfg);indexAP = 1;

开始扫描和解码指定的频道。

i = 1:length(rxsim.ChannelNumbers) fprintf(<强>扫描通道%d在波段%.1f.\n"rxsim.ChannelNumbers(我),rxsim.FrequencyBand);如果rxsim。ReceiveOnSDR sdrReceiver。CenterFrequency = rxsim. CenterFrequency (i);capturedData = capture波形(sdrReceiver,rxsim.NumSamplesToCapture);其他的capturedData = rx.capturedWaveforms(:,i);结束显示光谱和谱图如果displayScope% #好< * UNRCH >scope = spectrum alyzer(ViewType=“spectrum-and-spectrogram”, SampleRate = rxsim。RadioSampleRate,...TimeSpanSource =“财产”时间间隔= rxsim.NumSamplesToCapture / rxsim.RadioSampleRate);范围(capturedData);结束重新采样捕获的数据到20兆赫,用于信标处理。如果osf ~= 1 capturedData = resample(capturedData,20e6,rxsim.RadioSampleRate);结束searchOffset = 0;searchOffset <长度(capturedData)% recoverPreamble检测报文,并对非ht前导进行分析。[preambleStatus,res] = recoverPreamble(capturedData,cbw,searchOffset);如果匹配(preambleStatus"未检测到数据包"打破结束检索同步数据并按所完成的LSTF功率缩放它%在recoverPreamble函数中。syncData = capturedData(res.PacketOffset+1:end)./sqrt(res.LSTFPower);syncData = frequencyOffset(syncData,rxsim.RadioSampleRate/osf,-res.CFOEstimate);在LLTF之后只需要4个OFDM符号(LSIG + 3个以上的符号)用于格式检测的%fmtDetect = syncData(ind.LSIG(1):(ind.LSIG(2)+4e-6*rxsim.RadioSampleRate/osf*3));[LSIGBits, failcheck] = wlanLSIGRecover(fmtDetect(1:4e-6*rxsim.RadioSampleRate/osf*1),...res.ChanEstNonHT res.NoiseEstNonHT,生化武器);如果~failcheck format = wlanFormatDetect(fmtDetect,res.ChanEstNonHT,res.NoiseEstNonHT,cbw);如果匹配(格式,“Non-HT”从L-SIG的前3位提取MCS。rate = double(bit2int(LSIGBits(1:3),3));如果速率<= 1 cfg。MCS =速率+ 6;其他的cfg。MCS = mod(速率,6);结束从L-SIG中确定PSDU长度。cfg。PSDULength = double(bit2int(LSIGBits(6: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 && displayAdditionalInfo payloadSize = floor(length(bitsData)/8);[调制,coderate] = getRateInfo(cfg.MCS);流("有效载荷大小:%d |调制:%s |码率:%s \n",调制payloadSize coderate);流("类型:%s |子类型:%s"、cfgMAC.getType cfgMAC.getSubtype);结束从信标提取有关通道的信息。。如果~decodeStatus && matches(cfgMAC。FrameType,“灯塔”%用有关信标的信息填充表。如果isempty (cfgMAC.ManagementConfig.SSID) APs (indexAP)。名称=“隐藏”其他的APs (indexAP)。名称=string(cfgMAC.ManagementConfig.SSID);结束流("<强>%s信标检测到频道%d在波段%.1f.\n"、APs (indexAP) .SSID rxsim.ChannelNumbers(我),rxsim.FrequencyBand);APs (indexAP)。BSSID= string(cfgMAC.Address3);如果retrieveVendorInfo APs (indexAP)。供应商=determineVendor(cfgMAC.Address3);其他的APs (indexAP)。供应商=“跳过”结束(APs (indexAP)。模式,APs (indexAP)。Channel_Width_MHz, operatingChannel] =...determineMode (cfgMAC.ManagementConfig.InformationElements);如果isempty (operatingChannel)%默认为扫描通道,如果操作通道%无法确定。operatingChannel = rxsim.ChannelNumbers(i);结束APs (indexAP)。Beacon_Channel = rxsim.ChannelNumbers(i);APs (indexAP)。operationing_channel = operatingChannel;APs (indexAP)。SNR_dB = res.LLTFSNR;APs (indexAP)。MAC_Config = cfgMAC;APs (indexAP)。Offset = res.PacketOffset; APs(indexAP).Waveform = capturedData; indexAP = indexAP + 1;结束%移动while循环下次迭代的包搜索偏移量。searchOffset = res.PacketOffset + double(ind.NonHTData(2));其他的%包不是非ht;移动包搜索偏移10个OFDM符号(最小值%非ht的包长度)用于while循环的下一次迭代。searchOffset = res.PacketOffset + 4e-6*rxsim.RadioSampleRate/osf*10;结束其他的% L-SIG恢复失败;移动包搜索偏移10个OFDM符号(最小值%非ht的包长度)用于while循环的下一次迭代。searchOffset = res.PacketOffset + 4e-6*rxsim.RadioSampleRate/osf*10;结束结束结束
在频段5.0上扫描52频道。
WLAN_5G信标在52频道5.0波段检测到。
从IEEE注册授权机构下载ui.csv…
在频段5.0上扫描56频道。
在56频道5.0波段检测到w内部信标。在56频道5.0波段检测到w移动信标。在56频道5.0波段检测到w-来宾信标。
在5.0波段扫描157频道。
在5.0频带的157频道检测到w内部信标。在5.0波段157频道检测到w移动信标。在5.0波段157频道检测到w-来宾信标。

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

detectedBeaconsInfo = generateBeaconTable(APs,rxsim.FrequencyBand,retrieveVendorInfo)
detectedBeaconsInfo =7×9表SSID BSSID供应商信噪比(dB)主要20 MHz通道电流通道中心频率指数通道宽度(MHz)带模式  __________ ______________ ____________________________ ________ ______________________ ______________________________________ ___________________ ____ __________ " WLAN_5G”“04 d4c451c584”“华硕电脑公司。”34.57 52 50 "160" 5 "802.11ax" "w-inside" "B0B867F6B2D0" "惠普企业" 26.24 56 58 "80" 5 "802.11ac" "B0B867F6B2D1" "惠普企业" 25.843 56 58 "80" 5 "802.11ac" "w-inside" "B0B867F3D9B0" "惠普企业" 31.592 157 155 "80" 5 "802.11ac" "w-mobile" "B0B867F3D9B1" "惠普企业" 31.971 157 155 "80" 5 "802.11ac" "w-mobile" "B0B867F3D9B2" "惠普企业" 26.251 56 58 "80" 5 "802.11ac" "w-guest" "惠普企业"B0B867F3D9B2Packard Enterprise" 33.3 157 155 "80" 5 "802.11ac"
如果rxsim。ReceiveOnSDR释放(sdrReceiver);结束

进一步的探索

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

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

本地函数

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

函数波形= capture波形(sdrReceiver,numSamplesToCapture)返回给定的复值的列向量对象和标量NUMSAMPLESTOCAPTURE值。对于com . sdrureceiver对象,使用突发捕获技术来%获取波形如果isa (sdrReceiver“comm.SDRuReceiver”)波形=复数(零(numSamplesToCapture,1));samplesPerFrame = sdrReceiver.SamplesPerFrame;i = 1:sdrReceiver。NumFramesInBurst波形(samplesPerFrame*(i-1)+(1:samplesPerFrame)) = sdrReceiver();结束其他的波形=捕获(sdrReceiver,numSamplesToCapture);结束结束函数[调制,编码]= getRateInfo(mcs)% GETRATEINFO以字符数组的形式返回调制方案给定表示调制的标量整数的包的码率%编码方案开关mcs情况下0% BPSK调制=“BPSK”;coderate =“1/2”情况下1% BPSK调制=“BPSK”;coderate =“3/4”情况下2%正交相移编码调制=“正交相移编码”;coderate =“1/2”情况下3.%正交相移编码调制=“正交相移编码”;coderate =“3/4”情况下4% 16 qam调制=16 qam的;coderate =“1/2”情况下5% 16 qam调制=16 qam的;coderate =“3/4”情况下6% 64 qam调制=64 qam;coderate =“2/3”否则% 64 qam调制=64 qam;coderate =“3/4”结束结束函数vendor = determineVendor(mac)% DETERMINEVENDOR返回AP的供应商名称来自指定MAC地址的组织唯一标识符。持续的Ouis vendor = strings(0);试一试如果isempty(是的)如果~ (“oui.csv”“文件”) disp (“从IEEE注册授权机构下载ui.csv…”)选项= weboptions(“超时”10);websave (“oui.csv”“http://standards-oui.ieee.org/oui/oui.csv”、选择);结束可读的(“oui.csv”VariableNamingRule =“保存”);结束从MAC地址提取OUI。Oui = mac(1:6);根据OUI提取供应商名称。Vendor = string(cell2mat(ouis。(“机构名称”)(匹配(ouis.Assignment是的))));%重新抛出捕获的错误作为警告。警告(ME.message +要跳过determinevendoror函数调用,请设置retrieveVendorInfo为false。[]);结束如果Isempty (vendor) vendor =“未知”结束结束函数[mode,bw, operingchannel] = 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));IDs = elementIDs(:,1);如果任何(id = = 255)如果任何(elementIDs (id = = 255, 2) = = 35)% HE报文格式模式=“802.11斧头”其他的模式=“未知”结束vhtElement = informationElements{IDs==192,2};htElement = informationElements{IDs==61,2};[bw,operatingChannel] = determineChannelWidth(htElement,vhtElement);elseif任何(id = = 191)VHT报文格式模式=“802.11交流”;vhtElement = informationElements{IDs==192,2};htElement = informationElements{IDs==61,2};[bw,operatingChannel] = determineChannelWidth(htElement,vhtElement);elseif任何(id = = 45)% HT报文格式模式=“802.11 n”;htElement = informationElements{IDs==61,2};[bw,operatingChannel] = determineChannelWidth(htElement);其他的非ht报文格式%排除b,因为只支持DSSS万博1manbetx模式=“802.11 a / g / j / p”;bw =“未知”;operatingChannel = [];结束结束函数[bw,operatingChannel] = determineChannelWidth(htElement,varargin)对象返回通道的带宽%信标操作信息元素定义在IEEE Std 802.11-2020表11-23。msbFirst = false;%转换为位得到STA通道宽度值在第3位。htOperationInfoBits = int2bit(htElement(2),5*8,msbFirst);operationingchannel = 0;如果nargin == 2 vhtElement = varargin{1};VHT操作通道宽度字段CW = vhtElement(1);信道中心频率段0CCFS0 = vhtElement(2);信道中心频率段CCFS1 = vhtElement(3);如果htOperationInfoBits(3) == 0 bw =“20”;operatingChannel = CCFS0;elseifCw == 0操作通道宽度字段为1bw =“40”;operatingChannel = CCFS0;elseifCcfs1 == 0操作通道宽度字段为1和操作通道宽度字段为1bw =“80”;operatingChannel = CCFS0;elseifabs(CCFS1 - CCFS0) == 8操作通道宽度字段为1和操作通道宽度字段为1和% CCFS1大于0bw =“160”;operationingchannel = CCFS1;其他的操作通道宽度字段为1和操作通道宽度字段为1和% CCFS1大于0且% |CCFS1 - CCFS0|大于16bw =“80 + 80”结束结束如果operatingChannel == 0如果htOperationInfoBits(3) == 1 bw =“40”;secondaryChannelOffset = bit2int(htOperationInfoBits(1:2),2,false);如果secondaryChannelOffset == 1次要通道高于主通道。operationingchannel = htElement(1) + 2;elseifsecondaryChannelOffset == 3次要通道低于主通道。operationingchannel = htElement(1) - 2;其他的警告(“无法确定运营渠道。”结束其他的bw =“20”;operatingChannel = htElement(1);结束结束结束函数tbl = generateBeaconTable(APs,band,retrieveVendorInfo)GENERATEBEACONTABLE将接入点结构转换为表和%清理变量名。tbl = struct2table(APs,“AsArray”,真正的);资源描述。Band = repmat(Band,length(tbl.SSID),1);TBL = renamevars(TBL,[“SNR_dB”“Beacon_Channel”“Operating_Channel”“Channel_Width_MHz”),...“信噪比”(dB)“主20兆赫频道”“当前渠道中心频率指数”..."通道宽度(兆赫)"]);如果retrievendorinfo tbl = tbl(:,1:9);其他的TBL = TBL (:,[1:2,4:9]);结束结束