1.在Java开发中使用SNMP网络技术协议根据不同的OID节点号获取单条数据或者固定的某一条数据。具体代码如下:
package com.zfj.udp;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TreeEvent;
import org.snmp4j.util.TreeUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
public class SNMPManager{
public static String responseFlag = null; /*======================================================================================================*/
/**
* @根据OID,获取单条数据
* @param address 数据来源的IP地址
* @param community 实体,一般为public
* @param port 端口号,161/162
* @param oidList 节点号
*/
public static void SnmpGetSinglePublicAttributes(String address,String community,int port,List<String> oidList) {
/*===========================================================================================*/
try {
// 创建传输映射
TransportMapping transport = new DefaultUdpTransportMapping();
transport.listen();
// 创建SNMP对象
Snmp snmp = new Snmp(transport);
// 创建目标地址
Address targetAddress = GenericAddress.parse("udp:" + address + "/" + port);
CommunityTarget communityTarget = new CommunityTarget();
communityTarget.setCommunity(new OctetString(community));
communityTarget.setAddress(targetAddress);
communityTarget.setVersion(SnmpConstants.version2c);
communityTarget.setRetries(2);//重试次数
communityTarget.setTimeout(5000);//延时5秒
/*===========================================================================================*/
// 创建GET请求PDU
PDU pdu = new PDU();
for(String oid:oidList)
{
pdu.add(new VariableBinding(new OID(oid)));
}
pdu.setType(PDU.GET);
/*===========================================================================================*/
// 发送GET请求
ResponseEvent responseEvent = snmp.send(pdu, communityTarget);
// 处理响应
if (responseEvent.getResponse() != null) {
PDU response = responseEvent.getResponse();
/*===========================================================================================*/
// 获取结果
String sysBoardTypeDescr = response.getVariableBindings().get(0).toValueString();
String sysBoardTypeName = response.getVariableBindings().get(1).toValueString();
String sysBoardIPAddress = response.getVariableBindings().get(2).toValueString();
String sysBoardIPMask = response.getVariableBindings().get(3).toValueString();
String sysBoardGateway = response.getVariableBindings().get(4).toValueString();
String sysBoardNo = response.getVariableBindings().get(5).toValueString();
String sysCpuVersion = response.getVariableBindings().get(6).toValueString();
String sysFpgaVersion = response.getVariableBindings().get(7).toValueString();
String sysHardwareVersion = response.getVariableBindings().get(8).toValueString();
/*===========================================================================================*/
//写入数据到XML文件中
XMLProcessor.saveSnmpDataToXML(sysBoardTypeDescr,sysBoardTypeName,sysBoardIPAddress,
sysBoardIPMask,sysBoardGateway,sysBoardNo,sysCpuVersion,sysFpgaVersion,sysHardwareVersion);
/*===========================================================================================*/
// 打印结果
} else {
System.out.println("Error: Response is null.");
}
// 关闭SNMP连接
snmp.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码中,实现了根据不同的IP地址、端口号和不同的节点号获取对应的节点号的单个数据。以上代码在其他类中的调用方式如下:
List<String> oidAttributeList = new ArrayList<>();
oidAttributeList.add(".1.3.6.1.4.1.39698.10.1.1.0");
SNMPManager.SnmpGetSinglePublicAttributes(deviceIP, "public", 161, oidAttributeList);