射频指纹是一种利用无线电信号的特征来识别设备或用户的技术。射频指纹可以用来做设备身份认证、位置跟踪、安全防护等应用。射频指纹的优点是难以伪造、不依赖于额外的硬件或软件、适用于多种无线通信协议。
射频指纹识别的一般流程包括以下几个步骤:
低功耗蓝牙(BLE)是一种广泛应用于物联网和智能设备中的无线通信技术。由于BLE具有低功耗、低成本、低复杂度等特点,它也成为了射频指纹识别的一个重要研究对象。为了获取BLE数据,我使用了以下方法:
%% 本文从嗅探保存的原始数据帧中截取出数据帧,主要是这个工作,其他的没做呢
clc
clear
%% 参数和变量设置
phyMode = 'LE1M';
bleParam = helperBLEReceiverConfig(phyMode);
sampleRate = 4e+06;
%软件自动AGC的
agc = comm.AGC('MaxPowerGain',20,'DesiredOutputPower',2);
%频偏补偿
freqCompensator = comm.CoarseFrequencyCompensator('Modulation','OQPSK', ...
'SampleRate',4*1000000,...
'SamplesPerSymbol',2*bleParam.SamplesPerSymbol,...
'FrequencyResolution',100);
%前导码设置
prbDet = comm.PreambleDetector(bleParam.RefSeq,'Detections','First');
data_ = [];
index = 1; %数据帧数
pktCnt = 1;
crcCnt = 1;
%表示匹配的MAC地址 是否匹配,保存的MAC地址第几份数据
MAC = "64FD0B54A578"; MAC_match = true; MAC_index=2;
file_name = MAC+MAC_index; file_save = false;
load_index = 2;
load_file_name = MAC+load_index;
% 加载数据
load(load_file_name);
data_sum_index = length(data);
%% 数据处理
% Loop to decode the captured Bluetooth LE samplesz
for i=1:length(data)
dataCaptures =data{i};
dataCaptures_ = dataCaptures;
disp("————————————————————一帧——————————————");
while length(dataCaptures) > bleParam.MinimumPacketLen
%每次迭代时考虑捕获信号中的两帧
startIndex = 1;
endIndex = min(length(dataCaptures),2*bleParam.FrameLength);
rcvSig = dataCaptures(startIndex:endIndex);
rcvSig_=rcvSig;
rcvAGC = agc(rcvSig); % AGC
rcvDCFree = rcvAGC - mean(rcvAGC); %直流偏置消除
[rcvFreqComp,fff] = freqCompensator(rcvDCFree); %载波频偏消除
rcvFilt = conv(rcvFreqComp,bleParam.h,'same'); % 滤波
% 执行同步
[~, dtMt] = prbDet(rcvFilt);
release(prbDet);
prbDet.Threshold = max(dtMt);
prbIdx = prbDet(rcvFilt); %前导码结束位置,非前导码开始位置哈,看源码看到的
%解析数据帧
[cfgLLAdv,pktCnt,crcCnt,remStartIdx,PDULenInBytes] = helperBLEPhyBitRecover(rcvFilt,...
prbIdx,pktCnt,crcCnt,bleParam);
%解析后续数据帧
dataCaptures = dataCaptures(1+remStartIdx:end);
% 这个嗅探所有MAC地址的
if ~MAC_match && ~isempty(cfgLLAdv)
%可以加额外的处理
%可以加额外的处理
index=index+1;
end
%这个是针对特定MAC地址进行嗅探的
if MAC_match && ~isempty(cfgLLAdv)&&cfgLLAdv.AdvertiserAddress==MAC
start = 1+prbIdx-160;
endIndex = prbIdx + (PDULenInBytes+3+2)*8*4;
data_{index} = rcvSig_(start:endIndex);
index=index+1;
release(freqCompensator);
release(prbDet);
break;
end
release(freqCompensator);
release(prbDet);
end
if MAC_match && index>data_sum_index
disp("结束");
if file_save
save(file_name,"data_");
disp("成功保存usrp接收数据帧,未截取")
end
break;
end
end
clear
为了验证BLE射频指纹的可行性,我使用了最原始的深度学习识别方式,即将前导码信号作为稳态信号,直接输入到CNN中进行分类。我使用了以下方法:
# 导入必要的库
import tensorflow as tf
from tensorflow.keras import layers, models
# 定义输入的形状
input_shape = (32, 2)
# 定义CNN模型
model = models.Sequential()
model.add(layers.Conv1D(32, 3, activation='relu', input_shape=input_shape))
model.add(layers.MaxPooling1D(2))
model.add(layers.Conv1D(64, 3, activation='relu'))
model.add(layers.MaxPooling1D(2))
model.add(layers.Conv1D(128, 3, activation='relu'))
model.add(layers.GlobalAveragePooling1D())
model.add(layers.Dense(15, activation='softmax'))
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型的摘要
model.summary()
通过这段时间的学习和实践,我对低功耗蓝牙射频指纹有了一定的了解和掌握。我发现低功耗蓝牙射频指纹是一种有前景和挑战的技术,它可以用来做设备身份认证、位置跟踪、安全防护等应用。但是低功耗蓝牙射频指纹也存在一些问题和困难,如数据获取的复杂性、射频指纹提取的有效性、深度学习识别的可靠性等。这些问题需要进一步的研究和探索。具体的东西太多了,需要交流联系咱。