使用snmp協議獲取MIB的資料
阿新 • • 發佈:2019-01-22
公司最近的需求是獲取印表機的配件資訊,常規的TCP/IP協議獲取不到資料,機器資訊存放在MIB資料庫中,需要用snmp協議讀取機器中的資訊,網路上查詢了幾天終於有點頭緒了
廢話不多說,直接貼程式碼
記得加上網路許可權!public class MainActivity extends AppCompatActivity { private TextView textView; private final static String REMOTE_ADDRESS = "udp:172.25.73.122/161"; public static final int UPDATE_TEXT = 1; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case UPDATE_TEXT: PDU response= (PDU) msg.obj; textView.setText(response+""); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.token); try { getData(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } private void getData() throws Exception { new Thread(){ @Override public void run() { Address remoteAddress = GenericAddress.parse(REMOTE_ADDRESS); System.out.println("SNMP地址:" + REMOTE_ADDRESS + ";有效:" + remoteAddress.isValid()); TransportMapping transportMapping = null; try { transportMapping = new DefaultUdpTransportMapping(); } catch (IOException e) { e.printStackTrace(); } Snmp snmp = new Snmp(transportMapping); try { snmp.listen(); } catch (IOException e) { e.printStackTrace(); } //構造傳送目標 CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setAddress(remoteAddress); target.setVersion(SnmpConstants.version2c); target.setRetries(10); target.setTimeout(1500); //構造傳送內容 PDU pdu = new PDU(); OID oid = new OID("1.3.6.1.4.1.367.3.2.1.2.2.18"); pdu.add(new VariableBinding(oid)); pdu.setType(PDU.GETNEXT); //非同步監聽響應 ResponseListener responseListener = new ResponseListener() { @Override public void onResponse(ResponseEvent event) { ((Snmp)event.getSource()).cancel(event.getRequest(),this); PDU response = event.getResponse(); PDU request = event.getRequest(); if(response == null){ System.out.println("請求超時:" + response + ",請求的內容:" + request); }else { System.out.println("獲取到資訊:" + response); Message msg=handler.obtainMessage(); msg.obj=response; msg.what=UPDATE_TEXT; handler.sendMessage(msg); } } }; //傳送 try { snmp.send(pdu,target,null,responseListener); } catch (IOException e) { e.printStackTrace(); } //由於是非同步獲取資訊,在這裡需要程式不能結束執行,否則接收不到非同步獲取的訊息。 try { System.in.read(); } catch (IOException e) { e.printStackTrace(); } } }.start(); } }