基于snmp协议用snmp4j对snmpv3版本进行get操作

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值