snmp简介,报文,mib,oid了解网:https://www.cnblogs.com/chloneda/p/snmp-protocol.html
snmp简单案列:https://blog.csdn.net/FormatWindowsXP/article/details/81703423 (我用的jar包是snmp4j-2.8.0.jar)
snmp4j.jar链接: https://pan.baidu.com/s/1EN2Od3qlFEf3y2edorQ8Sw 提取码: x34k 复制这段内容后打开百度网盘手机App,操作更方便哦
1. 监听162端口
import java.util.Vector; import org.snmp4j.CommandResponder; import org.snmp4j.CommandResponderEvent; import org.snmp4j.MessageDispatcherImpl; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.mp.MPv1; import org.snmp4j.mp.MPv2c; import org.snmp4j.mp.MPv3; import org.snmp4j.security.SecurityModels; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.USM; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.TcpAddress; import org.snmp4j.smi.UdpAddress; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultTcpTransportMapping; import org.snmp4j.transport.DefaultUdpTransportMapping; import org.snmp4j.util.MultiThreadedMessageDispatcher; import org.snmp4j.util.ThreadPool; /** * @author Song * snmp协议的监听模块,用于监听snmp客户端发来的信息. * 使用snmp4j实现snmp消息监听, * snmp4j 版本 2.6.2 * snmp trap 默认端口162 * 2018年08月14日 建立对象 **/ public class ReceiveService_snmp implements CommandResponder//使用snmp4j需要实现一个接口 { public static void main(String[] args) { System.out.println("v1="+MPv1.ID); System.out.println("v2="+MPv2c.ID); System.out.println("v3="+MPv3.ID); ReceiveService_snmp snmp_receive = new ReceiveService_snmp(); snmp_receive.run(); //开始监听 } //#region 启动程序 public void run() { try { startListen(); snmp.addCommandResponder(this); System.out.println("开始监听Trap信息!"); } catch (Exception ex) { ex.printStackTrace(); } } //#endregion //#region 启动监听 private static Snmp snmp = null; private static Address listenAddress; private static void startListen(){ try{ ThreadPool threadPool= ThreadPool.create("Trap", 2);//启动一个线程池,设置最高两个线程 MultiThreadedMessageDispatcher dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); listenAddress = (Address) GenericAddress.parse("udp:0.0.0.0/162"); //监听所有ip的162端口 tcp:0.0.0.0/162 TransportMapping transport = null; // 对TCP与UDP协议进行处理 try { if (listenAddress instanceof UdpAddress) { System.out.println("使用UDP协议"); transport = new DefaultUdpTransportMapping((UdpAddress) listenAddress); } else { System.out.println("使用TCP协议"); transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress); } }catch (Exception e){ System.out.println("接收地址绑定失败,端口162可能被占用,错误信息:"+e.getMessage()); System.exit(0);//绑定失败,停止当前进程 } 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(); //开始监听 } catch (Exception e){ System.out.println("启动监听时触发catch异常:"+e.getMessage()); } } //#endregion //#region processPdu接口具体的实现 /** * processPdu接口具体的实现 * 在接收到snmp信息时,会触发这个方法 **/ public void processPdu(CommandResponderEvent respEvnt){ if (respEvnt != null && respEvnt.getPDU() != null){ Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getPDU().getVariableBindings();//这里提示我类型转换错误,我必须要进行一次强转 System.out.println("=======================消息内容======================="); System.out.println("数据来源:"+respEvnt.getPeerAddress()); System.out.println("团体名:"+new String(respEvnt.getSecurityName()));//团体名在v1 v2c下可以用来做认证 String snmpVer = respEvnt.getMessageProcessingModel()==0? "v1":respEvnt.getMessageProcessingModel()==1? "v2c":respEvnt.getMessageProcessingModel()==3? "v3":"其他版本";//其实这里还有一个v2u版本,但网上很少提及不知道是不是应用较少? System.out.println("trap版本:"+snmpVer); System.out.println(respEvnt.toString());//输出一下整条信息 for (int i = 0; i < recVBs.size(); i++) { VariableBinding recVB = recVBs.elementAt(i); System.out.println("oid:"+recVB.getOid()); System.out.println("variable:"+recVB.getVariable()); } System.out.println("=======================输出结束======================="); } } //#endregion }
2. 发送UDP请求 案列:参考文章
import java.io.IOException; 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.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 Monitor { // systemDescr https://www.cnblogs.com/aspx-net/p/3554044.html static final String OID1 = "1.3.6.1.2.1.1.1.0"; // eth0 static final String OID2 = "1.3.6.1.2.1.2.2.1.2.2"; // MAC static final String OID3 = "1.3.6.1.2.1.2.2.1.6.2"; static final String OID4 = "1.3.6.1.2.1.1.1"; // //设备名称 // static final String OID5 = "1.3.6.1.2.1.1.5.0"; //static final int [] OID5 = {1,3,6,1,2,1,1,2}; 与第一个一样 /** * @param args */ public static void main(String[] args) { GetOID(); } /** * 获得本机oid */ public static void GetOID() { TransportMapping transport = null; try { // 传输协议udp transport = new DefaultUdpTransportMapping(); transport.listen(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 構造報文 PDU request = new PDU(); request.add(new VariableBinding(new OID(OID1))); request.add(new VariableBinding(new OID(OID2))); request.add(new VariableBinding(new OID(OID3))); request.add(new VariableBinding(new OID(OID4))); // request.add(new VariableBinding(new OID(OID5))); request.setType(PDU.GET); // snmp初始化 Snmp snmp = new Snmp(transport); // 構造目標 CommunityTarget target = new CommunityTarget(); Address localAddress =GenericAddress.parse("udp:10.10.11.168/161"); target.setAddress(localAddress); OctetString oct = new OctetString("public"); target.setCommunity(oct); target.setVersion(SnmpConstants.version2c); target.setRetries(2); target.setTimeout(5 * 60); try { // 發送報文 ResponseEvent responseEvent = snmp.send(request, target); PDU response = responseEvent.getResponse(); if (response != null) { System.out.println("request.size()=" + request.size()); System.out.println("response.size()=" + response.size()); VariableBinding vb1 = response.get(0); VariableBinding vb2 = response.get(1); VariableBinding vb3 = response.get(2); VariableBinding vb4 = response.get(3); VariableBinding vb5 = response.get(4); System.out.println(vb1); System.out.println(vb2); System.out.println(vb3); System.out.println(vb4); // System.out.println(vb5); //释放 transport.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3. 安装mg-soft
百度云盘下载rar压缩包,里面有个安装教程文档
链接: https://pan.baidu.com/s/1f_aVEy1aiwr_kPalyH-fOw 提取码: dyva 复制这段内容后打开百度网盘手机App,操作更方便哦
(说明:MIB Tree->ios->org->dod->internet->mgmt ‘公有oid’,private '私有oid'
右键Walk为矢量查询,Get,GetNext 为标量查询.
选中Query results 返回结果节点右键 Properties ‘可以查看OID,加上节点后的(.数字)就是这个结果的oid’
)
注意事项:1.以管理员身份运行: 解压后的setup.exe(谨慎起见) ,MG-SOFTMIB BrowserBinmgmibbpe.exe程序(MIB Browser)
4. 导入MIB学习网