代碼參考《Visual C++ 開發基于SNMP的網絡管理軟件》書中的代碼,由于這個是用C++實現的用的庫也是SNMP++。SNMP4J是參考SNMP4J++ 編寫的。網上也沒用用SNMP4J實現這個功能,我參考代碼寫了一個類似的,初步運行沒什么問題,可能還有其他問題,后面慢慢修了
1 public class DeviceScannImp implements DeviceScann{
2 //保存OID的鏈表
3 private ArrayList<String> oidStr;
4 //保存值的鏈表
5 private ArrayList<String> value;
6 private String err;
7
8 private Snmp snmp = null;
9 private Address targetAddress = null;
10 private CommunityTarget target = null;
11
12 //裝載解析MIB文件。暫時不實現
13 public void loadMIBs(){
14
15 }
16
17 public void setTarget(String ip, OctetString community, String oidStr){
18 targetAddress = GenericAddress.parse("udp:" + ip + "/161");
19 try {
20 DefaultUdpTransportMapping transportMapping = new DefaultUdpTransportMapping();
21 snmp = new Snmp(transportMapping);
22 transportMapping.listen();
23
24
25 target = new CommunityTarget(targetAddress, community);
26 target.setRetries(2);
27 target.setTimeout(1500);
28 target.setVersion(SnmpConstants.version2c);
29
30 } catch (IOException e) {
31 e.printStackTrace();
32 }
33 }
34
35 /**
36 * 獲取子樹中的全部內容
37 * @param ip ip地址
38 * @param community 團體名稱 ,我們才用的是public OceteString 八進制字符串
39 * @param oid 的字符串
40 * @return 返回到List中。
41 */
42 @Override
43 public void getTree(String ip, OctetString community, String oidStr) {
44
45 ArrayList<OID> OIDList = new ArrayList<OID>();
46 ArrayList<Variable> variableList = new ArrayList<Variable>();
47
48 //構造目的IP和端口
49 targetAddress = GenericAddress.parse("udp:" + ip + "/161");
50
51 try {
52 DefaultUdpTransportMapping transportMapping = new DefaultUdpTransportMapping();
53 snmp = new Snmp(transportMapping);
54 transportMapping.listen();
55
56 target = new CommunityTarget(targetAddress, community);
57 target.setRetries(2);
58 target.setTimeout(1500);
59 target.setVersion(SnmpConstants.version2c);
60
61 OID baseOID = new OID(oidStr);
62 OID nextOid = new OID(baseOID.toString() + ".1");
63 System.out.println("------------baseOID : " + baseOID);
64 VariableBinding vb = new VariableBinding(baseOID);
65
66 PDU pdu = new PDU();
67
68 pdu.add(vb);
69 pdu.setType(PDU.GET);
70 // ResponseEvent responseEvent = snmp.send(pdu, target);
71 // ResponseEvent responseEvent = snmp.getNext(pdu, target);
72
73 while(baseOID.leftMostCompare(baseOID.size(), nextOid) == 0){
74 System.out.println("執行到這里");
75 ResponseEvent re = snmp.getNext(pdu, target);
76 PDU pdu2 = re.getResponse();
77
78 if(re != null && re.getResponse() != null){
79 System.out.println("進入到if中。。。");
80 //拿到第一個VariableBinding
81 VariableBinding variableBinding = pdu2.get(0);
82 OID replyOID = variableBinding.getOid();
83
84 nextOid = replyOID;
85 System.out.println("replyOID : " + replyOID);
86 System.out.println("nextOid : " + nextOid);
87 Variable replyVariable = variableBinding.getVariable();
88 // System.out.println("獲取到的Value: " + replyVariable);
89 //這里主要是判斷拿到的值是否為空,有的值為空,那么后面就會出異常,所以判斷是否為空后主動為這個值賦一個NULL值
90 //但是Variable是一個借口,并沒有提供一個方法或者函數對這個進行復制,這里簡單轉換了一下。
91 if(replyVariable.equals("") || replyVariable == null){
92 String s = replyVariable.toString();
93 s += "NULL";
94 Variable variable = new OctetString(s);
95 replyVariable = variable;
96 }
97 System.out.println("baseOID : " + baseOID);
98 System.out.println(baseOID.leftMostCompare(baseOID.size(), nextOid));
99 if(baseOID.leftMostCompare(baseOID.size(), nextOid) == 0){
100 System.out.println("進入到第三個if");
101 replyOID.trim();
102 replyVariable.toString().trim();
103 OIDList.add(replyOID);
104 variableList.add(replyVariable);
105
106 System.out.println(replyOID + " : " + replyVariable);
107
108 }
109 }else{
110 return;
111 }
112 System.out.println("設置OID :" + nextOid);
113 vb.setOid(nextOid);
114 // vb.setVariable(null);
115 pdu.add(vb);
116 }
117
118 snmp.close();
119
120 // PDU pdu2 = responseEvent.getResponse();
121 //
122 // @SuppressWarnings("unchecked")
123 // Vector<VariableBinding> vector = (Vector<VariableBinding>) pdu2.getVariableBindings();
124 //
125 // for(int i = 0; i < vector.size(); i++){
126 // VariableBinding variableBinding = (VariableBinding)vector.elementAt(i);
127 // System.out.println(variableBinding.getOid() + " : " + variableBinding.getVariable());
128 // }
129 //
130 } catch (IOException e) {
131 e.printStackTrace();
132 }
133 }
134
135
136 public static void main(String[] args) {
137 DeviceScannImp deviceScannImp = new DeviceScannImp();
138 deviceScannImp.getTree("127.0.0.1", new OctetString("public"), ".1.3.6.1.2.1.1");
139 }
140
141 }