zh02054 2014-01-16 06:41 采纳率: 0%
浏览 4488

snmp4j向通信目标Target发送管理命令,相应的response为null是怎么回事?

本人刚接触snmp,用snmp4j获取并监控路由器外网口ip地址,路由器上已用厂商的手册命令配置了trap,本人拟在管理站用路由器发送来的trap,监控其外网口ip地址。问题是在管理站向被管理的路由器发送管理命令后,相应的response为null,不知是怎么回事,求熟悉snmp4j的大虾指导?该部代码如下:

public void processPdu(CommandResponderEvent respEvnt) {
    //获取trap端地址:Address
    Address trapAddress = respEvnt.getPeerAddress();

    if (respEvnt != null || respEvnt.getPDU() !=null) {
        PDU responsePdu = respEvnt.getPDU();
        System.out.println("responsePdu="+responsePdu);
    }       
    /**
     * 利用被管理设备地址,创建通信目标
     */
    CommunityTarget gateWayTarget = new CommunityTarget();
    Address address = GenericAddress.parse(trapAddress.toString());
    gateWayTarget.setAddress(address);
    gateWayTarget.setCommunity(new OctetString("public"));  
    gateWayTarget.setRetries(2); 
    gateWayTarget.setTimeout(5*60); 
    gateWayTarget.setVersion(SnmpConstants.version2c);
    /**
     * 生成协议数据单元
     */
    PDU requestPDU = new PDU();
    requestPDU.add(new VariableBinding(new OID("1.3.6.1.2.1.4.21.1.7")));//ipRouteNextHop
    requestPDU.setType(PDU.GETNEXT);//设置getnext命令
    String gatewayIpString = null;
    String getwayIp = null;
    try {
        //向被管理设备(通信目标)发送命令
         **ResponseEvent response = snmp.send(requestPDU, gateWayTarget);** 
         **PDU responsePDU = response.getResponse();** 
        if(responsePDU != null){
            VariableBinding getIp=responsePDU.get(0);
            gatewayIpString=getIp.toString();
        }
        getwayIp = gatewayIpString.substring(31);
        System.out.println("getwayIp=" + getwayIp);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

通信的完整代码如下:

public class GataWayIp2 implements CommandResponder{
private MultiThreadedMessageDispatcher dispatcher;
private Snmp snmp = null;
private Address listenAddress;
private ThreadPool threadPool;

public GataWayIp2() {
    // BasicConfigurator.configure();
}

/**
 * 根据管理机的地址建立UDP连接,即建立SNMP Seesion
 * @throws UnknownHostException
 * @throws IOException
 */
private void init() throws UnknownHostException, IOException {
    threadPool = ThreadPool.create("Trap", 2);
    dispatcher = new MultiThreadedMessageDispatcher(threadPool,
            new MessageDispatcherImpl());
    listenAddress = GenericAddress.parse(System.getProperty(
            "snmp4j.listenAddress", "udp:192.168.2.222/162")); // 本地IP与监听端口
    TransportMapping transport;
    // 对TCP与UDP协议进行处理
    if (listenAddress instanceof UdpAddress) {
        transport = new DefaultUdpTransportMapping(
                (UdpAddress) listenAddress);
    } else {
        transport = new DefaultTcpTransportMapping(
                (TcpAddress) listenAddress);
    }

    snmp = new Snmp(dispatcher, transport);
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3
            .createLocalEngineID()), 0);
    SecurityModels.getInstance().addSecurityModel(usm);

    snmp.listen();
}


public void run() {
    try {
        init();
        snmp.addCommandResponder(this);
        System.out.println("开始监听Trap信息!");
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
/**
 * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
 * 当接收到trap时,会自动进入这个方法
 * 
 * @param respEvnt
 */ 
public void processPdu(CommandResponderEvent respEvnt) {
    System.out.println("run here...");
    //获取trap端地址:Address
    Address trapAddress = respEvnt.getPeerAddress();
    if (respEvnt != null || respEvnt.getPDU() !=null) {
        PDU responsePdu = respEvnt.getPDU();
        System.out.println("responsePdu="+responsePdu);
    }       
    /**
     * 利用被管理设备地址,创建通信目标
     */
    CommunityTarget gateWayTarget = new CommunityTarget();
    Address address = GenericAddress.parse(trapAddress.toString());
    gateWayTarget.setAddress(address);
    gateWayTarget.setCommunity(new OctetString("public"));  
    gateWayTarget.setRetries(2); 
    gateWayTarget.setTimeout(5*60); 
    gateWayTarget.setVersion(SnmpConstants.version2c);
    /**
     * 生成协议数据单元
     */
    PDU requestPDU = new PDU();
    requestPDU.add(new VariableBinding(new OID("1.3.6.1.2.1.4.21.1.7")));//ipRouteNextHop
    requestPDU.setType(PDU.GETNEXT);//设置getnext命令
    String gatewayIpString = null;
    String getwayIp = null;
    try {
        //向被管理设备(通信目标)发送命令
        ResponseEvent response = snmp.send(requestPDU, gateWayTarget);
        PDU responsePDU = response.getResponse();
        if(responsePDU != null){
            VariableBinding getIp=responsePDU.get(0);
            gatewayIpString=getIp.toString();
        }
        getwayIp = gatewayIpString.substring(31);
        System.out.println("getwayIp=" + getwayIp);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

  • 写回答

4条回答

  • oyljerry 2015-01-02 11:53
    关注

    对应路由设备是否支持你的请求,get请求的oid是否正确

    评论

报告相同问题?

悬赏问题

  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘