标签:c style class blog code java
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(); } }
标签:c style class blog code java
原文地址:http://www.cnblogs.com/visoncheng/p/3763722.html