首页 > 代码库 > snmp4j读取数据

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();
        }
    }