主要内容

使用软件定义无线电的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的关键信息。

本例支持这些用于捕获5 G金宝appHz频段波形的sdr。

  • ADALM-Pluto来自模拟设备通信工具箱支持包ADALM-Pluto无线电金宝app

  • USRP™嵌入式系列无线电的通信工具箱支持包中的USRP™E310/E312金宝app

  • Xilinx®Zynq®基于无线电的通信工具箱支持包中的AD936x/FMCOMMS5金宝app

  • USRP™无线电通信工具箱支持包中的USRP™N200/N210/USRP2/N320/N321/B200/B210/X300/X310金宝app

或者,如果SDR不可用于波形捕获,则该示例支持导入具有预捕获波形的文件。金宝app

示例设置

在运行示例之前,请确保已经安装了打算使用的SDR的适当支持包,并且已经设置了硬件。金宝app

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”% SDR用于接收波形rxsim。RadioIdentifier =“192.168.3.2”用于标识无线电的值,例如IP地址、USB端口或序列号30AD2D5rxsim。RadioSampleRate =20000000%配置为20e6hz,因为这是信标传输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]%默认扫描所有5 GHz信标通道rxsim。ReceiveAntenna =1%配置为只使用单个天线工作rxsim。CaptureTime =毫秒(100)希望类型为持续时间的值导出参数rxsim。CenterFrequencies = wlanChannelFrequency(rxsim.ChannelNumbers,rxsim.FrequencyBand);rxsim。NumSamplesToCapture = seconds(rxsim.CaptureTime)*rxsim.RadioSampleRate;其他的rx = load(fileName);rxsim。ChannelNumbers = rx.channels;rxsim。RadioSampleRate = rx.radioSampleRate;rxsim。频带= 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 sdrsdrReceiver = com . sdrureceiver (...= 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厂商、信噪比、主20mhz信道、当前信道中心频率指数、支持的信道宽度、频带、AP使用的无线标准。金宝app

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

开始包捕获和处理

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

  • 名称

  • BSSID

  • AP供应商

  • 信噪比

  • 主20 MHz信道

  • 当前信道中心频率指数

  • 通道宽度

  • 频带

  • AP支持的工作模式金宝app

  • 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 = spectrumAnalyzer(ViewType=“spectrum-and-spectrogram”, SampleRate = rxsim。RadioSampleRate,...TimeSpanSource =“财产”时间间隔= rxsim.NumSamplesToCapture / rxsim.RadioSampleRate);范围(capturedData);结束将捕获的数据重新采样到20mhz用于信标处理。如果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);[调制,coate] = 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频道。
5频段52信道检测到WLAN_5G信标。
从IEEE注册中心下载oui.csv…
在5.0波段扫描56频道。
在56频道5.0波段探测到w-内部信标。在56频道5.0波段检测到w-移动信标。在56频道5.0波段检测到w-来宾信标。
在5.0波段扫描157频道。
在157频道检测到w-内部信标,频带5.0。在157频道5.0波段检测到w-移动信标。在157频道检测到w客人信标,频带5.0。

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

detectedBeaconsInfo = generateBeaconTable(ap,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”“w-mobile”“B0B867F6B2D1”“惠普企业”26.251 56 58“80”5“802.11ac”“w-guest”“B0B867F6B2D2”“惠普企业”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-guest”“B0B867F3D9B2”“HewlettPackard Enterprise“33.3 157 155”80“5”802.11ac”
如果rxsim。ReceiveOnSDR释放(sdrReceiver);结束

进一步的探索

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

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

本地函数

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

函数波形=捕获波形(sdrReceiver,numSamplesToCapture)返回给定的复值的列向量% srreceiver对象和一个标量NUMSAMPLESTOCAPTURE值。对于com . sdrureceiver对象,使用突发捕获技术来%获取波形如果isa (sdrReceiver“comm.SDRuReceiver”)波形=复杂(零(numSamplesToCapture,1));samplesPerFrame = sdrReceiver.SamplesPerFrame;i = 1: srdrreceiver。NumFramesInBurst波形(samplesPerFrame*(i-1)+(1:samplesPerFrame)) = srdrreceiver ();结束其他的波形=捕获(sdrReceiver,numSamplesToCapture);结束结束函数[调制,coate] = getRateInfo(mcs)返回调制方案作为字符数组给定表示调制的标量整数的包的码率%编码方案开关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)元素返回AP的供应商名称来自指定MAC地址的组织唯一标识符(OUI)。持续的Ouis vendor = strings(0);试一试如果isempty(是的)如果~ (“oui.csv”“文件”) disp ("从IEEE注册中心下载oui.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,operatingChannel] = determineMode(informationElements)确定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金宝app模式=“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);信道中心频率段1CCFS1 = vhtElement(3);如果htOperationInfoBits(3) == 0 bw =“20”;operatingChannel = CCFS0;elseifCw == 0% HT操作通道宽度字段为1bw =“40”;operatingChannel = CCFS0;elseifCcfs1 == 0% HT操作通道宽度字段为1和% VHT操作通道宽度字段为1bw =“80”;operatingChannel = CCFS0;elseifabs(CCFS1 - CCFS0) == 8% HT操作通道宽度字段为1和% VHT操作通道宽度字段为1和% CCFS1大于0bw =“160”;operatingChannel = CCFS1;其他的% HT操作通道宽度字段为1和% VHT操作通道宽度字段为1和% CCFS1大于0和% |CCFS1 - CCFS0|大于16bw =“80 + 80”结束结束如果operatingChannel == 0如果htOperationInfoBits(3) == 1 bw =“40”;secondaryChannelOffset = bit2int(htOperationInfoBits(1:2),2,false);如果secondaryChannelOffset == 1次要通道高于主要通道。operatingChannel = htElement(1) + 2;elseifsecondaryChannelOffset == 3次要通道低于主要通道。operatingChannel = htElement(1) - 2;其他的警告(“无法确定操作通道。”结束其他的bw =“20”;operatingChannel = htElement(1);结束结束结束函数tbl = generateBeaconTable(APs,band,retrieveVendorInfo)GENERATEBEACONTABLE将接入点结构转换为表和%清除变量名。tbl = struct2table(ap,“AsArray”,真正的);资源描述。Band = repmat(Band,length(tbl.SSID),1);(TBL,[“SNR_dB”“Beacon_Channel”“Operating_Channel”“Channel_Width_MHz”),...“信噪比”(dB)“主20 MHz信道”“当前渠道中心频率指数”..."通道宽度(兆赫)"]);如果retrieveVendorInfo tbl = tbl(:,1:9);其他的TBL = TBL (:,[1:2,4:9]);结束结束