В этом примере показано, как создать радиочастотную (RF) сверточную нейронную сеть (CNN) с моделируемыми данными. Вы обучаете CNN моделируемым кадрам радиомаяка беспроводной локальной сети (WLAN) от известных и неизвестных маршрутизаторов для радиочастотной дактилоскопии. Затем можно сравнить адрес управления доступом к среде (MAC) принятых сигналов и идентификационный код RF, обнаруженный CNN, для обнаружения имитаторов маршрутизатора WLAN.
Дополнительные сведения о тестировании проектируемой нейронной сети с использованием сигналов, полученных от реальных маршрутизаторов Wi-Fi, см. в примере «Тестирование глубокой нейронной сети с использованием захваченных данных для обнаружения олицетворения маршрутизатора WLAN» (Communications Toolbox).
Олицетворение маршрутизатора - это форма атаки на сеть WLAN, когда злонамеренный агент пытается выдать себя за законного маршрутизатора и заставить пользователей сети подключиться к ней. Решения по идентификации безопасности, основанные на простых цифровых идентификаторах, таких как MAC-адреса, IP-адреса и SSID, не эффективны при обнаружении такой атаки. Эти идентификаторы можно легко подделать. Следовательно, более защищенное решение использует другую информацию, такую как радиочастотная сигнатура радиолинии, в дополнение к этим простым цифровым идентификаторам.
Беспроводная пара передатчик-приемник создает уникальную РЧ-сигнатуру в приемнике, которая является комбинацией ухудшения канала и РЧ. Радиочастотная дактилоскопия - это процесс различения передающих радиостанций в совместно используемом спектре через эти подписи. В [1] авторы разработали сеть глубокого обучения (DL), которая потребляет необработанные синфазные/квадратурные (IQ) выборки основной полосы частот и идентифицирует передающее радио. Сеть может идентифицировать передающие радиоблоки, если нарушения РЧ являются доминирующими или профиль канала остается постоянным в течение времени работы. Большинство сетей WLAN имеют фиксированные маршрутизаторы, которые создают статический профиль канала, когда местоположение приемника также фиксировано. В таком сценарии сеть глубокого обучения может идентифицировать олицетворители маршрутизатора путем сравнения пары RF-отпечатка сигнала и MAC-адреса принятого сигнала с парой известных маршрутизаторов.
В этом примере моделируется система WLAN с несколькими фиксированными маршрутизаторами и фиксированным наблюдателем с помощью Toolbox™ WLAN и обучается нейронной сети (NN) с моделируемыми данными с помощью Deep Learning Toolbox™.
Предположим, что в помещении имеется несколько доверенных маршрутизаторов с известными MAC-адресами, которые мы будем называть известными маршрутизаторами. Также предположим, что неизвестные маршрутизаторы могут входить в область наблюдения, некоторые из которых могут быть олицетворителями маршрутизатора. Класс «Unknown» представляет любое передающее устройство, которое не содержится в известном наборе. На следующем рисунке показан сценарий, в котором имеются три известных маршрутизатора. Наблюдатель собирает сигналы маяка без высокой пропускной способности (не HT) от этих маршрутизаторов и использует (устаревшее) длинное обучающее поле (L-LTF) для идентификации отпечатка RF. Передаваемые сигналы L-LTF одинаковы для всех маршрутизаторов, что позволяет алгоритму избежать зависимости данных. Поскольку маршрутизаторы и наблюдатель фиксированы, идентификационные данные RF (комбинация профиля канала многолучевого распространения и нарушений RF) RF1, RF2 и RF3 не изменяются во времени. Неизвестные данные маршрутизатора - это набор случайных радиочастотных отпечатков, которые отличаются от известных маршрутизаторов.

На следующем рисунке показан пользователь, подключенный к маршрутизатору и мобильной горячей точке. После обучения наблюдатель принимает кадры маяка и декодирует MAC-адрес. Кроме того, наблюдатель извлекает сигнал L-LTF и использует этот сигнал для классификации радиочастотного отпечатка источника кадра маяка. Если MAC-адрес и идентификационный код RF совпадают, как в случае маршрутизатора 1, маршрутизатора 2 и Router3, то наблюдатель объявляет источник «известным» маршрутизатором. Если MAC-адрес маяка отсутствует в базе данных и отпечаток RF не совпадает ни с одним из известных маршрутизаторов, как в случае мобильной горячей точки, то наблюдатель объявляет источник «неизвестным» маршрутизатором.

На следующем рисунке показан олицетворитель маршрутизатора в действии. Олицетворитель маршрутизатора (a.k.a. wild twin) может реплицировать MAC-адрес известного маршрутизатора и передавать кадры маяка. Затем хакер может заделать исходный маршрутизатор и заставить пользователя подключиться к злому двойнику. Наблюдатель также принимает кадры маяка от злого близнеца и декодирует MAC-адрес. Декодированный MAC-адрес соответствует MAC-адресу известного маршрутизатора, но отпечаток радиочастотного канала не совпадает. Наблюдатель объявляет источник как олицетворение маршрутизатора.

Создайте набор данных из 5000 кадров радиомаяка WLAN без HT для каждого маршрутизатора. Использовать MAC-адреса в качестве меток для известных маршрутизаторов; остальные помечены как «Неизвестные». NN обучен классифицировать известные маршрутизаторы, а также обнаруживать любые неизвестные маршрутизаторы. Разбейте набор данных на обучение, проверку и тест, где коэффициенты разделения составляют 80%, 10% и 10% соответственно. Рассмотрим SNR 20 дБ, работающий на полосе 5 ГГц. Количество моделируемых устройств установлено равным 4, но его можно изменить, выбрав другое значение для numKnownRouters. Установите количество неизвестных маршрутизаторов больше, чем известных, чтобы представить в наборе данных изменчивость в неизвестных RF-отпечатках маршрутизатора.
numKnownRouters = 4; numUnknownRouters = 10; numTotalRouters = numKnownRouters+numUnknownRouters; SNR = 20; % dB channelNumber = 153; % WLAN channel number channelBand = 5; % GHz frameLength = 160; % L-LTF sequence length in samples
По умолчанию в этом примере загружаются данные обучения и обученная сеть из https://www.mathworks.com/supportfiles/spc/RFFingerprinting/RFFingerprintingSimulatedData.tar.gz. Если подключение к Интернету отсутствует, можно загрузить файл вручную на компьютер, подключенный к Интернету, и сохранить его в том же каталоге, что и файлы текущего примера.
Чтобы быстро запустить этот пример, загрузите предварительно обученную сеть и создайте небольшое количество кадров, например 10. Чтобы обучить сеть на компьютере, выберите опцию «Обучить сеть сейчас» (т. е. установить trainNow true). Формирование 5000 кадров данных занимает около 50 минут на процессоре Intel (R) Xeon (R) W-2133 CPU @ 3,6 ГГц с памятью 64 МБ. Обучение этой сети занимает около 5 минут с помощью графического процессора Nvidia (R) Titan Xp. Обучение на CPU может привести к очень длительной продолжительности обучения.
trainNow =false; if trainNow numTotalFramesPerRouter = 5000; %#ok<UNRCH> else numTotalFramesPerRouter = 10; rfFingerprintingDownloadData('simulated') end
Starting download of data files from: https://www.mathworks.com/supportfiles/spc/RFFingerprinting/RFFingerprintingSimulatedData.tar.gz Download and extracting files done
numTrainingFramesPerRouter = numTotalFramesPerRouter*0.8; numValidationFramesPerRouter = numTotalFramesPerRouter*0.1; numTestFramesPerRouter = numTotalFramesPerRouter*0.1;
Маршрутизаторы Wi-Fi, реализующие протоколы 802.11a/g/n/ac, передают кадры маяка в диапазоне 5 ГГц для широковещательной передачи их присутствия и возможностей с использованием формата OFDM не-HT. Кадр маяка состоит из двух основных частей: преамбулы (SYNC) и полезной нагрузки (DATA). Преамбула состоит из двух частей: короткой подготовки и длительной подготовки. В этом примере полезная нагрузка содержит одни и те же биты, за исключением MAC-адреса для каждого маршрутизатора. CNN использует часть преамбулы L-LTF в качестве учебных единиц. Повторное использование сигнала L-LTF для радиочастотной дактилоскопии обеспечивает решение для дактилоскопии без заголовка. Использовать wlanMACFrameConfig(панель инструментов WLAN), wlanMACFrame(панель инструментов WLAN), wlanNonHTConfig(панель инструментов WLAN), и wlanWaveformGenerator(Панель инструментов WLAN) используется для генерации кадров радиомаяка WLAN.
% Create Beacon frame-body configuration object frameBodyConfig = wlanMACManagementConfig; % Create Beacon frame configuration object beaconFrameConfig = wlanMACFrameConfig('FrameType', 'Beacon', ... "ManagementConfig", frameBodyConfig); % Generate Beacon frame bits [~, mpduLength] = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits'); % Create a wlanNONHTConfig object, 20 MHz bandwidth and MCS 1 are used nonHTConfig = wlanNonHTConfig(... 'ChannelBandwidth', "CBW20",... "MCS", 1,... "PSDULength", mpduLength);
Объект rfFingerprintingNonHTFrontEnd выполняет внешнюю обработку, включая извлечение сигнала L-LTF. Объект сконфигурирован с полосой пропускания канала 20 МГц для обработки сигналов, не являющихся HT.
rxFrontEnd = rfFingerprintingNonHTFrontEnd('ChannelBandwidth', 'CBW20'); fc = helperWLANChannelFrequency(channelNumber, channelBand); fs = wlanSampleRate(nonHTConfig);
Пропускать каждый кадр через канал с
Релеевское многолучевое замирание
Радиопомехи, такие как фазовый шум, сдвиг частоты и сдвиг постоянного тока
AWGN
Канал пропускает сигналы через канал с многолучевым замиранием Рэлея, используя comm.RayleighChannel (Коммуникационная панель инструментов) Системный объект. Предположим, что профиль задержки равен [0 1,8 3,4] отсчетов с соответствующими средними коэффициентами усиления пути [0 -2 -10] дБ. Так как канал является статическим, установите максимальный доплеровский сдвиг на ноль, чтобы убедиться, что канал не изменяется для того же радио. Реализация многолучевого канала с этими настройками. Добавление шума с помощью awgn (Communications Toolbox) функция,
multipathChannel = comm.RayleighChannel(... 'SampleRate', fs, ... 'PathDelays', [0 1.8 3.4]/fs, ... 'AveragePathGains', [0 -2 -10], ... 'MaximumDopplerShift', 0);
RF-обесценения и их соответствующий диапазон значений:
Фазовый шум [0,01, 0,3] среднеквадратичных значений (градусов)
Смещение частоты [-4, 4] ppm
Смещение постоянного тока: [-50, -32] dBc
Для получения дополнительной информации о моделировании ослабления ВЧ см. функцию helperRFImpairments. Эта функция использует comm.PhaseFrequencyOffset (Коммуникационный инструментарий) и comm.PhaseNoise (Коммуникационный инструментарий) Системные объекты.
phaseNoiseRange = [0.01, 0.3]; freqOffsetRange = [-4, 4]; dcOffsetRange = [-50, -32]; rng(123456) % Fix random generator % Assign random impairments to each simulated radio within the previously % defined ranges radioImpairments = repmat(... struct('PhaseNoise', 0, 'DCOffset', 0, 'FrequencyOffset', 0), ... numTotalRouters, 1); for routerIdx = 1:numTotalRouters radioImpairments(routerIdx).PhaseNoise = ... rand*(phaseNoiseRange(2)-phaseNoiseRange(1)) + phaseNoiseRange(1); radioImpairments(routerIdx).DCOffset = ... rand*(dcOffsetRange(2)-dcOffsetRange(1)) + dcOffsetRange(1); radioImpairments(routerIdx).FrequencyOffset = ... fc/1e6*(rand*(freqOffsetRange(2)-freqOffsetRange(1)) + freqOffsetRange(1)); end
Примените нарушения RF и канала, определенные ранее. Сбросьте объект канала для каждого радиоблока, чтобы создать независимый канал. Используйте функцию rfFingerprintingNonHTFrontEnd для обработки полученных кадров. Наконец, извлеките L-LTF из каждого передаваемого кадра WLAN. Разделение принятых сигналов L-LTF на обучающие, валидационные и тестовые наборы.
% Create variables that will store the training, validation and testing % datasets xTrainingFrames = zeros(frameLength, numTrainingFramesPerRouter*numTotalRouters); xValFrames = zeros(frameLength, numValidationFramesPerRouter*numTotalRouters); xTestFrames = zeros(frameLength, numTestFramesPerRouter*numTotalRouters); % Index vectors for train, validation and test data units trainingIndices = 1:numTrainingFramesPerRouter; validationIndices = 1:numValidationFramesPerRouter; testIndices = 1:numTestFramesPerRouter; tic generatedMACAddresses = strings(numTotalRouters, 1); rxLLTF = zeros(frameLength, numTotalFramesPerRouter); % Received L-LTF sequences for routerIdx = 1:numTotalRouters % Generate a 12-digit random hexadecimal number as a MAC address for % known routers. Set the MAC address of all unknown routers to % 'AAAAAAAAAAAA'. if (routerIdx<=numKnownRouters) generatedMACAddresses(routerIdx) = string(dec2hex(bi2de(randi([0 1], 12, 4)))'); else generatedMACAddresses(routerIdx) = 'AAAAAAAAAAAA'; end fprintf('%s - Generating frames for router %d with MAC address %s\n', ... datestr(toc/86400,'HH:MM:SS'), routerIdx, generatedMACAddresses(routerIdx)) % Set MAC address into the wlanFrameConfig object beaconFrameConfig.Address2 = generatedMACAddresses(routerIdx); % Generate beacon frame bits beacon = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits'); txWaveform = wlanWaveformGenerator(beacon, nonHTConfig); txWaveform = helperNormalizeFramePower(txWaveform); % Add zeros to account for channel delays txWaveform = [txWaveform; zeros(160,1)]; %#ok<AGROW> % Reset multipathChannel object to generate a new static channel reset(multipathChannel) frameCount= 0; while frameCount<numTotalFramesPerRouter rxMultipath = multipathChannel(txWaveform); rxImpairment = helperRFImpairments(rxMultipath, radioImpairments(routerIdx), fs); rxSig = awgn(rxImpairment,SNR,0); % Detect the WLAN packet and return the received L-LTF signal using % rfFingerprintingNonHTFrontEnd object [valid, ~, ~, ~, ~, LLTF] = rxFrontEnd(rxSig); % Save successfully received L-LTF signals if valid frameCount=frameCount+1; rxLLTF(:,frameCount) = LLTF; end if mod(frameCount,500) == 0 fprintf('%s - Generated %d/%d frames\n', ... datestr(toc/86400,'HH:MM:SS'), frameCount, numTotalFramesPerRouter) end end rxLLTF = rxLLTF(:, randperm(numTotalFramesPerRouter)); % Split data into training, validation and test xTrainingFrames(:, trainingIndices+(routerIdx-1)*numTrainingFramesPerRouter) ... = rxLLTF(:, trainingIndices); xValFrames(:, validationIndices+(routerIdx-1)*numValidationFramesPerRouter)... = rxLLTF(:, validationIndices+ numTrainingFramesPerRouter); xTestFrames(:, testIndices+(routerIdx-1)*numTestFramesPerRouter)... = rxLLTF(:, testIndices + numTrainingFramesPerRouter+numValidationFramesPerRouter); end
00:00:00 - Generating frames for router 1 with MAC address 4DA3EE3C8968 00:00:04 - Generating frames for router 2 with MAC address B1077CFE3777 00:00:04 - Generating frames for router 3 with MAC address DB28133A97BF 00:00:04 - Generating frames for router 4 with MAC address B8AF375DAC0F 00:00:05 - Generating frames for router 5 with MAC address AAAAAAAAAAAA 00:00:05 - Generating frames for router 6 with MAC address AAAAAAAAAAAA 00:00:05 - Generating frames for router 7 with MAC address AAAAAAAAAAAA 00:00:05 - Generating frames for router 8 with MAC address AAAAAAAAAAAA 00:00:06 - Generating frames for router 9 with MAC address AAAAAAAAAAAA 00:00:06 - Generating frames for router 10 with MAC address AAAAAAAAAAAA 00:00:06 - Generating frames for router 11 with MAC address AAAAAAAAAAAA 00:00:06 - Generating frames for router 12 with MAC address AAAAAAAAAAAA 00:00:06 - Generating frames for router 13 with MAC address AAAAAAAAAAAA 00:00:07 - Generating frames for router 14 with MAC address AAAAAAAAAAAA
% Label received frames. Label the first numKnownRouters with their MAC % address. Label the rest with "Unknown”. labels = generatedMACAddresses; labels(generatedMACAddresses == generatedMACAddresses(numTotalRouters)) = "Unknown"; yTrain = repelem(labels, numTrainingFramesPerRouter); yVal = repelem(labels, numValidationFramesPerRouter); yTest = repelem(labels, numTestFramesPerRouter);
Модель глубокого обучения работает только на реальных числах. Таким образом, I и Q делятся на два отдельных столбца. Затем данные переупорядочиваются в матрицу 2 x frameLength x 1 x numFrames, как того требует инструментарий Deep Learning Toolbox. Кроме того, обучающий набор перетасовывается, а переменные метки сохраняются как категориальные переменные.
% Rearrange datasets into a one-column vector xTrainingFrames = xTrainingFrames(:); xValFrames = xValFrames(:); xTestFrames = xTestFrames(:); % Separate between I and Q xTrainingFrames = [real(xTrainingFrames), imag(xTrainingFrames)]; xValFrames = [real(xValFrames), imag(xValFrames)]; xTestFrames = [real(xTestFrames), imag(xTestFrames)]; % Reshape training data into a 2 x frameLength x 1 x % numTrainingFramesPerRouter*numTotalRouters matrix xTrainingFrames = permute(... reshape(xTrainingFrames,[frameLength,numTrainingFramesPerRouter*numTotalRouters, 2, 1]),... [1 3 4 2]); % Shuffle data vr = randperm(numTotalRouters*numTrainingFramesPerRouter); xTrainingFrames = xTrainingFrames(:,:,:,vr); % Create label vector and shuffle yTrain = categorical(yTrain(vr)); % Reshape validation data into a 2 x frameLength x 1 x % numValidationFramesPerRouter*numTotalRouters matrix xValFrames = permute(... reshape(xValFrames,[frameLength,numValidationFramesPerRouter*numTotalRouters, 2, 1]),... [1 3 4 2]); % Create label vector yVal = categorical(yVal); % Reshape test dataset into a numTestFramesPerRouter*numTotalRouter matrix xTestFrames = permute(... reshape(xTestFrames,[frameLength,numTestFramesPerRouter*numTotalRouters, 2, 1]),... [1 3 4 2]); %#ok<NASGU> % Create label vector yTest = categorical(yTest); %#ok<NASGU>
В этом примере используется архитектура нейронной сети (NN), которая состоит из двух сверточных и трех полностью соединенных слоев. Интуиция этой конструкции заключается в том, что первый слой будет изучать особенности независимо в I и Q. Обратите внимание, что размеры фильтра составляют 1x7. Затем следующий слой будет использовать размер фильтра 2x7, который будет извлекать элементы, объединяющие I и Q вместе. Наконец, последние три полностью соединенных слоя будут вести себя как классификатор, используя извлеченные элементы в предыдущих слоях [1].
poolSize = [2 1]; strideSize = [2 1]; layers = [ imageInputLayer([frameLength 2 1], 'Normalization', 'none', 'Name', 'Input Layer') convolution2dLayer([7 1], 50, 'Padding', [1 0], 'Name', 'CNN1') batchNormalizationLayer('Name', 'BN1') leakyReluLayer('Name', 'LeakyReLu1') maxPooling2dLayer(poolSize, 'Stride', strideSize, 'Name', 'MaxPool1') convolution2dLayer([7 2], 50, 'Padding', [1 0], 'Name', 'CNN2') batchNormalizationLayer('Name', 'BN2') leakyReluLayer('Name', 'LeakyReLu2') maxPooling2dLayer(poolSize, 'Stride', strideSize, 'Name', 'MaxPool2') fullyConnectedLayer(256, 'Name', 'FC1') leakyReluLayer('Name', 'LeakyReLu3') dropoutLayer(0.5, 'Name', 'DropOut1') fullyConnectedLayer(80, 'Name', 'FC2') leakyReluLayer('Name', 'LeakyReLu4') dropoutLayer(0.5, 'Name', 'DropOut2') fullyConnectedLayer(numKnownRouters+1, 'Name', 'FC3') softmaxLayer('Name', 'SoftMax') classificationLayer('Name', 'Output') ]
layers =
18×1 Layer array with layers:
1 'Input Layer' Image Input 160×2×1 images
2 'CNN1' Convolution 50 7×1 convolutions with stride [1 1] and padding [1 1 0 0]
3 'BN1' Batch Normalization Batch normalization
4 'LeakyReLu1' Leaky ReLU Leaky ReLU with scale 0.01
5 'MaxPool1' Max Pooling 2×1 max pooling with stride [2 1] and padding [0 0 0 0]
6 'CNN2' Convolution 50 7×2 convolutions with stride [1 1] and padding [1 1 0 0]
7 'BN2' Batch Normalization Batch normalization
8 'LeakyReLu2' Leaky ReLU Leaky ReLU with scale 0.01
9 'MaxPool2' Max Pooling 2×1 max pooling with stride [2 1] and padding [0 0 0 0]
10 'FC1' Fully Connected 256 fully connected layer
11 'LeakyReLu3' Leaky ReLU Leaky ReLU with scale 0.01
12 'DropOut1' Dropout 50% dropout
13 'FC2' Fully Connected 80 fully connected layer
14 'LeakyReLu4' Leaky ReLU Leaky ReLU with scale 0.01
15 'DropOut2' Dropout 50% dropout
16 'FC3' Fully Connected 5 fully connected layer
17 'SoftMax' Softmax softmax
18 'Output' Classification Output crossentropyex
Настройте параметры обучения для использования оптимизатора ADAM с размером мини-пакета 256. По умолчанию 'ExecutionEnvironment'имеет значение' auto ', которое использует графический процессор для обучения, если он доступен. В противном случае trainNetwork использует ЦП для обучения. Чтобы явно задать среду выполнения, установите 'ExecutionEnvironment«к одному из»cpu', 'gpu', 'multi-gpu', или'parallel'. Выбор 'cpu'может привести к очень большой продолжительности обучения.
if trainNow miniBatchSize = 256; %#ok<UNRCH> % Training options options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'ValidationData',{xValFrames, yVal}, ... 'ValidationFrequency',floor(numTrainingFramesPerRouter*numTotalRouters/miniBatchSize/3), ... 'Verbose',false, ... 'L2Regularization', 0.0001, ... 'InitialLearnRate', 0.0001, ... 'MiniBatchSize', miniBatchSize, ... 'ValidationPatience', 3, ... 'Plots','training-progress', ... 'Shuffle','every-epoch'); % Train the network simNet = trainNetwork(xTrainingFrames, yTrain, layers, options); else % Load trained network (simNet), testing dataset (xTestFrames and % yTest) and the used MACAddresses (generatedMACAddresses) load('rfFingerprintingSimulatedDataTrainedNN.mat',... 'generatedMACAddresses',... 'simNet',... 'xTestFrames',... 'yTest') end
Как показывает график тренировочного прогресса, сеть сходится примерно в 2 эпохи почти со 100% точностью.

Классифицируйте тестовые кадры и рассчитайте окончательную точность за пределами нейронной сети.
% Obtain predicted classes for xTestFrames yTestPred = classify(simNet,xTestFrames); % Calculate test accuracy testAccuracy = mean(yTest == yTestPred); disp("Test accuracy: " + testAccuracy*100 + "%")
Test accuracy: 100%
Постройте график матрицы путаницы для тестовых кадров. Как упоминалось выше, совершенная точность классификации достигается с помощью синтетического набора данных.
figure cm = confusionchart(yTest, yTestPred); cm.Title = 'Confusion Matrix for Test Data'; cm.RowSummary = 'row-normalized';

Формирование кадров маяка с известными MAC-адресами и одним неизвестным MAC-адресом. Создание нового набора РЧ-нарушений и канала многолучевого распространения. Поскольку все нарушения являются новыми, отпечаток RF для этих кадров должен быть классифицирован как «Неизвестный». Кадры с известными MAC-адресами представляют собой олицетворители маршрутизатора, в то время как кадры с неизвестными MAC-адресами являются просто неизвестными маршрутизаторами.
framesPerRouter = 4; knownMACAddresses = generatedMACAddresses(1:numKnownRouters); % Assign random impairments to each simulated radio within the previously % defined ranges for routerIdx = 1:numTotalRouters radioImpairments(routerIdx).PhaseNoise = rand*( phaseNoiseRange(2)-phaseNoiseRange(1) ) + phaseNoiseRange(1); radioImpairments(routerIdx).DCOffset = rand*( dcOffsetRange(2)-dcOffsetRange(1) ) + dcOffsetRange(1); radioImpairments(routerIdx).FrequencyOffset = fc/1e6*(rand*( freqOffsetRange(2)-freqOffsetRange(1) ) + freqOffsetRange(1)); end % Reset multipathChannel object to generate a new static channel reset(multipathChannel) % Run for all known routers and one unknown for macIndex = 1:(numKnownRouters+1) beaconFrameConfig.Address2 = generatedMACAddresses(macIndex); % Generate Beacon frame bits beacon = wlanMACFrame(beaconFrameConfig, 'OutputFormat', 'bits'); txWaveform = wlanWaveformGenerator(beacon, nonHTConfig); txWaveform = helperNormalizeFramePower(txWaveform); % Add zeros to account for channel delays txWaveform = [txWaveform; zeros(160,1)]; %#ok<AGROW> % Create an unseen multipath channel. In other words, create an unseen % RF fingerprint. reset(multipathChannel) frameCount= 0; while frameCount<framesPerRouter rxMultipath = multipathChannel(txWaveform); rxImpairment = helperRFImpairments(rxMultipath, radioImpairments(routerIdx), fs); rxSig = awgn(rxImpairment,SNR,0); % Detect the WLAN packet and return the received L-LTF signal using % rfFingerprintingNonHTFrontEnd object [payloadFull, cfgNonHT, rxNonHTData, chanEst, noiseVar, LLTF] = ... rxFrontEnd(rxSig); if payloadFull frameCount = frameCount+1; recBits = wlanNonHTDataRecover(rxNonHTData, chanEst, ... noiseVar, cfgNonHT, 'EqualizationMethod', 'ZF'); % Decode and evaluate recovered bits mpduCfg = wlanMPDUDecode(recBits, cfgNonHT); % Separate I and Q and reshape for neural network LLTF= [real(LLTF), imag(LLTF)]; LLTF = permute(reshape(LLTF,frameLength ,[] , 2, 1), [1 3 4 2]); ypred = classify(simNet, LLTF); if sum(contains(knownMACAddresses, mpduCfg.Address2)) ~= 0 if categorical(convertCharsToStrings(mpduCfg.Address2))~=ypred disp(strcat("MAC Address ", mpduCfg.Address2," is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED")) else disp(strcat("MAC Address ", mpduCfg.Address2," is known, fingerprint match")) end else disp(strcat("MAC Address ", mpduCfg.Address2," is not recognized, unknown device")) end end % Reset multipathChannel object to generate a new static channel reset(multipathChannel) end end
MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address 09C551658660 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address CDECF20C29CA is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address DF56A9E15405 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED MAC Address EDC4537D86B1 is known, fingerprint mismatch, ROUTER IMPERSONATOR DETECTED
MAC Address AAAAAAAAAAAA is not recognized, unknown device MAC Address AAAAAAAAAAAA is not recognized, unknown device MAC Address AAAAAAAAAAAA is not recognized, unknown device MAC Address AAAAAAAAAAAA is not recognized, unknown device
Можно протестировать систему с различными нарушениями канала и радиочастотного сигнала путем изменения
Профиль многолучевого распространения (PathDelays и AveragePathGains свойства объекта канала Рэлея),
Уровень шума канала (SNR вход awgn функция),
RF-обесценения (phaseNoiseRange, freqOffsetRange, и dcOffsetRange переменные).
Можно также изменить структуру нейронной сети, изменив
Параметры сверточного слоя (размер фильтра, количество фильтров, заполнение),
Количество полностью соединенных слоев,
Количество сверточных слоев.
function [impairedSig] = helperRFImpairments(sig, radioImpairments, fs) % helperRFImpairments Apply RF impairments % IMPAIREDSIG = helperRFImpairments(SIG, RADIOIMPAIRMENTS, FS) returns signal % SIG after applying the impairments defined by RADIOIMPAIRMENTS % structure at the sample rate FS. % Apply frequency offset fOff = comm.PhaseFrequencyOffset('FrequencyOffset', radioImpairments.FrequencyOffset, 'SampleRate', fs); % Apply phase noise phaseNoise = helperGetPhaseNoise(radioImpairments); phNoise = comm.PhaseNoise('Level', phaseNoise, 'FrequencyOffset', abs(radioImpairments.FrequencyOffset)); impFOff = fOff(sig); impPhNoise = phNoise(impFOff); % Apply DC offset impairedSig = impPhNoise + 10^(radioImpairments.DCOffset/10); end function [phaseNoise] = helperGetPhaseNoise(radioImpairments) % helperGetPhaseNoise Get phase noise value load('Mrms.mat','Mrms','MyI','xI'); [~, iRms] = min(abs(radioImpairments.PhaseNoise - Mrms)); [~, iFreqOffset] = min(abs(xI - abs(radioImpairments.FrequencyOffset))); phaseNoise = -abs(MyI(iRms, iFreqOffset)); end
[1] К. Санхе, М. Белгиовине, Ф. Чжоу, С. Риязе, С. Иоаннидис и К. Чоудхури, «ORACLE: Оптимизированная радиоклассификация через сверточные сетевые сети», IEEE INFOCOM 2019 - IEEE конференция