snmp4j读取数据

win7下开启snmpv2:

打开控制面板-->程序-->程序和功能-->打开或者关闭windows功能,选择简单网络管理协议(snmp),点击确定,打开服务,找到snmp
service,右键属性,找到安全选项,在接受的社区名称中,添加以后程序要访问的团体名,在接受来自一下主机的snmp数据包中添加本机IP或者localhost(取决于程序使用localhost还是本机IP访问,如果使用本机IP访问,但是这里填localhost,则是无法访问的)。

以下都是同步实现的:

snmp getBulk方式获取数据:


public static void syncGetBulk() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); //构造一个UDP
snmp.listen(); //开始监听snmp消息

CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));//snmpv2的团体名
target.setVersion(SnmpConstants.version2c); //snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); //时延
target.setRetries(1); //重传

PDU pdu = new PDU(); //a SNMP protocol data unit
//使用GETBULK方式获取数据,无论什么方式取oid,都是取叶子节点,叶子节点的父节点都不会取到
pdu.setType(PDU.GETBULK);

//snmp getBulk独有
pdu.setMaxRepetitions(3000); //每个OID通过GETBULK方式获取多少个数据
/*偏移量,假设有两个oid,0代表两个oid都取3000个叶子oid,1代表第一个取它最近的第一个oid,第二个取3000个oid,
* 大于1的数代表两个oid都是取他们最近的第一个oid
*/
pdu.setNonRepeaters(1);

//添加oid,可以多个
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1")));
ResponseEvent responseEvent = snmp.send(pdu, target);
PDU response = responseEvent.getResponse();

if (response == null) {
System.out.println("TimeOut...");
} else {
if (response.getErrorStatus() == PDU.noError) {
//读取数据
Vector<? extends VariableBinding> vbs = response
.getVariableBindings();
List<SnmpResult> result = new ArrayList<SnmpResult>(vbs.size());
for (VariableBinding vb : vbs) {
result.add(new SnmpResult(vb.getOid().toString(),vb.getVariable().toString()));
}
System.out.println(JSONArray.fromObject(result).toString());
} else {
System.out
.println("Error:" + response.getErrorStatusText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

snmp walk:PDU中并未提供walk,snmp4j提供了TableUtils,实际实现也是通过snmp
getBulk或者getNext,将某个oid下的所有叶子节点,只是TableUtils处理了多次获取结果,省的自己写程序去处理。


public static void walk() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息

CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));// snmpv2的团体名
target.setVersion(SnmpConstants.version2c); // snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); // 时延
target.setRetries(1); // 重传

TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(
PDU.GETBULK));// GETNEXT or GETBULK
utils.setMaxNumRowsPerPDU(5); // only for GETBULK, set max-repetitions, default is 10
OID[] columnOids = new OID[] {new OID("1.3.6.1.2.1")};
// If not null, all returned rows have an index in a range (lowerBoundIndex, upperBoundIndex]
//lowerBoundIndex,upperBoundIndex都为null时返回所有的叶子节点。 必须具体到某个OID,,否则返回的结果不会在(lowerBoundIndex, upperBoundIndex)之间
List<TableEvent> l = utils.getTable(target, columnOids,new OID("1.3.6.1.2.1.25.5.1.1.1.3324")
,null); //
for (TableEvent e : l) {
System.out.println(e.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}

异步实现getNext:对于异步而言,不能在异步执行完前关闭虚拟机,否则出不了数据。


public static void asyncGetNext() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息

CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));// snmpv2的团体名
target.setVersion(SnmpConstants.version2c); // snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); // 时延
target.setRetries(1); // 重传

PDU pdu = new PDU(); // a SNMP protocol data unit
pdu.setType(PDU.GETNEXT);

// 添加oid,可以多个
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1")));

// 设置监听对象
ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
try {
PDU response = event.getResponse();

if (response == null) {
System.out.println("TimeOut...");
} else {
if (response.getErrorStatus() == PDU.noError) {
// 读取数据
Vector<? extends VariableBinding> vbs = response
.getVariableBindings();
List<SnmpResult> result = new ArrayList<SnmpResult>(
vbs.size());
for (VariableBinding vb : vbs) {
result.add(new SnmpResult(vb.getOid().toString(), vb
.getVariable().toString()));
}
System.out.println(JSONArray.fromObject(result).toString());
} else {
System.out
.println("Error:" + response.getErrorStatusText());
}
}
}catch(Exception e) {
e.printStackTrace();
}
}
};
snmp.send(pdu, target,null, listener); //设置异步处理
} catch (Exception e) {
e.printStackTrace();
}
}

snmp4j读取数据

时间: 2024-10-07 20:58:24

snmp4j读取数据的相关文章

一段mongodb服务器读取数据超时的故事

北京时间 2016年9月25日  22:58:30 PM 近期线上生产环境mongodb的总是发现读取数据超时的问题,今天下午坐下来细细的研究了一番,大致过程如下: 业务背景 线上有一对mongodb主从的服务器,只是简单做了mongodb的主从,master - slave. 开始以为做了主从就能确保数据不丢的问题了,确实,数据没有发生丢失的问题,但是近期发现好多用户在点击某些操作要读取mongo里面的数据内容的时候,要等待很长的时间,这样的等待是叫人无法忍受的. 最开始的时候,以为做了主从,

文件操作ofstream,open,close,ifstream,fin,按照行来读取数据, fstream,iosin iosout,fio.seekg(),文件写入和文件读写,文件拷贝和文件

 1.ofstream,open,close 写入文件 #include<iostream> #include<fstream> using namespace std; //通过ofstream的方式实现写入文件 open,close void main() { ofstream fout;  //ofstream输出文件 fout.open("E:\\1.txt");//打开文件 fout << "1234abcdef";

tensorflowxun训练自己的数据集之从tfrecords读取数据

当训练数据量较小时,采用直接读取文件的方式,当训练数据量非常大时,直接读取文件的方式太耗内存,这时应采用高效的读取方法,读取tfrecords文件,这其实是一种二进制文件.tensorflow为其内置了各种存储和读取的函数,方便调用. 不知道为啥,从tfrecords中读取数据用于训练时,收敛得更快,更平稳.上面两个图是使用tfrecords的准确率和loss值变化,下面是直接读取文件的准确率和loss值变化. 1 生成记录样本的记录文件 1 root_dir = os.getcwd() 2 3

已知s.txt文件中有一个这样的字符串 请编写程序读取数据内容,把数据排序后写入 ss.txt文件

package cn.idcast5; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; /* * 需求:已知s.txt文件中有一个这样

FileInputStream利用缓冲数组读取数据

package cd.itcast.fileinputstream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class Demo1 { public static void main(String[] args) throws IOException { //目标文件 File fil

用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)

前几天接到一个任务,从gerrit上通过ssh命令获取一些commit相关的数据到文本文档中,随后将这些数据存入Excel中.数据格式如下图所示 观察上图可知,存在文本文档中的数据符合一定的格式,通过python读取.正则表达式处理并写入Excel文档将大大减少人工处理的工作量. 1. 从gerrit获取原始信息,存入文本文档: $ssh –p 29418 <your-account>@192.168.1.16 gerrit query status:merged since:<date

JAVA BufferedReader 类从标准输入读取数据

1,建立输入流: BufferedReader localReader = new BufferedReader( new InputStreamReader(System.in)); System.in 表示标准输入,一般指键盘. 建立输入流,从标准输入读取数据到缓冲区中. 当在标准输入中输入一行字符串时,按回车之后,这行数据就会被读取到缓冲区中. 比如: abc  \r\n(表示按下回车键) 那么msg就会赋值为 abc String msg = null; while ((msg = lo

基本数据持久性(二) 使用sqlite保存和读取数据

关于基本数据的持久性,写过一篇文章来简述过(基本数据持久性(一) 使用plist保存和读取数据).这篇文章将简述采用数据库sqlite的方式来保存数据,并根据查询结果读取数据. 一.工作原理 sqlite采用表存储的方式,表的第一行(也就是我们常说的表头)在sqilte中被称为“字段”.对于标的每一行(除了字段)的信息,都有一个独一无二的列内容可以将表的每一行内容独立区分开(例如本文所示的案例,存储一个学生的信息——学号.姓名.年龄.班级.那么,学号这一列就可以将表的每一行内容独立区分开,因为每

基本数据持久性(一) 使用plist保存和读取数据

想保存成绩.记录得分.保存账号密码等等?数据持久性可以做到这一点!这篇文章通过简单的程序,来分享一下如何使用plist来保存和读取数据,以供大家参考学习. 一.程序的主要功能 1. xib文件如图1所示. 图 1 2. 通过“保存”按钮将4个textField(ID.Name.Age.Class后面的输入框)的内容保存到plist文件中. 3.通过“读取”按钮将plist中的内容分别读取到4个textField中. 二.实现步骤 1.先创建一个Single ViewController的视图,命