Wireshark数据包波形绘制异常
一、数据包波形绘制方法
Wireshark数据包波形绘制具体方法见我的另一篇博客:
Wireshark捕获电脑与路由器通信数据,绘制波形观察-CSDN博客
Wireshak捕获的数据包:
二、异常现象
波形连一起了:
三、问题剖析
3.1 绝对时间格式
观察下数据包发送时刻和长度:
不应该是上面图那样连在一起。
问题出在哪呢......
观察数据包间隔:
% 读取 Excel 文件
data = readtable('D:\无线通信网络认知\通信学报\5G信号\Wireshark USRP联合波形捕获\only 192.168.1.103.xlsx');% 查看前几行
head(data)% 单独取出时间和长度
time = data.Time;
length = data.Length;
% 基本清洗
mask = ~isnan(time) & ~isnan(length);
time = time(mask);
length = length(mask);time = time*24*60*60;
对照MATLAB加载的EXCEL变量数值:
猛然发现,EXCEL中的Time这列不是时分秒绝对时间,实际上只有分和秒。所以,MATLAB打印表格中的0.70XXX这些数值实际上是分秒除以60分钟,得到的在1个小时中的比值。
我在EXCEL中通过调整单元格格式进行验证:
得到的数值:MATLAB加载自动转换后的数值:
破案了,就是把绝对时间的 “分:秒.秒小数” 当成了“时:分.秒”。
更正:
time = time*60*60;
3.2 小数保留位数
仔细看time变量,每个元素的小数是可以再往后保留几位的,同时也是递增的,说明保留的小数位数没问题:
但感觉MATLAB只用了前几位小数:
检查了一下,double变量打印时会自动调整小数位数,但是变量本身保留的小数位数是相当长的:
3.3 波形数值
yplot是01交替变换的,看起来也没有问题
四、波形绘制参数调整
4.1 尺度缩小
把matlab中time的处理程序更新下:
% 读取 Excel 文件
data = readtable('D:\无线通信网络认知\通信学报\5G信号\Wireshark USRP联合波形捕获\only 192.168.1.103.xlsx');% 查看前几行
% head(data)
data% 单独取出时间和长度
time = data.Time;
length = data.Length;
% 基本清洗
mask = ~isnan(time) & ~isnan(length);
time = time(mask);
length = length(mask);time = time*60*60;
重新绘制波形:
结合上述yplot变量观察并没问题,我大概知道原因了。就是0到2500这段是空的,2500附近那根“线”实际上有很多信号。
放大信号:
继续放大:
知道为什么从2500附近才开始有信号了。捕获数据包时在51分左右,对应一个小时的0.7的位置。
0.7*3600秒=2,520秒!
破案了。
4.2 减去初值
先减去time初值,再绘图:
time = time-time(1);
4.3 采样时长异常
还是有点不对,我采集信号时长有16秒:
看了下Wireshark的原文,也是16s:
迷了,这0.7s的采集信号时长怎么出来的......???! ! !
51分=0.85小时:
搞错了,之前MATLAB和EXCEL的0.7XXX根本不是分钟除以60得到的......
从EXCEL的单元格格式切入:
总之就是,“0.0000”不适合直接用于日期格式。
4.4 EXCEL绝对时间显示异常
重新设置Time列,通过替换把前面的“分:”去掉:
原来的“.”变成“:”了:
又发现原来的Time列是时分秒的,单元格里只显示分:秒:
继续把16:的时去掉:
离谱,这数值乱七八糟的,不行:
得用自己设置的日期显示单元格格式:h:mm:ss.000
4.5 仅保留秒数值
显示上可以只保留秒了:
但是想把秒数值单独提取出来还是困难:
通过TEXT这种方式就是真正把秒数值单独提取到一列:
再以文本形式粘贴到新的一列,就真正得到数据包秒时刻的数值了:
五、完善程序,绘制最终波形
这个时候,再重新加载数据:
% 读取 Excel 文件
data = readtable('D:\无线通信网络认知\通信学报\5G信号\Wireshark USRP联合波形捕获\only 192.168.1.103.xlsx');% 查看前几行
% head(data)
data% 单独取出时间和长度
time = data.Time;
length = data.Length;
% 基本清洗
mask = ~isnan(time) & ~isnan(length);
time = time(mask);
length = length(mask);time = time-time(1);
最终成功绘制出Wireshark捕获数据的波形图: