Этот пример показывает, как спроектировать радиочастотную (RF) дактилоскопическую сверточную нейронную сеть (CNN) с имитированными данными. Вы обучаете CNN с моделируемыми системами координат беспроводной локальной сети (WLAN) от известных и неизвестных маршрутизаторов для дактилоскопии RF. Затем сравните адрес управления доступом к среде (MAC) принятых сигналов и отпечаток RF, обнаруженный CNN, чтобы обнаружить олицетворения маршрутизатора WLAN.
Для получения дополнительной информации о том, как протестировать спроектированную нейронную сеть с сигналами, захваченными реальными Wi-Fi-маршрутизаторами, смотрите пример тестирования глубокой нейронной сети с захваченными данными для обнаружения олицетворения маршрутизатора WLAN.
Олицетворение маршрутизатора - это форма атаки на сеть WLAN, где вредоносный агент пытается выдать себя за законного маршрутизатора и обманом заставить пользователей сети подключиться к нему. Решения по идентификации безопасности, основанные на простых цифровых идентификаторах, таких как MAC-адреса, IP-адреса и SSID, не эффективны в обнаружении такой атаки. Эти идентификаторы можно легко подделать. Поэтому более безопасное решение использует другую информацию, такую как RF-сигнатура радиочастотной ссылки, в сложение к этим простым цифровым идентификаторам.
Пара беспроводной передатчик-приемник создает уникальную RF-сигнатуру в приемник, которая является комбинацией ослаблений канала и RF. RF Fingerprinting является процессом различения передающих радиостанций в общем спектре через эти сигнатуры. В [1] авторы разработали сеть глубокого обучения (DL), которая использует необработанные синфазно-квадратурные (IQ) выборки основной полосы частот и идентифицирует передающее радио. Сеть может идентифицировать передающие радиостанции, если искажения RF являются доминирующими или профиль канала остается постоянным во время работы. Большинство сетей WLAN имеют фиксированные маршрутизаторы, которые создают статический профиль канала, когда местоположение приемника также фиксировано. В таком сценарии нейронной сети для глубокого обучения может идентифицировать олицетворители маршрутизатора путем сравнения пары RF-отпечатков и MAC-адресов принимаемого сигнала с парой известных маршрутизаторов.
В этом примере моделируется система WLAN с несколькими фиксированными маршрутизаторами и фиксированным наблюдателем, использующим WLAN Toolbox™, и обучает нейронную сеть (NN) с моделируемыми данными с помощью Deep Learning Toolbox™.
Предположим, что внутри пространства с рядом доверенных маршрутизаторов с известными MAC-адресами, которые мы будем называть известными маршрутизаторами. Кроме того, предположим, что неизвестные маршрутизаторы могут войти в зону наблюдения, некоторые из которых могут быть олицетворителями маршрутизатора. Класс «Неизвестно» представляет любое передающее устройство, которое не содержится в известном наборе. Следующий рисунок показывает сценарий, в котором существует три известных маршрутизатора. Наблюдатель собирает не высокопроизводительные (не-HT) сигналы-маяк от этих маршрутизаторов и использует (устаревшее) длинное поле обучения (L-LTF), чтобы идентифицировать отпечаток RF. Переданные сигналы L-LTF одинаковы для всех маршрутизаторов, что позволяет алгоритму избегать зависимости данных. Поскольку маршрутизаторы и наблюдатель фиксированы, RF-отпечатки (комбинация многолучевого профиля канала и нарушений RF) RF1, RF2 и RF3 не изменяются во времени. Неизвестные данные маршрутизатора - это набор случайных RF-отпечатков, которые отличаются от известных маршрутизаторов.
Следующий рисунок показывает пользователя, подключенного к маршрутизатору и мобильной горячей точке. После обучения наблюдатель получает системы координат и декодирует MAC-адрес. Кроме того, наблюдатель извлекает сигнал L-LTF и использует этот сигнал для классификации отпечатка RF источника системы координат. Если MAC-адрес и отпечаток RF совпадают, как в случае с Маршрутизатором 1, Маршрутизатором 2 и Router3, то наблюдатель объявляет источник «известным» маршрутизатором. Если MAC-адрес маяка отсутствует в базе данных и RF-отпечаток не совпадает ни с одним из известных роутеров, как в случае с мобильной горячей точкой, то наблюдатель объявляет источник «неизвестным» роутером.
Следующий рисунок показывает в действии олицетворитель маршрутизатора. Олицетворитель маршрутизатора (a.k.a. evil twin) может реплицировать MAC-адрес известного маршрутизатора и передавать системы координат. Затем хакер может глушить оригинальный роутер и заставить пользователя подключиться к злому близнецу. Наблюдатель получает системы координат от злого близнеца тоже и декодирует MAC-адрес. Декодированный MAC-адрес совпадает с MAC-адресом известного маршрутизатора, но RF-отпечаток не совпадает. Наблюдатель объявляет источник олицетворителем маршрутизатора.
Сгенерируйте набор данных 5000 систем координат WLAN без HT для каждого маршрутизатора. Используйте MAC-адреса в качестве меток для известных маршрутизаторов; оставшиеся маркируются как «Неизвестные». NN обучен классифицировать известные маршрутизаторы, а также обнаруживать любые неизвестные таковые. Разделите набор данных на обучение, валидацию и тест, где коэффициенты разделения составляют 80%, 10% и 10% соответственно. Рассмотрим ОСШ 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 тактовой частотой @ 3,6 ГГц с 64 Мбайт памяти. Обучение этой сети занимает около 5 минут при помощи графического процессора Nvidia (R) Titan Xp. Обучение на центральном процессоре может привести к очень длительной длительности обучения.
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 non-HT. Кадр-маяк состоит из двух основных частей: преамбулы (SYNC) и полезной нагрузки (DATA). Преамбула имеет две части: короткое обучение и длительное обучение. В этом примере полезная нагрузка содержит те же биты, кроме MAC-адреса для каждого маршрутизатора. CNN использует часть преамбулы L-LTF в качестве обучающих модулей. Повторное использование сигнала L-LTF для дактилоскопии RF обеспечивает решение для дактилоскопии без накладных расходов. Использование wlanMACFrameConfig
(WLAN Toolbox), wlanMACFrame
(WLAN Toolbox), wlanNonHTConfig
(WLAN Toolbox), и wlanWaveformGenerator
(WLAN Toolbox) функции для генерации систем координат 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
функция,
multipathChannel = comm.RayleighChannel(... 'SampleRate', fs, ... 'PathDelays', [0 1.8 3.4]/fs, ... 'AveragePathGains', [0 -2 -10], ... 'MaximumDopplerShift', 0);
Искажения RF и их соответствующая область значений значений:
Фазовый шум [0,01, 0,3] rms ( степеней)
Смещение частоты [-4, 4] ppm
Смещение постоянного тока: [-50, -32] дБ
Смотрите функцию helperRFImpairms для получения дополнительной информации о симуляции нарушений RF. Эта функция использует 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
(Deep Learning Toolbox) использует центральный процессор для обучения. Чтобы явным образом задать окружение выполнения, установите '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 и многолучевого канала. Поскольку нарушения все новые, отпечаток 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
Можно протестировать систему с различными ослаблениями канала и RF путем изменения
Многолучевой профиль (PathDelays
и AveragePathGains
свойства объекта Релейского канала),
Уровень шума в канале (ОСШ вход 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] K. Sankhe, M. Belgiovine, F. Zhou, S. Riyaz, S. Ioannidis and K. Chowdhury, «ORACLE: Optimized Radio clAssification through Convolutional neural neuraL EurNetworks», iworks