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库的形式。

方案架构:启动一个独立的代理线程处理外部snmp请求,代理线程执行net-snmp库的代理入口(snmpd.c/SnmpDaemonMain()),net-snmp程序默认是读取配置文件的方式来启动,根据需求要能够允许用户通过web页面进行配置,所以这里采用的方案是主进程监听web配置刷新事件,如果收到配置刷新的话,将配置更新到全局变量中,然后通过发送信号通知线程刷新配置,代理线程收到信号会进行相关的操作。这里的操作需要对net-snmp库代码做一些修改,即增加一些API用于从共享变量中读取数据。

功能开发:

  1. .添加私有MIB结点,采用的方式是静态添加的方式,预编译到库中,使用mib2c工具生成MIB结点代码框架然后根据业务需求编写相应的结点回调处理函数,之后在代理的MIB初始化函数( init_mib_modules(); )中将我们私有结点的初始化函数添加进去。
  2. 动态端口,net-snmp代理线程启动后默认是不能刷新端口的,除非线程退出重新执行。根据测试结果发现,线程重新执行会失败,因为某些静态变量已经初始化的原因,这里采取的方案是将net-snmp库代码做了些修改,如果刷新端口的话,仅仅释放旧的资源而不是所有资源,然后根据新的配置重新创建资源( netsnmp_transport_open_server)即可
  3. 支持IPv6

待开发功能:

  1. trap功能,这一块因为客户没有需求,暂时没做,不过根据未来产品发展来看,是有必要开发trap功能进行相关上报工作。

猜你喜欢

转载自blog.csdn.net/fuyuande/article/details/83714783
今日推荐