【问题标题】:Monitoring windows variables using SNMP java manager使用 SNMP java 管理器监控 windows 变量
【发布时间】:2020-01-12 16:07:24
【问题描述】:

我需要监控网络中某些 IP 的信息。这些信息将是:设备的名称、它们的位置、每个端口的带宽和网络性能指标。我已经使用 Java 创建了 SNMP 管理器:

import java.io.IOException;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class SNMPManager {

    Snmp snmp = null;
    String Agent = "udp:localhost/161";
    String Oid="1.3.6.1.4.1.9600.1.22.8.5.1.5.";

    public static void main(String[] args) throws IOException {

        SNMPManager client = new SNMPManager();
        client.start();
        int counter=0;
        //while(true){
        try{
        String ODIValue = client.getAsString(new OID(client.Oid));//Decrypt the OID
        System.out.println("OID is "+ client.Oid);
        System.out.println("ODIValue is "+ODIValue);
        System.out.println("---------------------------------------------");
        }catch(Exception e){
            System.out.println("Error "+ counter++);
        }
        //}
    }

    private void start() throws IOException {
        TransportMapping transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
        transport.listen();
    }


    public String getAsString(OID oid) throws IOException {
        ResponseEvent event = get(new OID[] { oid });//Get IOD from agent
        return event.getResponse().get(0).getVariable().toString(); //Should respond with the OID
    }

    public ResponseEvent get(OID oids[]) throws IOException {
        PDU pdu = new PDU();
        for (OID oid : oids) {
            pdu.add(new VariableBinding(oid));
        }
        pdu.setType(PDU.GET);
        ResponseEvent event = snmp.send(pdu, getTarget(), null);
        if(event != null) {
            return event;
        }
        throw new RuntimeException("Time out occured");
    }

    private Target getTarget() {
        Address targetAddress = GenericAddress.parse(Agent);
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version2c);
        return target;
    }

}

我将端口 161 用于 SNMP,并将 localhost 用于我的计算机。我还在我的 Windows 10 上启用了 SNMP 功能。现在我期待获得操作系统版本,但没有出现任何内容。问题出在哪里?

而且我还需要知道在我的 Windows 上哪里可以找到 MIB 文件以了解系统变量的所有代码。

【问题讨论】:

  • Windows SNMP 服务只实现了在这些 MIB 文档中定义的自己的对象,docs.microsoft.com/en-us/windows/win32/snmp/… 所以当您尝试访问无效对象时,您将一无所获。
  • 该文件仅包含 mibs 数据,但不包含能够检索数据的 OID。
  • 您误解了 SNMP 概念。在管理器端加载 MIB 文档是没有用的。由 SNMP 代理的供应商决定实施哪些对象,并且只有 Microsoft MIB 文档中定义的对象才有效。微软不支持1.3.6.1.4.1.9600.1.22.8.5.1.5 下的任何内容。
  • 那么我应该搜索 MIB 还是 OID 以获取某些变量的值,例如系统版本号?
  • 那篇 Microsoft 文章提到了在哪里可以找到 Microsoft MIB 文档。您可以检查那里有哪些对象,以及是否有一个适合您的目标。

标签: java snmp


【解决方案1】:

我曾参与过一个具有类似要求的项目,我们曾经在该项目中监控远程 IP 的数据。你可以看看这里的源代码 github.com/ashish2199/Nework_Bandwidth_Monitor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多