SNMP功能开发简介 六 snmp功能开发阶段性总结

本文介绍了一种利用C语言的net-snmp库为Go语言开发的产品添加SNMP功能的方法。通过CGO将net-snmp嵌入到Go程序中,实现了设备信息的获取和管理,满足了客户对SNMP协议的需求。文章详细描述了如何添加私有MIB结点、动态端口刷新和IPv6支持等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说客户需求:能够通过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功能进行相关上报工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值