主要内容

用捕获的数据测试深度神经网络以检测WLAN路由器模拟

这个例子展示了如何用捕获的数据训练射频指纹卷积神经网络(CNN)。您使用软件定义无线电(SDR)从实际路由器捕获无线局域网(WLAN)信标帧。你编写第二个SDR来传输未知信标帧并捕获它们。你用这些捕获的信号训练CNN。然后,您将软件定义无线电(SDR)编程为路由器模拟程序,它使用已知路由器之一的媒体访问控制(MAC)地址传输信标信号,并使用CNN将其识别为模拟程序。

有关路由器模拟和使用模拟数据验证网络设计的更多信息,请参见设计一个具有模拟数据的深度神经网络来检测WLAN路由器假冒(通信工具箱)的例子。

利用捕获数据进行训练

收集真实WLAN路由器的802.11a/g/n/ac OFDM非高吞吐量(non-HT)信标帧数据集。如在设计一个具有模拟数据的深度神经网络来检测WLAN路由器假冒(通信工具箱)例如,为了避免任何数据依赖,只有在序言中出现的遗留的长训练字段(L-LTF)字段被用作训练单元。

在本例中,使用下图中描述的场景收集数据。观测者是一台静止的ADALM-PLUTO无线电。收集的已知路由器数据如下:

  1. 根据路由器使用的WLAN信道,设置观测器的中心频率

  2. 接收信标帧

  3. 提取L-LTF信号

  4. 解码MAC地址以用作标签

  5. 保存L-LTF信号及其标签

  6. 重复步骤2-5收集numFramesPerRouter帧的numKnownRouters路由器。

使用移动ADALM-PLUTO无线电作为发射机来模拟未知路由器信标帧。这个无线电重复地发送带有随机MAC地址的信标帧。未知路由器数据收集如下:

  1. 生成带有随机MAC地址的信标帧

  2. 开始使用ADALM-PLUTO无线电重复发送信标帧

  3. 收集NUMFRAMES信标帧

  4. 提取L-LTF信号

  5. 保存标签为“Unknown”的L-LTF帧

  6. 把收音机移到另一个位置

  7. 重复步骤3-6收集数据NUMLOC位置

该已知和未知路由器的组合数据集用于训练与设计一个具有模拟数据的深度神经网络来检测WLAN路由器假冒(通信工具箱)的例子。

此示例下载训练数据和训练过的网络//www.tatmou.com/金宝appsupportfiles/spc/RFFingerprinting/RFFingerprintingCapturedData.tar.gz如果没有Internet连接,可以在连接到Internet的计算机上手动下载该文件,并保存到与当前示例文件相同的目录中。出于隐私原因,MAC地址在下载的数据中被匿名化了。若要复制此示例的结果,请捕获您自己的数据附录:已知和未知路由器数据收集

rfFingerprintingDownloadData (“捕获”
开始下载数据文件从://www.tatmou.com/supportfiles/spc/RFFingerpri金宝appnting/RFFingerprintingCapturedData.tar.gz下载和提取文件完成

要快速运行此示例,请使用下载的预训练网络。要在您的计算机上训练网络,请选择“立即训练网络”选项(即设置网络trainNow为true)。使用Nvidia(R) Titan Xp GPU训练这个网络大约需要5分钟。在CPU上进行训练可能会导致很长时间的训练。

trainNow =% #好< * UNRCH >

本例使用了来自四个已知路由器的数据。数据集包含每个路由器3600帧,其中90%用作训练帧,10%用作测试帧。

numKnownRouters = 4;numFramesPerRouter = 3600;numTrainingFramesPerRouter = numFramesPerRouter * 0.9;numTestFramesPerRouter = numFramesPerRouter * 0.1;frameLength = 160;

预处理已知和未知的路由器数据

将收集到的复杂基带数据分离为同相分量和正交分量,并将其重塑为2 * frameLength * 1 * numFramesPerRouter*numKnownRouters矩阵。对于未知的路由器数据重复相同的过程。下面的代码使用以前收集和预处理的数据。若要使用您自己的数据,请先收集中所述的数据附录:已知和未知路由器数据收集.复制命名为rfFingerprintingCapturedDataUser.matrfFingerprintingCapturedUnknownFramesUser.mat到与此示例相同的目录。然后更新负载命令来加载这些文件。

如果trainNow加载已知路由器数据负载(“rfFingerprintingCapturedData.mat”%创建标签向量yTrain = repelem(MACAddresses, numTrainingFramesPerRouter);yTest = repelem(MACAddresses, numTestFramesPerRouter);I和Q分开numTrainingSamples = numTrainingFramesPerRouter*numKnownRouters*frameLength;xTrainingFrames = xTrainingFrames(1:numTrainingSamples,1);xTrainingFrames = [real(xTrainingFrames), imag(xTrainingFrames)];numTestSamples = numTestFramesPerRouter*numKnownRouters*frameLength;xTestFrames = xTestFrames(1:numTestSamples,1);xTestFrames = [real(xTestFrames), imag(xTestFrames)];将数据集重塑为2 × frameLength × 1 × numTrainingFramesPerRouter*numKnownRouters矩阵xTrainingFrames = permute(...重塑(xTrainingFrames,[frameength,numTrainingFramesPerRouter*numKnownRouters, 2,1]),...[1 3 4 2]);将数据集重塑为2 x frameLength x 1 x numTestFramesPerRouter*numKnownRouters矩阵xTestFrames = permute(...(xTestFrames,[frameLength,numTestFramesPerRouter*numKnownRouters, 2,1]),...[1 3 4 2]);加载未知路由器数据负载(“rfFingerprintingCapturedUnknownFrames.mat”%培训单元数numUnknownFrames = size(unknownFrames, 4);将数据分成90%训练和10%测试numUnknownTrainingFrames = floor(numUnknownFrames*0.9);numUnknownTest = numUnknownFrames - numUnknownTrainingFrames;将ADALM-PLUTO数据添加到训练和测试数据集中xTrainingFrames(:,:,:,(1:numUnknownTrainingFrames) + numTrainingFramesPerRouter*numKnownRouters)...= unknownFrames(:,:,:, 1:numUnknownTrainingFrames);xTestFrames(:,:,:,(1:numUnknownTest) + numTestFramesPerRouter*numKnownRouters)...= unknownFrames(:,:,:, (1:numUnknownTest) + numUnknownTrainingFrames);% Shuffle数据vr = randperm(numKnownRouters*numTrainingFramesPerRouter+numUnknownTrainingFrames);xTrainingFrames = xTrainingFrames(:,:,:,vr);添加“未知”标签并洗牌yTrain = [yTrain, repmat(“未知”, [1, numUnknownTrainingFrames])];yTrain = categorical(yTrain(vr));yTest = [yTest, repmat(“未知”, [1, numUnknownTest])];yTest = categorical(yTest);结束

训练CNN

使用与模拟数据示例训练相同的神经网络架构和训练选项。

poolSize = [2 1];strideSize = [2 1];%创建网络架构图层= [imageInputLayer([frameLength 2 1],“归一化”“没有”“名字”输入层的)卷积2dlayer ([7 1], 50,“填充”, [10],“名字”“CNN1”) batchNormalizationLayer (“名字”“BN1”) leakyReluLayer (“名字”“LeakyReLu1”) maxPooling2dLayer (poolSize“步”strideSize,“名字”“MaxPool1”)卷积2dlayer ([7 2], 50,“填充”, [10],“名字”“CNN2”) batchNormalizationLayer (“名字”“BN2”) leakyReluLayer (“名字”“LeakyReLu2”) maxPooling2dLayer (poolSize“步”strideSize,“名字”“MaxPool2”) fullyConnectedLayer (256,“名字”“FC1”) leakyReluLayer (“名字”“LeakyReLu3”) dropoutLayer (0.5,“名字”“DropOut1”) fullyConnectedLayer (80,“名字”“取得”) leakyReluLayer (“名字”“LeakyReLu4”) dropoutLayer (0.5,“名字”“DropOut2”) fullyConnectedLayer (numKnownRouters + 1,“名字”“一个FC3”文件) softmaxLayer (“名字”“SoftMax”) classificationLayer (“名字”“输出”));

配置培训选项以使用ADAM优化器,迷你批量大小为128。使用测试帧进行验证,因为超参数的优化是在[1]

默认情况下,ExecutionEnvironment设置为“汽车”它使用GPU进行训练(如果有的话)。否则,trainNetwork使用CPU进行训练。若要显式设置执行环境,请使用setExecutionEnvironment致其中一位“cpu”“图形”“multi-gpu”,或“平行”.选择“cpu”可能会导致很长的训练时间。

如果trainNow miniBatchSize = 128;%培训选项选项= trainingOptions(“亚当”...“MaxEpochs”30岁的...“ValidationData”{xTestFrames,欧美},...“ValidationFrequency”,floor((numTrainingFramesPerRouter*numKnownRouters + numUnknownTrainingFrames)/miniBatchSize/3),...“详细”假的,...“L2Regularization”, 0.0001,...“InitialLearnRate”, 0.0001,...“MiniBatchSize”miniBatchSize,...“ValidationPatience”5,...“阴谋”“训练进步”...“洗牌”“every-epoch”);%培训网络capturedDataNet = trainNetwork(xTrainingFrames, yTrain, layers, options);其他的负载(“rfFingerprintingCapturedDataTrainedNN.mat”“capturedDataNet”“xTestFrames”“次”“MACAddresses”结束

下图显示了在一台使用单个Nvidia Titan Xp GPU的计算机上运行的网络的训练过程,其中网络在大约10个epoch内收敛到几乎100%的准确率。最终网络的准确率为100%。

生成混淆矩阵。

图yTestPred =分类(捕获datanet,xTestFrames);cm = confusionchart(yTest, yTestPred);厘米。Title =“测试数据的混淆矩阵”;厘米。RowSummary =“row-normalized”

SDR测试

在类“Unknown”上测试训练网络的性能。使用已知路由器和一个未知路由器的MAC地址生成信标帧。使用ADALM-PLUTO无线电发送这些帧,并使用另一个ADALM-PLUTO无线电接收这些帧。由于这两个无线电之间产生的信道和射频损伤与真实路由器和观察者之间产生的信道和射频损伤不同,神经网络应该将所有接收到的信号归类为“未知”。如果接收到的MAC地址是已知的,则系统将该源声明为路由器模仿者。如果接收到的MAC地址是未知的,则系统将该源声明为未知路由器。要执行此测试,需要两台ADALM-PLUTO无线电来进行传输和接收。此外,您还需要安装ADALM-PLUTO无线电通信工具箱支持包金宝app

波形的一代

生成由不同MAC地址的信标帧组成的传输波形。发射机重复传输这些WLAN帧。接收器捕获WLAN帧,并使用接收到的MAC地址和经过训练的神经网络检测到的RF指纹来确定它是否是路由器模仿者。

chanBW =“CBW20”通道带宽%Osf = 2;%过采样因子frameLength = 160;%帧长度样本创建信标帧体配置对象frameBodyConfig = wlanMACManagementConfig;创建信标帧配置对象beaconFrameConfig = wlanMACFrameConfig(“FrameType”“灯塔”);beaconFrameConfig。ManagementConfig = frameBodyConfig;创建插值和抽取对象Decimator = dsp。FIRDecimator (“DecimationFactor”(osf);保存已知MAC地址knownMACAddresses = MACAddresses;macaddressestosimulation = [MACAddresses,“ABCDEFABCDEF”];使用已知路由器的MAC地址创建WLAN波形%未知路由器tx波形=零(1540,5);i = 1:length(MACAddressesToSimulate)%设置MAC地址beaconFrameConfig。Address2 = macaddressestosimulation (i);生成信标帧位[beacon, mpduLength] = wlanMACFrame(beaconFrameConfig,“OutputFormat”“位”);nonHTcfg = wlanNonHTConfig(...“ChannelBandwidth”chanBW,...“主持人”, 1...“PSDULength”, mpduLength);tx波形(:,i) = [wlanWaveformGenerator(beacon, nonHTcfg);1) 0(20日);结束tx波形= tx波形(:);获得5ghz频段153频道的中心频率fc = helperWLANChannelFrequency(153,5);fs = wlanSampleRate(nonHTcfg);txSig = resample(tx波形,osf,1);在突发模式下每帧采样百分比spf = length(txSig)/length(MACAddressesToSimulate);runSDRSection = false;如果helperIsPlutoSDRInstalled()收音机= findPlutoRadio();如果长度(收音机)>= 2 runSDRSection = true;其他的disp (“需要两台ADALM-PLUTO无线电。跳过SDR测试。”结束其他的disp ("没有找到模拟设备ADALM-PLUTO无线电的金宝app通信工具箱支持包。") disp (单击MATLAB工具条的“主页”选项卡中的“加载项”以安装支持包。金宝app) disp (“跳过SDR测试。”结束如果runSDRSection设置PlutoSDR发射机deviceNameSDR =“冥王星”;txGain = 0;txSDR = sdrtx(deviceNameSDR);txSDR。RadioID =“usb: 0”;txSDR。BasebandSampleRate = fs*osf;txSDR。中心频率= fc;txSDR。增益= tx增益;设置PlutoSDR接收器rxSDR = sdrrx(deviceNameSDR);rxSDR。RadioID =“usb: 1”;rxSDR。BasebandSampleRate = txSDR.BasebandSampleRate;rxSDR。CenterFrequency = txSDR.CenterFrequency;rxSDR。GainSource =“手动”;rxSDR。增益= 30;rxSDR。OutputDataType =“双”;rxSDR.EnableBurstMode = true;rxSDR。NumFramesInBurst = 20;rxSDR。SamplesPerFrame = osf*spf;结束

L-LTF用于分类

每个信标帧序文中的L-LTF序列被用作神经网络的输入单元。rfFingerprintingNonHTFrontEndSystem对象用于检测WLAN报文,执行同步任务,提取L-LTF序列和数据。此外,MAC地址也被解码。此外,利用训练好的网络对数据进行预处理和分类。

如果runSDRSection numLLTF = 20;为测试捕获的L-LTF的百分比rxFrontEnd = rfFingerprintingNonHTFrontEnd(“ChannelBandwidth”“CBW20”);disp (已知的MAC地址是:);disp (knownMACAddresses)%设置PlutoSDR重复传输disp (“从发射机”) transrepeat (txSDR, txSig);捕获帧百分比计数器numCapturedFrames = 0;disp (“开始接收”%循环直到收集到numLLTF帧numCapturedFrames < numLLTF使用PlutoSDR接收数据rxSig = rxSDR();rxSig = decimator(rxSig);执行前端处理和有效载荷缓冲[payloadFull, cfgNonHT, rxNonHTData, chanEst, noiseVar, LLTF] =...rxFrontEnd (rxSig);如果payloadFull%恢复有效载荷位recBits = wlanNonHTDataRecover(rxNonHTData, chanEst,...noiseVar cfgNonHT,“EqualizationMethod”“ZF”);解码和评估恢复的位[mpduCfg, ~, success] = wlanMPDUDecode(recBits, cfgNonHT);如果success == wlanMACDecodeStatus。成功%更新计数器numCapturedFrames = numCapturedFrames+1;创建实值输入LLTF = [real(LLTF), imag(LLTF)];LLTF = permute(重塑(LLTF,frameLength,[], 2,1), [1 3 4 2]);ypred = classid(捕获datanet, LLTF);如果sum(contains(knownMACAddresses, mpduCfg.Address2)) ~= 0如果分类(convertCharsToStrings (mpduCfg.Address2)) ~ = ypred disp (strcat (“MAC地址”, mpduCfg。Address2,"已知,指纹不匹配,检测到ROUTER IMPERSONATOR "))其他的disp (strcat (“MAC地址”, mpduCfg。Address2,“已知,指纹匹配”))结束其他的disp (strcat (“MAC地址”, mpduCfg。Address2,“未被识别,未知装置”));结束结束结束结束发行版(txSDR)结束
已知的MAC地址为:
" 71b63a2d0b83 " " a3f8ac0f2253 " " ef11d125044a " " f636a97e07e7 "
从发射机
##建立硬件连接。这个过程可能需要几秒钟。波形传输已成功启动,并将无限重复。##调用release方法停止传输。
开始接收
##建立硬件连接。这个过程可能需要几秒钟。
MAC Address A3F8AC0F2253已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address F636A97E07E7已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address A3F8AC0F2253已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address F636A97E07E7已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address 71B63A2D0B83已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address EF11D125044A已知,指纹不匹配,检测到路由器模拟程序
MAC地址ABCDEFABCDEF不被识别,未知设备
MAC Address A3F8AC0F2253已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address F636A97E07E7已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address 71B63A2D0B83已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address EF11D125044A已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED
MAC地址ABCDEFABCDEF不被识别,未知设备
MAC Address A3F8AC0F2253已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address F636A97E07E7已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address 71B63A2D0B83已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address EF11D125044A已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED
MAC地址ABCDEFABCDEF不被识别,未知设备
MAC Address A3F8AC0F2253已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address F636A97E07E7已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED MAC Address 71B63A2D0B83已知,指纹不匹配,ROUTER IMPERSONATOR DETECTED

进一步的探索

从自己的路由器捕获数据,如中所述附录:已知和未知路由器数据收集,用这些数据训练神经网络,并测试网络的性能。

附录:Helper函数

附录:已知和未知路由器数据收集

使用rfFingerprintingRouterDataCollection从已知的(即可信的)路由器收集数据。该功能提取从商用802.11硬件传输的802.11a/g/n/ac OFDM非ht信标帧中存在的L-LTF信号。有关更多信息,请参阅IEEE®802.11™WLAN - OFDM信标接收机与USRP®硬件(USRP无线电通信工具箱支持包)金宝app的例子。使用L-LTF信号和相应的路由器MAC地址来训练射频指纹神经网络。如果路由器和它们的天线是固定的,很难无意中移动,这种方法效果最好。例如,在大多数办公环境中,路由器都安装在天花板上。遵循以下步骤:

  1. 将ADALM-PLUTO收音机连接到您的PC上,作为观察者收音机使用。

  2. 把收音机放在一个能接收尽可能多路由器信号的中心位置。把收音机修好,让它不动。如果可能的话,把观察者收音机放在天花板上或高墙上。

  3. 确定路由器的通道号。你可以使用手机上的Wi-Fi分析应用程序来找出频道号。

  4. 运行“”开始数据收集rfFingerprintingRouterDataCollection(频道),其中channel是Wi-Fi频道号

  5. 监视“max(abs(LLTF))”值。如果大于1.2或小于0.01,使用的增益输入调整接收机的增益rfFingerprintingRouterDataCollection函数。

使用辅助函数rfFingerprintingUnknownClassDataCollectionTxrfFingerprintingUnknownClassDataCollectionRx从未知路由器收集数据。这些功能设置两个ADALM-PLUTO无线电来发送和接收L-LTF信号。将接收到的信号与已知的路由器信号结合起来训练神经网络。您需要两台ADALM-PLUTO无线电,最好连接到两台独立的pc上。遵循以下步骤:

  1. 将一台ADALM-PLUTO收音机连接到一台固定的PC,作为未知路由器

  2. 通过运行启动传输”rfFingerprintingUnknownClassDataCollectionTx

  3. 将另一台ADALM-PLUTO无线电连接到移动PC上作为观察员

  4. 运行“”开始数据收集rfFingerprintingUnknownClassDataCollectionRx”。默认情况下,该函数在每个位置收集200帧。每个位置代表一个不同的未知路由器。

  5. 当该函数指示您移动到一个新的位置时,将观察者无线电移动到一个新的位置。默认情况下,该函数从10个位置收集数据。

  6. 如果观测者没有接收到任何信标或很少接收到信标,将观测者移到离发射机更近的地方。

  7. 一旦数据收集完成,调用“发行版(sdrTransmitter)在发射无线电的MATLAB会话中。

选定的参考书目

[1] K. Sankhe, M. Belgiovine, F. Zhou, S. Riyaz, S. Ioannidis和K. Chowdhury,“ORACLE:通过卷积神经网络优化无线电分类”,IEEE INFOCOM 2019 - IEEE计算机通信会议,法国巴黎,2019年,第370-378页。

相关的话题