NS2画图

本文详细介绍了使用NS2网络模拟器进行数据包处理的过程,包括吞吐量、延迟和丢包率的计算方法。通过AWK脚本解析NS2生成的trace文件,获取关键网络性能指标,并利用gnuplot进行数据可视化。

步骤:
1、ns XXX.tcl
2、gawk -f xxx.awk XXX.tr > xxx.txt(注意:这里的xxx分别为:ys\ttl\dbl)
3、gnuplot xxx.plot(xxx和步骤2一样)

AWK文件:

  1. 吞吐量:
BEGIN{
	init=0;
	i=0;
}
{
	event = $1;
	time = $2;
	pkt_type = $7;
	pkt_size = $8;
	rount_type = $4;
	if(event=="r" && pkt_type=="tcp" && rount_type=="RTR")
	{
		pkt_byte_sum[i+1]=pkt_byte_sum[i]+ pkt_size;
		if(init==0)
		{
			start_time = time;
			init = 1;
		}
		end_time[i] = time;
		i = i+1;
	}
}
END {
	for(j=1;j<i;j++)
	{
		tm = end_time[j]-start_time;
		if (tm != 0){
			th = (pkt_byte_sum[j]/tm)*8/1000;
			tm2=end_time[j];
			printf("%.9f\t%.2f\n", tm2, th);
		}		
	}
}
  1. 延时
BEGIN {
	highest_uid=0;
	spro_time=0;
	rpro_time=0;
}

#下面大括号里面的内容会针对要进行处理的记录(也就是我们的trace文件)的每一行都重复执行一次
{

	event = $1; #$1表示一行的第一栏,是事件的动作。每一栏默认是以空格分隔的。下同。

	time = $2; #事件发生的时间

	trace_type = $4; #trace文件跟踪事件的层次(指在路由层或mac层等等)

	flag = $5; #分隔符

	uid = $6; #包的uid号码(普通包头的uid)

	pkt_type = $7; #包的类型(是信令或是数据)

	pkt_size = $8; #包的大小(byte)
	if (pkt_type=="tcp"&&uid>=highest_uid) {
		highest_uid=uid;
	}
	if ( event=="s" && pkt_type=="tcp" && trace_type=="RTR" && time > spro_time){
		start_time[uid] = time; 
		spro_time=time;
	}
	if ( event=="r" && pkt_type=="tcp" && trace_type=="RTR" && time > rpro_time ){
		end_time[uid] = time;
		rpro_time=time;
	}
}


END {
	tmp = 0;
	printf("%f %f\n", 0, 0);
	for ( packet_id = 0; packet_id <= highest_uid; packet_id++ ){
		start = start_time[packet_id];
		end = end_time[packet_id];
		packet_duration = end - start;
		#只把接收时间大于传送时间的记录打印出来
		if ( packet_duration>0&& start > tmp) {
			printf("%f %f\n", start, packet_duration);
			tmp=start;
		}
	}
}

  1. 丢包率
BEGIN {
	#程序初始化,设定变量记录传输以及被丢弃的包的数目
	fsDrops = 0; #被丢弃的包的数目
	numfs0 = 0; #0节点发送的CBR封包的数目
	numfs2 = 0; #2节点接收的CBR封包的数目
	i=0;

}
{
	event = $1;
	time = $2;
	trace_type = $4;
	uid = $6;
	pkt_type = $7;
	pkt_size = $8;
	#统计发送的CBR封包
	if (event== "s" && trace_type== "RTR" && pkt_type== "tcp"){
		numfs0++;
		send_pak[i]=numfs0;
	}
	#统计丢弃的CBR封包
	if (event== "r" && trace_type== "RTR" && pkt_type== "tcp"){
		numfs2++;
		end_time[i]=time;
		recv_pak[i]=numfs2;
		i=i+1;	
	}
	
}

END {

	tmp=0;
	printf("%f %f\n", 0, 0); #打印发送封包数目和丢包率
	for (j = 0; j < i; j++){
		if(send_pak[j] != 0){
			average=0; #average用于记录丢包率
			fsDrops = recv_pak[j]-send_pak[j]; #丢包数目
			average=fsDrops/send_pak[j]; #丢包率
			tm=sprintf("%.2f",end_time[j]);
			if(average>0 && tm > tmp){
				printf("%f %f\n", tm, average); #打印发送封包数目和丢包率
				tmp=tm;
			}
		}		
	}
}

plot文件

  1. 吞吐量
set terminal gif 
set output "throughput.gif" 
set title "ttl_fuzzy<thoughput>" 
set xlabel "(time)"
set ylabel "(throughput)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
plot "ttl.txt" using 1:2 with lines
replot

  1. 延时
set terminal gif 
set output "delay.gif" 
set title "ys_fuzzy<delay>" 
set xlabel "(stime)"
set ylabel "(delay)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
#plot "ys.txt" using 1:2 with impulses
plot "ys.txt" using 1:2 with lines
replot

  1. 丢包率
set terminal gif 
set output "loss.gif" 
set title "dbl_fuzzy<loss>" 
set xlabel "(time)"
set ylabel "(loss)"
set xtics nomirror
unset x2tics
set ytics nomirror
unset y2tics
unset key
plot "dbl.txt" using 1:2 with lines
replot

### 使用GPGGA数据在Linux环境中绘制图形 为了实现在Linux环境下使用GPGGA数据进行绘图,可以采用Python编程语言及其丰富的库来处理和可视化地理坐标数据。具体来说,`matplotlib` 和 `geopandas` 是两个非常有用的工具。 #### 数据解析与准备 GPGGA (Global Positioning System Fixed Data) 句子包含了定位信息,如纬度、经度以及海拔高度等重要参数。通常情况下,这类NMEA协议的数据可以通过串口读取自GPS模块,例如SIM7600CE模块中的GPS功能[^2]。对于接收到的每一行GPGGA字符串,应当按照标准格式提取所需的地理位置字段: ```python import re def parse_gpgga(gpgga_str): pattern = r"\$GPGGA,(\d{2})(\d{2})(\d{2}\.\d*),([NS]),(\d+\.\d*),([EW]),.*" match = re.match(pattern, gpgga_str) if not match: return None hour, minute, second, lat_dir, latitude, lon_dir, longitude = match.groups() # Convert to decimal degrees lat_degrees = int(latitude[:2]) + float(latitude[2:]) / 60.0 lon_degrees = int(longitude[:3]) + float(longitude[3:]) / 60.0 if lat_dir == 'S': lat_degrees *= -1 if lon_dir == 'W': lon_degrees *= -1 timestamp = f"{hour}:{minute}:{second}" return { "timestamp": timestamp, "latitude": lat_degrees, "longitude": lon_degrees } ``` 此函数能够将每条GPGGA记录转化为易于操作的时间戳、经纬度字典对象。 #### 绘制轨迹图表 一旦获得了多个位置点的信息之后,则可利用Matplotlib创建简单的二维散点图展示路径变化情况;如果想要更精确的地图背景支持的话,Geopandas加上Folium这样的组合会更加理想化一些。 以下是仅用Matplotlib简单作图的例子: ```python import matplotlib.pyplot as plt # 假设我们已经有一个列表存储了所有的gpgga_data latitudes = [data['latitude'] for data in gpgga_data] longitudes = [data['longitude'] for data in gpgga_data] plt.figure(figsize=(8, 6)) plt.plot(longitudes, latitudes, marker='o', linestyle='-') plt.title('Trajectory from GPGGA Data') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.grid(True) plt.show() ``` 上述代码片段展示了如何基于一系列由GPGGA消息解析出来的经纬度值构建一条连续曲线表示移动物体随时间推移所经过的位置序列。 当涉及到实际应用时,建议考虑更多因素比如速度过滤异常点、优化显示效果等等。同时也可以探索其他高级特性,像OpenStreetMap集成或是三维地形渲染等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值