В этом примере показано, как спроектировать сверточную нейронную сеть (CNN) снятия отпечатков пальцев радиочастоты (RF) с симулированными данными. Вы обучаете CNN с симулированными кадрами "неисправность" беспроводной локальной сети (WLAN) от известных и неизвестных маршрутизаторов для снятия отпечатков пальцев РФ. Вы затем сравниваете адрес управления доступом медиа-контента (MAC) полученных сигналов и цифрового отпечатка РФ, обнаруженного CNN, чтобы обнаружить имитаторов маршрутизатора WLAN.
Для получения дополнительной информации о том, как протестировать спроектированную нейронную сеть с сигналами, полученными от действительных маршрутизаторов Wi-Fi, смотрите Тест Глубокая нейронная сеть с Собранными Данными, чтобы Обнаружить пример Олицетворения Маршрутизатора WLAN.
Олицетворение маршрутизатора является формой нападения на сеть WLAN, где злонамеренный агент пытается явиться олицетворением законного маршрутизатора и обмануть пользователей сети, чтобы соединиться с ним. Идентификационные решения для безопасности на основе простых цифровых идентификаторов, таких как Мак адреса, IP-адреса, и SSID, не являются эффективными при обнаружении такого нападения. Эти идентификаторы могут легко имитироваться. Поэтому больше безопасного решения, которое не только зависит от простых цифровых идентификаторов, необходимо.
Беспроводная пара получателя передатчика создает уникальную подпись РФ в получателе, который является комбинацией нарушений РФ и канала. Снятие отпечатков пальцев РФ является процессом различения радио передачи в разделяемом спектре через эти подписи. В [1], авторы спроектировали сеть глубокого обучения (DL), которая использует необработанную основную полосу in-phase/quadrature (IQ) выборки и идентифицирует радио передачи. Сеть может идентифицировать радио передачи, если нарушения РФ являются доминирующими, или профиль канала остается постоянным в течение времени операции. Сети Most WLAN зафиксировали маршрутизаторы, которые создают статический профиль канала, когда местоположение получателя также фиксируется. В таком сценарии нейронная сеть для глубокого обучения может идентифицировать имитаторов маршрутизатора путем сравнения цифрового отпечатка РФ полученного сигнала и пары Мак адреса к тому из известных маршрутизаторов.
Этот пример симулирует систему WLAN с несколькими фиксированными маршрутизаторами и фиксированным наблюдателем, использующим WLAN Toolbox™, и обучает нейронную сеть (NN) с симулированными данными с помощью Deep Learning Toolbox™.
Примите внутренний пробел со многими маршрутизаторами, которым доверяют, с известными Мак адресами, которые мы назовем известными маршрутизаторами. Кроме того, примите, что неизвестные маршрутизаторы могут ввести область наблюдения, некоторые из которых могут быть имитаторами маршрутизатора. Класс "Неизвестный" представляет любое устройство передачи, которое не содержится в известном наборе. Следующий рисунок показывает сценарий, где существует три известных маршрутизатора. Наблюдатель собирает невысокую пропускную способность (non-HT) сигналы маяка от этих маршрутизаторов и использует (устаревшее) длинное учебное поле (L-LTF), чтобы идентифицировать цифровой отпечаток РФ. Переданные сигналы L-LTF являются тем же самым для всех маршрутизаторов, которое позволяет алгоритму избежать любой зависимости по данным. Поскольку маршрутизаторы и наблюдатель фиксируются, цифровые отпечатки РФ (комбинация многопутевого профиля канала и нарушений РФ) RF1, RF2, и RF3 не варьируются вовремя. Неизвестные данные о маршрутизаторе являются набором случайных цифровых отпечатков РФ, которые отличаются, чем известные маршрутизаторы.
Следующий рисунок показывает пользователя, соединенного с маршрутизатором и мобильной горячей точкой. После обучения наблюдатель получает кадры "неисправность" и декодирует Мак адрес. Кроме того, наблюдатель извлекает сигнал L-LTF и использует этот сигнал классифицировать цифровой отпечаток РФ источника кадра "неисправность". Если Мак адрес и соответствия цифрового отпечатка РФ, как в случае Маршрутизатора 1, Маршрутизатор 2, и Router3, то наблюдатель объявляет источник как "известный" маршрутизатор. Если Мак адрес маяка не находится в базе данных, и цифровой отпечаток РФ не совпадает ни с одним из известных маршрутизаторов, как в случае мобильной горячей точки, то наблюдатель объявляет источник как "неизвестный" маршрутизатор.
Следующий рисунок показывает имитатора маршрутизатора в действии. Имитатор маршрутизатора (a.k.a. злой близнец), может реплицировать Мак адрес известного маршрутизатора и передать кадры "неисправность". Затем хакер может создать затор исходный маршрутизатор и обеспечить пользователя, чтобы соединиться со злым близнецом. Наблюдатель получает кадры "неисправность" от злого близнеца также и декодирует Мак адрес. Декодируемый Мак адрес совпадает с Мак адресом известного маршрутизатора, но цифровой отпечаток РФ не соответствует. Наблюдатель объявляет источник как имитатор маршрутизатора.
Сгенерируйте набор данных 5 000 кадров "неисправность" Non-HT WLAN для каждого маршрутизатора. Используйте Мак адреса в качестве меток для известных маршрутизаторов; остающиеся быть помеченными как "Неизвестные". NN обучен классифицировать известные маршрутизаторы, а также обнаружить любые неизвестные единицы. Разделите набор данных в обучение, валидацию и тест, где разделяющие отношения составляют 80%, 10% и 10%, соответственно. Рассмотрите ОСШ 20 дБ, работающих над полосой на 5 ГГц. Номер симулированных устройств определяется к 4, но он может быть изменен путем выбора различного значения для numKnownRouters
. Определите номер неизвестных маршрутизаторов больше, чем известные единицы, чтобы представлять в наборе данных изменчивость в неизвестном маршрутизаторе цифровые отпечатки РФ.
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. Чтобы обучить сеть на вашем компьютере, выберите опцию "Train network now" (т.е. установите trainNow
к истине). Генерация 5 000 систем координат данных занимает приблизительно 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) и полезная нагрузка (ДАННЫЕ). Преамбула имеет две части: короткое учебное и долгое обучение. В этом примере полезная нагрузка содержит те же биты кроме Мак адреса для каждого радио. CNN использует часть L-LTF преамбулы как учебные модули. Многократное использование сигнала L-LTF для снятия отпечатков пальцев РФ предоставляет решение для снятия отпечатков пальцев без издержек. Используйте wlanMACFrameConfig
, wlanMACFrame
, wlanNonHTConfig
, и wlanWaveformGenerator
функции, чтобы сгенерировать кадры "неисправность" 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 МГц к процессу сигналы non-HT.
rxFrontEnd = rfFingerprintingNonHTFrontEnd('ChannelBandwidth', 'CBW20'); fc = helperWLANChannelFrequency(channelNumber, channelBand); fs = wlanSampleRate(nonHTConfig);
Передайте каждый кадр через канал с
Рэлеевское многопутевое исчезновение
Возмещены радио-нарушения, такие как шум фазы, смещение частоты и DC
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);
Нарушения РФ и их соответствующая область значений значений:
Шум фазы [0.01, 0.3] RMS (степени)
Смещение частоты [-4, 4] ppm
DC возместил: [-50,-32] дБн
Дополнительную информацию см. в функции 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
Примените РФ и нарушения канала, заданные ранее. Сбросьте объект канала для каждого радио, чтобы сгенерировать независимый канал. Используйте функцию 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:03 - Generating frames for router 2 with MAC address B1077CFE3777 00:00:03 - Generating frames for router 3 with MAC address DB28133A97BF 00:00:04 - Generating frames for router 4 with MAC address B8AF375DAC0F 00:00:04 - 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:06 - 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:07 - Generating frames for router 11 with MAC address AAAAAAAAAAAA 00:00:07 - Generating frames for router 12 with MAC address AAAAAAAAAAAA 00:00:08 - Generating frames for router 13 with MAC address AAAAAAAAAAAA 00:00:08 - 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);
Модель Deep Learning только работает над вещественными числами. Таким образом я и 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), которая состоит из двух сверточных и трех полносвязных слоев. Интуиция позади этого проекта - то, что первый слой изучит функции независимо во мне и 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 = 18x1 Layer array with layers: 1 'Input Layer' Image Input 160x2x1 images 2 'CNN1' Convolution 50 7x1 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 2x1 max pooling with stride [2 1] and padding [0 0 0 0] 6 'CNN2' Convolution 50 7x2 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 2x1 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';
Сгенерируйте кадры "неисправность" с известными Мак адресами и одним неизвестным Мак адресом. Сгенерируйте новый набор нарушений РФ и многопутевого канала. Поскольку нарушения являются все новыми, цифровой отпечаток РФ для этих систем координат должен быть классифицирован как "Неизвестный". Системы координат с известными Мак адресами представляют имитаторов маршрутизатора, в то время как системы координат с неизвестными Мак адресами являются просто неизвестными маршрутизаторами.
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
функция,
Нарушения РФ (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 по Computer Communications, Париж, Франция, 2019, стр 370-378.