MATLAB 处理分析 NS2 Trace文件(新Trace格式)
NS2 Trace文件格式
关于格式的介绍可以参考链接: link.
格式基本是统一的,形式如下:
r -t 0.001383000 -Hs 93 -Hd -2 -Ni 93 -Nx 29.15 -Ny 510.05 -Nz 0.00 -Ne -1.000000 -Nl MAC -Nw — -Ma 0 -Md ffffffff -Ms 4 -Mt 800 -Is 4.255 -Id -1.255 -It AODV -Il 48 -If 0 -Ii 0 -Iv 30 -P aodv -Pt 0x2 -Ph 1 -Pb 1 -Pd 18 -Pds 0 -Ps 4 -Pss 4 -Pc REQUEST
————————————————
当然tcl生成的trace文件不都是这样统一的,会有一些关于节点位置的记录,如:
M 1.00000 0 (10.05, 498.30, 0.00), (10.05, 494.07), 4.24
————————————————
这样在处理时没法按统一格式来提取数据,所以需要跳过这些首字符为M的数据。
MATLAB 读取处理分析
读取首字符不是M的数据,用新文件保存,代码如下:
fidin=fopen('test.txt'); % 打开test.txt文件 仅测试用 可以换成data.txt 文件较大
fidout=fopen('mkmatlab.txt','w'); % 创建MKMATLAB.txt文件 用于写入不包含首字符为M的内容
tline = fgetl(fidin); % 读取一行数据
while ischar(tline) % 该行为字符
tline = fgetl(fidin); % 读取一行数据,这里不知道为什么,注释掉后不能运行,因为之前读取过一行,这里又读取一行,会少一行数据读取,没太大影响
if char(tline(1))~='M' % 首字符不为M
fprintf(fidout,'%s\n',tline); % 写入到新的txt文件
continue % 不是M跳过本次循环 即不写入关于M的部分
end
end
fclose(fidin); % 读取后关闭
MK=importdata('MKMATLAB.txt'); % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来
提取到格式统一的数据后,可以使用textread提取(textread的用法详情参考 link),非常方便,代码如下:
filename = '.\MKMATLAB.txt';
[event, t, Hs, Hd, Ni, Nx, Ny, Nz, Ne, NI, Nw, Ma, Md, Ms, Mt, ls, ld, lt, ll, lf, li, lv, P, Pt, Ph, Pb, Pd, Pds, Ps, Pss, Pc ]...
=textread(filename , '%s %*s %f %*s %f %*s %f %*s %f %*s %f %*s %f %*s %f %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s %*s %s');
读取到需要的数据之后,就可以非常方便的对Trace文件进行分析了,可以对丢包记录进行统计。
% Ni 节点id event d表示一次丢包记录 统计每个节点的丢包记录
% 从Ni中判断出节点id
id = unique(Ni);
id_drop_counts = zeros(length(id),1); %分配空间
for i = 1:length(id)
counts = 0 ; % 计数器记录节点丢包的记录
for j = 1:length(event)
if event{j}=='d'& id(i)==Ni(j)
counts = counts + 1;
end
end
id_drop_counts(i,:)=counts;%保存记录丢包记录数
end
% 画图
figure
set(gca,'XLim',[0 max(id)]);%X轴的数据显示范围
set(gca,'XTick',[0:1:max(id)]);%设置要显示坐标刻度
plot(id,id_drop_counts,'*');
xlabel('节点id');
ylabel('恶意记录数');
% 恶意节点id 及恶意记录数
% max_drop_counts 最大恶意记录数
max_drop_counts = max(id_drop_counts);
i = find(id_drop_counts==max_drop_counts);
malicious_id = id(i);
disp(['可能的恶意节点:',num2str(malicious_id),'恶意记录数:',num2str(max_drop_counts)]);
每个节点的丢包记录图:
接下来大家可以对自己感兴趣的数据进行统计分析。