SNMP QT 开发

SNMP 简单网络管理协议

一 、概念

SNMP: Simple Network Management Protocol 简单网络管理协议,是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及HUBS等)的一种标准协议,它是一种应用层协议。
顾名思义SNMP可以实现系统管理员和网络管理员对主机和网络设备的管理等。
windows 默认支持SNMP 需要安装snmp服务插件。linux安装SNMP也非常方便。

  1. SNMP 为什么叫简单网络管理协议,简单在哪里?
    协议层,通讯模型的简单、SNMP 使用UDP协议,因为UDP协议效率较高,用它来实现网络管理不会太多地增大网络负荷。简单的另外一个体现应该在管理对象上。在MIB 中只提供两种类型的对象管理,一种是标量对象;另外一种是表格对象。

  2. SNMP 能管理对象的哪些资源,状态监测、参数设置、故障诊断。
    网络管理的五大功能:故障管理、计费流量管理、配置管理、性能管理、安全管理。

  3. SNMP的结构
    SNMP 的结构类似于分布式的C/S架构,服务端叫做代理Agent,通过161端口提供服务,客户端为管理站NMS,与161端口对应通过任意端口进行管理通讯。并且监听162端口,接受客户端的Trap报警信息。
    SNMP通讯结构

  4. SNMP的版本:
    V1 1990 5种类型的PDU,安全性差、错误码类型少
    V2 1996 7种类型的PDU,支持更多的错误码类型,Community 社区字符窜作为访问验证。
    V3 1999 7种类型的PDU,增加认证、加密和访问控制

二、缩略词

SNMP结构

  • OID: Object ID ,被管对象的ID号。管理对象通过树状结构进行组织,OID由树上的一系列整数组成,整数之间用点( . )分隔开,树的叶子节点才是真正能够被管理的对象。

  • MIB:Management Information Base , 管理信息库。MIB是一个数据库,指明了被管理设备所维护的变量,是能够被Agent查询和设置的信息。MIB在数据库中定义了被管理设备的一系列属性:对象的名称、对象的状态、对象的访问权限和对象的数据类型等。
    Agent通过查询MIB,可以获知设备当前的状态信息。
    Agent通过修改MIB,可以设置设备的状态参数。
    MIB数据对象以一种树状分层结构进行组织,这个树状结构中的每个分枝都有一个专用的名字和一个数字形式的标识符。结构树的分枝实际表示的是数据对象的逻 辑分组。而树叶,有时候也叫节点(node),代表了各个数据对象。在结构树中使用子树表示增加的中间分枝和增加的树叶。
    MIB浏览器是这样一种工具,它可以遍历整棵MIB结构树,通常 以图形显示的形式来表示各个分枝和树叶对象。可以通过其数字标识符来查找MIB中的数据对象,这个数字标识符号从结构树的顶部(或根部)开始,直到各个叶 子节点(即数据对象)为止。这种访问方式和文件系统的组织方式一致。两者的主要区别在于文件系统中的路径名可以以绝对也可以以相对方式表示,而MIB数据 对象只能以绝对方式表示,不能使用相对方式。
    每一个节点都有一个对象标识符(OID)来唯一的标识,每个节点用数字和字符两种方式显示,其中对象标识符OID是由句点隔开的一组整数,也就是从根节点 通向它的路径。一个带标号节点可以拥有包含其它带标号节点为它的子树,如果没有子树它就是叶子节点,它包含一个值并被称为对象。比如网络设备名的oid 是.1.3.6.1.2.1.1.5.0,其值为设备名称的字符串。
    网络资源被抽象为对象进行管理。但SNMP中的对象是表示被管资源某一方面的数据变量。对象被标准化为跨系统的类,对象的集合被组织为管理信息库 (MIB)。MIB作为设在代理者处的管理站访问点的集合,管理站通过读取MIB中对象的值来进行网络监控。管理站可以在代理者处产生动作,也可以通过修改变量值改变代理者处的配置。

  • community:社区字符串,团体(community)是基本的安全机制,用于实现SNMP网络管理员访问SNMP管理代理时的身份验证。类似于密码,默认值为 public。一旦获取设备的访问权限(,就可以访问设备信息、改写和配置设备参数

  • TRAP:代理者主动向管理站通报重要事件。它的功能就是在网络管理系统没有明确要求的前提下,由管理代理通知网络管理系统有一些特别的情况或问题 发生了。如果发生意外情况,客户会向服务器的162端口发送一个消息,告知服务器指定的变量值发生了变化。Trap 消息可以用来通知管理站线路的故障、连接的终端和恢复、认证失败等消息。管理站可相应的作出处理。

  • PDU : 协议数据单元是SNMP消息中的数据区, 即Snmp通信时报文数据的载体。PDU指明了SNMP的消息类型及其相关参数

  • NMS: Network Management System 网络管理系统。
    NMS在网络中扮演管理者角色,是一个采用SNMP协议对网络设备进行管理/监视的系统,运行在NMS服务器上。
    NMS可以向设备上的Agent发出请求,查询或修改一个或多个具体的参数值。NMS可以接收设备上的Agent主动发送的Trap信息,以获知被管理设备当前的状态。

  • Agent : 是被管理设备中的一个代理进程,用于维护被管理设备的信:息数据并响应来自NMS的请求,把管理数据汇报给发送请求的NMS。
    Agent接收到NMS的请求信息后,通过MIB表完成相应指令后,并把操作结果响应给NMS。当设备发生故障或者其它事件时,设备会通过Agent主动发送信息给NMS,向NMS报告设备当前的状态变化。

三、开发包

SNMP的开发包有以下版本:

  1. C语言版本 Net-SNMP
    前身是卡内基梅隆大学UDC-SNMP版本,C语言版本在嵌入式开发上有天然的优势,大部分网络设备都是嵌入式。
    无论从功能、性能、可靠性、可移植性方面都是最优的选择。
  2. C++版本 SNMP++
    C++版本SNMP,源于惠普HP公司的,他为用户提供了简单的API接 口;在安全性上提供了安全机制,防止内存泄漏。高效、可移植、易用的面向对象的开发库。
  3. JAVA版本 jSNMP 、iReasoning
    jSNMP 非开源库,支持灵活的扩展和多种网络连接,拥有三层架构。
    iReasoning 非开源库,安全机制或支持是优势。
    SNMP4j 开源库
  4. Python版本 PySNMP
    跨平台,开源

四、安装snmp服务

# 1. ubuntu 20.04 安装snmp服务
 apt install snmpd
# 2. 安装snmp命令,可用snmpwalk -V 命令校验
apt install snmp
# 3. 安装snmp mib解析下载器
apt install snmp-mibs-downloader
# 4. 下载mibs文件
download-mibs
# 5. SNMP的配置

三、基于Qt C++的开发

  1. 下载 SNMP++ 和 LIBDES

SNMP++官方下载地址:http://www.agentpp.com/download.html#AGENTPP,如图1-1:
SNMP++下载界面
2.基于Qt的开发

  1. snmp_oid.pro
TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt
INCLUDEPATH +=/usr/local/include
LIBS += -L/usr/local/lib/ -lsnmp++ \
        -L$$PWD/snmp/linux/lib/ -ldes
        
//添加 snmp++ 库和 加密啊相关的库*

SOURCES += main.cpp

HEADERS += \
    snmp_oid.h
  1. snmp_oid.h
#ifndef SNMP_OID_H
#define SNMP_OID_H
#endif // SNMP_OID_H
  1. main.cpp
#include <iostream>
#include <snmp_pp/snmp_pp.h>
#include <snmp_oid.h>
#define SYSDESCR ".1.3.6.1.2.1.4.20.1"
//获取表格 MIB table "IP-MIB:ipAddrTable"
using namespace std;
using namespace Snmp_pp;
int main()
{
int status;
UdpAddress address("127.0.0.1");
Snmp snmp(status,0,(address.get_ip_version() == Snmp_pp::Address::version_ipv6));

if (status != SNMP_CLASS_SUCCESS) {
    std::cout << "SNMP++ Session Create Fail, " << snmp.error_msg(status) << "\n";

 }
Pdu pdu;

Oid oid(SYSDESCR);
Vb vb;
vb.set_oid(oid);

CTarget ctarget(address);
pdu += vb;
SnmpTarget *target;
target = &ctarget;

 while(status = snmp.get_bulk(pdu,*target,0,10) == SNMP_CLASS_SUCCESS){
     for (int z=0;z<pdu.get_vb_count(); z++) {
                  pdu.get_vb(vb,z);
                  Oid tmp;
                  vb.get_oid(tmp);
                  if (oid.nCompare(oid.len(), tmp) != 0)
                  {
                     return -4;
                  }
                 std::cout << vb.get_printable_oid()<<"=:"<<vb.get_printable_value() << "\n";


     }

 }



//if ( (status = snmp.get( pdu, *target)) != SNMP_CLASS_SUCCESS)

// {     cout << snmp.error_msg( status);
//       return status;}
//else {
//pdu.get_vb(vb,0);
//cout << "System Descriptor = "<< vb.get_printable_value()<<":"<<status;
//}


return status;
}

SNMP++ 包拥有SNMP 的大部分操作的例子,包括Get Set Walk 等等.但缺乏Net-snmp包中直接获取Table的能力.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值