mininet 画网络拓扑图

根据 mininet 平台下 net 命令输出的数据得出网络拓扑
1. 把 net 命令输出的数据写入文件(文件名自定义)的方法
1) 在 mininet/mininet/ 文件夹下写 globalv.py 文件(定义一个全局变量)
”’globalv.py 内容”’
file2 = open(‘1. 中定义的文件名 ‘,’w’)
file2 = file.close()
2) 修改 mininet/mininet/ 下的 cli.py 文件
(1) 导入 globalv.py 文件
这里写图片描述
(2) 在 cli.py 文件下的 do_net 函数下添加语句:
globalv.file2 = open(‘1. 中自定义文件名 ‘,’w’)
globalv.file2 .close()
这里写图片描述
2) 修改 mininet/mininet/ 下的 util.py 文件
(1) 导入 globalv.py
这里写图片描述
(2) 修改 dumpNodeConnections(nodes) 函数添加 file2 高亮部分的语句
mininet 画网络拓扑图_第1张图片
3) 重新安装 mininet 内核
在 mininet/util 下执行
bash install.sh -n
3) 此时在 mininet 中输入 net 命令输出的信息已经全部写入 1. 中的自定义文件中,接着处理该文件找出节
点和节点之间情况,并调用 networkx 包画图
1) 安装 networkx 包和 matplotlib 包
网址: http://blog.sina.com.cn/s/blog_607799590102uygu.html
2) 写处理文件和画图程序 (printgraph.py)

#!/usr/bin/env python
## -*- coding:utf-8 -*-
import networkx as nx
import matplotlib.pyplot as plt 
Net_Nodes = [] #网络节点列表
temp = []      #每行数据
filename = '/home/linyimin/net_data/net.txt' #存储链路信息的文件
G = nx.Graph()  #创建空的无向图

#从文件中获取所有节点
file1=open(filename,'r') #以读取方式打开文件
Node_count = len(file1.readlines())#获得网络节点数
file1.close()
def Get_Nodes(filename):
    file1 = open(filename,'r') #以读取方式打开文件
    for i in range(0,Node_count):
    temp.append(file1.readline() )
    if(temp[i][2]==' ' or temp[i][2]=='\n'):
       Net_Nodes.append(temp[i][0:2])#提取每个节点名称
        else:
       Net_Nodes.append(temp[i][0:3])#提取每个节点名称
    file1.close()
    return Net_Nodes

#节点添加到无向图
def Net_Node_Add_to_Graph(Net_Nodes):
    for i in range(0,Node_count):
    G.add_node(Net_Nodes[i])

#从文件中获取链路信息并添加到无向图中
def Get_Links():
    for i in range(0,Node_count):
    for j in range(0,Node_count):
        if ( temp[i].count(Net_Nodes[j]) != 0 ):
           G.add_edge(Net_Nodes[i],Net_Nodes[j])
        if(Net_Nodes[i]=='c0' and (Net_Nodes[j][0]=='s'or (Net_Nodes[j][0]=='S'))):
           G.add_edge(Net_Nodes[i],Net_Nodes[j])


if (__name__ == '__main__'):
   Get_Nodes(filename)
   Net_Node_Add_to_Graph(Net_Nodes)
   Get_Links()
   pos = nx.spring_layout(G)
   for i in range(0,Node_count):
      if (Net_Nodes[i][0]=='H' or Net_Nodes[i][0]=='h' or Net_Nodes[i][0]=='W' or Net_Nodes[i][0]=='w'):
         nx.draw_networkx_nodes(G,pos,nodelist=[Net_Nodes[i]],node_size=600,node_color='r',node_shape='s')
      if (Net_Nodes[i][0]=='S' or Net_Nodes[i][0]=='s' ):
     nx.draw_networkx_nodes(G,pos,node_size=800,nodelist=[Net_Nodes[i]],node_color='b')
      if (Net_Nodes[i][0]=='c' or Net_Nodes[i][0]=='C'):
     nx.draw_networkx_nodes(G,pos,node_size=1000,nodelist=[Net_Nodes[i]],node_color='g')
   nx.draw_networkx_edges(G,pos)
   nx.draw_networkx_labels(G,pos)
   plt.savefig("/var/www/html/net.png")        
   plt.show()

3) 运行 printgraph.py 即可画出网络拓扑图
mininet 画网络拓扑图_第2张图片
该方法的不足:在mininet中建立网络拓扑之后,需要执行net命令把网络的链接情况存到net.txt文件,当网络拓扑该改变之后,需要再次执行net命令才能打印新的拓扑.

你可能感兴趣的:(mininet)