经过好几个月的慵懒的生活之后终于又有机会写一些代码啦,这次的领域比较陌生,竟然是网络拓扑发现方向的,那么就在此总结一些大体思路,再粘贴一下核心代码喽,至于其余的封装就不贴了,只贴一下核心算法部分啦~~~
接收这个任务首先拿到的是一堆的数据文件,看着就烦人,要在其中提取我想要的地址转发表?搞笑死掉,神能找得到啊,于是我首先用perl脚本对数据文件进行了简要的处理并且输出到一个文件中,由于地址转发表的相关文件有两种格式(谁知道谁搞的这种东西啊,弄了还不弄成一种格式的)于是写了两套处理脚本如下:
isoFormat.pl
#!/usr/bin/perl -w
my $ip;
my @content;
my $sum = 0;
my %portHash;
my %portStateHash;
my %resultHash;
open RESULTCONTENT,">>result.txt";
while(<>){
$ip = $ARGV;
if($ip =~ /(.+)\.txt/){
$ip = $1;
}
chomp;
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.1\.(.+)\s=\sHex-STRING:\s(.*)/){
chomp;
$content[$sum] = "$_";
$sum++;
}
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.2\.(.+)\s=\sINTEGER:\s(\S*)/){
chomp $2;
$portHash{$1} = $2;
}
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.3\.(.+)\s=\sINTEGER:\s(\S*)/){
chomp $2;
$portStateHash{$1} = "$portHash{$1}"."-$2";
}
}
foreach (@content){
if(/^iso\.3\.6\.1\.2\.1\.17\.4\.3\.1\.1\.(.+)\s=\sHex-STRING:\s(.*)/){
$resultHash{$1} = "$portStateHash{$1}"."-$2";
}
}
foreach(keys %resultHash){
print RESULTCONTENT"$ip"."\-$resultHash{$_}\n";
}
specialFormat.pl
#!/usr/bin/perl -w
my $ip;
my @content;
my $sum = 0;
my %portHash;
my %portStateHash;
my %resultHash;
open RESULTCONTENT,">>result.txt";
while(<>){
$ip = $ARGV;
if($ip =~ /(.+)\.txt/){
$ip = $1;
}
chomp;
if(/^\w+:\sdot1dTpFdbAddress\.(.+)\s\(octet string\)\s(.+)\s?\[.+\]/){
chomp;
$content[$sum] = "$_";
$sum++;
}
if(/^\w+:\sdot1dTpFdbPort\.(.+)\s\(integer\)\s(\w+)/){
chomp $2;
$portHash{$1} = $2;
}
if(/^\w+:\sdot1dTpFdbStatus\.(.+)\s\(integer\)\s\w+\((\w+)\)/){
chomp $2;
$portStateHash{$1} = "$portHash{$1}"."-$2";
}
}
foreach (@content){
if(/^\w+:\sdot1dTpFdbAddress\.(.+)\s\(octet string\)\s(.+)\s?\[.+\]/){
$resultHash{$1} = "$portStateHash{$1}"."-$2";
$resultHash{$1} =~ s/\:/ /g;
}
}
foreach(keys %resultHash){
print RESULTCONTENT"$ip"."\-$resultHash{$_}\n";
}
处理完成后生成了统一格式的文件即:设备ip-端口号-端口状态-转发地址
之后又手动整理了设备mac与ip的对应文件格式为:设备ip - 设备mac地址
对生成好的规范格式的文件进行初始化生成完整的java对象集那么我们的任务便是处理这些对象识别之间的链接关系:核心算法代码如下:
package com.madonglin.finder.manager.imp;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.madonglin.finder.cache.SwitchCache;
import com.madonglin.finder.manager.NetDealer;
import com.madonglin.finder.vo.Link;
import com.madonglin.finder.vo.Port;
import com.madonglin.finder.vo.Switch;
public class DownPortNetDealer implements NetDealer {
@Override
public List<Link> workoutNetLinks(String markMac) {
SwitchCache cache = SwitchCache.getSwitchCache();
List<Switch> switches = cache.getSwitchs();
LinkedList<Switch> leafSwitches = new LinkedList<Switch>();
List<Switch> rootSwitches = new ArrayList<Switch>();
List<Link> links = new ArrayList<Link>();
//分析交换机的上下行接口
for(Switch tempSwitch : switches){
for(String key : tempSwitch.getKeys()){
Port tempPort = tempSwitch.getPort(key);
List<String> allMacs = tempPort.getAllMacs();
if(allMacs != null && allMacs.contains(markMac)){
tempSwitch.addUpPort(tempPort);
}else{
tempSwitch.addDownPort(tempPort);
//判断后代节点数
//FIXME 交换域确定影响结果
for(String mac : tempPort.getAllMacs()){
Switch compareSwitch = new Switch("");
compareSwitch.setMac(mac);
if(switches.contains(compareSwitch)){
tempSwitch.addChild();
//为子设备添加祖先信息
int index = switches.indexOf(compareSwitch);
Switch childSwitch = switches.get(index);
childSwitch.addParents(tempSwitch, tempPort);
}
}
}
}
}
//确定叶子节点
for(Switch temp : switches){
if(temp != null && 0 == temp.getChildNum()){
leafSwitches.addLast(temp);
}
if(0 == temp.getParentsKeys().size()){
rootSwitches.add(temp);
}
}
//判断链接关系
while(!leafSwitches.isEmpty()){
Switch tempSwitch = leafSwitches.removeFirst();
if(null != tempSwitch){
Switch fatherSwitch = null;
for(Switch key : tempSwitch.getParentsKeys()){
if(null == fatherSwitch){
fatherSwitch = key;
//FIXME 如果相同呢?
}else if(key.getChildNum() < fatherSwitch.getChildNum()){
fatherSwitch = key;
}
key.delChild();
if(0 == key.getChildNum()){
leafSwitches.addLast(key);
}
}
if(!rootSwitches.contains(tempSwitch)){
Link link = new Link();
link.setSwitchSrc(fatherSwitch.getIp());
link.setSwitchDes(tempSwitch.getIp());
link.setPortNumSrc(tempSwitch.getParentsPort(fatherSwitch).getNum());
link.setPortNumDes(tempSwitch.getUpPort().get(0).getNum());
links.add(link);
}
}
}
return links;
}
}
看个大概意思吧哈哈,经过我测试识别结果还算比较准确的
分享到:
相关推荐
基于网络编码的配电网络下行数据路由算法.pdf
TD-SCDMA 下行 导频时隙 搜索算法实现 pdf
提出双线巷道的自动生成解决方案:对巷道中心线进行求交点、打断操作,生成节点—路径网络拓扑图;...该算法充分利用节点—路径的拓扑关系,实现简单、速度较快,适用于任意复杂情况下不等宽双线巷道的自动生成。
认知无线网络中基于蚁群算法的下行链路资源分配,朱建尧,刘建毅,基于OFDMA的认知无线网络下行链路的资源分配问题中,约束条件通常包括认知用户对于主用户的干扰限制、认知基站发射功率限制以及子�
基于粒子群算法的下行CR-NOMA网络资源分配.pdf
LTE下行MIMO接收的算法研究与实现
认知无线网络(CRN)在underlay工作模式下的多用户下行功率分配和波束赋形问题研究中存在通用的SDR算法计算复杂度高、实用性受限以及优化问题中忽视主网络(PN)对认知用户(SU)的干扰等问题。针对这些问题,首先在...
为实现井下受灾区域的无线网络覆盖和应急通信,研究应急网络的拓扑重构和数据传输相关问题。首先,提出基于Wi-Fi Direct的应急网络重构方案,并将应急数据流分为上行、网内和下行数据流三类。针对上行数据流,提出基于...
MIMO_OFDMA系统下行链路调度与资源分配算法的研究
GSM的下行同步算法设计与FPGA实现.pdf
密集异构蜂窝网络中基于深度强化学习的下行链路功率分配算法.pdf
网络游戏-基于干扰对齐的蜂窝网络下行链路自适应预编码方法.zip
下行链路多用户MISO系统的发射天线选择与接收用户调度的快速算法实现,兰鹏,孙丰刚,能够为所有用户提供相同通信质量的下行预编码通信方式可以在多用户MISO系统中达到用户间的绝对公平且减少能耗的目的,然而由于用...
一种Femtocell网络中的分布式下行资源分配算法,韩宝,李旭,为了提高传统蜂窝网络的容量、改善室内覆盖质量,人们提出了Femtocell,也称为毫微微小区。它覆盖范围小、功耗低、能够有效提高室内
人工智能在移动通信网络中的应用:基于机器学习理论的信道估计与信号检测算法.pdf
针对线阵相机拍摄的动车图像上的噪声对图像比对识别结果产生的不良影响,提出了一种基于局部像素特征的图像去噪算法.该算法首先对待处理图像的像素点进行逐行扫描,并计算每一行的像素均值,同时记录与该行对应且与其...
采用 Java 开发语言,使用 Java 的 Swing 类库来进行图形界面设计与开发。 在 windows 操作系统环境下,采用 IDEA 作为开发工具。 通过实现 Runnable 接口来进行多线程编程。 采用扫描算法(SCAN 算法)来进行电梯...
众多资源分配的调度算法中, 有区别地实现不同业务QoS要求的调度策略研究不多。针对此问题, 通过将不同QoS等级和要求加入到调度策略的影响因素中, 提出了一种适用于LTE下行多业务传输的多目标跨层分组调度算法, 并...
1、C++电梯模拟程序 2、关于电梯算法的C++实现
一种LTE下行链路信号检测算法 LTE下行信道估计算法研究