天天看點

SNMP功能開發簡介 六 snmp功能開發階段性總結

先說客戶需求:能夠通過SNMP協定擷取裝置資訊便于管理。客戶提出的需求資訊轉化成MIB結點都是Get類請求。

背景&方案:我們的産品業務層是使用Go語言開發的,系統層基于OpenWrt(一個嵌入式的 Linux 發行版)。SNMP功能一年前在上家公司裡接觸過,當時是因為生産産品的時候需要通過snmp去進行相關的更新操作,那個時候還專門學測試了一下MIB結點的添加,也能夠成功運作。雖說接觸過,但也僅僅是MIB結點的添加,這次的任務是是裝置支援snmp功能,從頭開始設計snmp的話有點不現實,一方面協定很多内容很多,要設計的話考慮方方面面,短期内無法完成,另外一個方面,感覺還是有點困難,⊙﹏⊙‖∣

老闆的建議是找一下相關的庫進行移植,去github上逛了一圈,Golang的SNMP版本目前還沒有完善的版本,大部分的Golang SNMP項目都是開發NMS(網絡管理工作站)而不是SNMP Agent代理,是以就采用C版本的net-snmp,net-snmp是開源的SNMP項目,功能完善而且易于二次開發,基本方案是将net-snmp裡面的代理功能嵌入到我們的程式中,然後在根據客戶需求添加私有MIB結點。代碼采用CGO編寫,即Go代碼調用net-snmp庫的形式。

  1. .添加私有MIB結點,采用的方式是靜态添加的方式,預編譯到庫中,使用mib2c工具生成MIB結點代碼架構然後根據業務需求編寫相應的結點回調處理函數,之後在代理的MIB初始化函數( init_mib_modules(); )中将我們私有結點的初始化函數添加進去。
  2. 動态端口,net-snmp代理線程啟動後預設是不能重新整理端口的,除非線程退出重新執行。根據測試結果發現,線程重新執行會失敗,因為某些靜态變量已經初始化的原因,這裡采取的方案是将net-snmp庫代碼做了些修改,如果重新整理端口的話,僅僅釋放舊的資源而不是所有資源,然後根據新的配置重新建立資源( netsnmp_transport_open_server)即可
  3. 支援IPv6
  1. trap功能,這一塊因為客戶沒有需求,暫時沒做,不過根據未來産品發展來看,是有必要開發trap功能進行相關上報工作。