基于snmp协议用snmp4j对snmpv3版本进行get操作
了解过snmp协议都知道现在的协议版本有三个也就是v1,v2c,v3三个协议版本,前两个版本相对于第三个版本来说比较简单而且不是很安全,第三个版本是基于usm安全模型,接下来我就说说v3版本对于java开发的操作。
具体的开发流程文字叙述你们可以参考
转载:http://blog.csdn.net/fw0124/article/details/8559803 作者是fw0124
我直接说我测试过程中踩的坑
首先你用的jar包是snmp4j1.x或者是2.x的话 上述文章的哪个代码应该是没啥问题的,由于我在官网上下载的是snmp4j3.x版本的jar包所以中间更新了一点新的东西,在安全协议哪个位置。这里我贴个snmp4j的官网http://www.snmp4j.org/
在SNMP4J 3.x中,默认情况下不再将安全协议AuthSHA(和AuthMD5)添加到静态SecurityProtocols实例,因为现在被认为是不安全的,也就是说不能直接用AuthMD5.ID和PrivDES.ID(因为我用的是加密和认证模式)所以我们直接在使用之前把它们定义一下就行了。
SecurityProtocols securityProtocols=SecurityProtocols.getInstance();
securityProtocols.addAuthenticationProtocol(new AuthMD5());(SHA同理)
securityProtocols.addPrivacyProtocol(new PrivDES());(AES同理)
主要就是这个位置。接下来我贴一下get获取主机名字的代码
import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.List;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.PrivDES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
public class Snmpv3Test {
public static void main(String[] args) throws IOException {
try {
//初始化snmp
Snmp snmp= new Snmp(new DefaultUdpTransportMapping());
//设置安全模式
USM usm=new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
//开始监听
snmp.listen();
//注册加密协议 md5 认证协议des snmp4j 3.x版本以上需要
SecurityProtocols securityProtocols=SecurityProtocols.getInstance();
securityProtocols.addAuthenticationProtocol(new AuthMD5());
securityProtocols.addPrivacyProtocol(new PrivDES());
//添加用户
UsmUser user=new UsmUser(new OctetString("fxw"),
AuthMD5.ID, new OctetString("auth123456"), PrivDES.ID, new OctetString("priv123456"));
snmp.getUSM().addUser(new OctetString("fxw"), user);
//设置ip
UdpAddress udpAddress = new UdpAddress(InetAddress.getByName("192.168.87.128"), 161);
//v3是UserTaget v1v2c是CommunityTarget
UserTarget target=new UserTarget();
target.setVersion(SnmpConstants.version3);//协议版本v3
target.setAddress(udpAddress);
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);//设置安全模式 加密认证
target.setSecurityName(new OctetString("fxw"));//v3的用户名
target.setTimeout(3000);
target.setRetries(5);
//创建ScopePDU
ScopedPDU pdu=new ScopedPDU();
pdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.5.0")));//OID代表设备名字
pdu.setType(PDU.GET);
//set
//pdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.5.0"),new OctetString("windows")));
//pdu.setType(PDU.SET);
//发送报文
ResponseEvent responseEvent=snmp.send(pdu, target);
//显示信息
System.out.println("Synchronize(同步) message(消息) from(来自) "
+ responseEvent.getPeerAddress() + "\r\n"+"request(发送的请求):"
+ responseEvent.getRequest() + "\r\n"+"response(返回的响应):"
+ responseEvent.getResponse());
} catch (SocketException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
}