简单网络管理协议(SNMP)是设计用于IP网路管理网络节点的一种标准协议,它是应用层协议
SNMP协议目前在用的有3个版本,分别是V1,V2C,V3版本
认证方式有SHA,MD5
加密方式有DES,AES
需要支持版本、认证、加密不同的方式功能
自己也是各种找资料,但是很多资料都是复制粘贴,也不全;
所以就把自己的部分实现贴出来,仅供参考:
/*
*@author: 赵秋然
*@date:2021年8月7日
*@description:snmp.h
*/
#ifndef __SNMP_H__
#define __SNMP_H__
#include "public.h"
#include "cJSON.h"
#include<stdio.h>
#include<signal.h>
#include<string.h>
#include<net-snmp/net-snmp-config.h>
#include<net-snmp/net-snmp-includes.h>
#define SNMP_CONF "/backend-c/snmp/snmp_device.conf"
///snmp版本类型
typedef enum{
SNMP_V1 = 1,
SNMP_V2,
SNMP_V3
} snmp_v;
//snmp认证方式
typedef enum{
NOAUTH = 0,
SHA,
MD5
} auth_t;
//snmp加密连接方式
typedef enum{
OPRIV = 0,
DES,
AES
} priv_t;
//snmp 机器类型
typedef enum{
COMMON = 0,
CISCO
} machine_t;
// snmp 通用机器内存 oid信息枚举
typedef enum{
MEMTOTAL = 0,
MEMAVAILABLE,
MEM_SHARE,
MEM_BUFFER,
MEM_CACHE
}machine_common;
typedef enum{
MEM_USE = 0,
MEM_UNUSE
}machine_cscio;
#define RES_LEN 10
#define OID_LEN 30
#define LEN 256
#define SUCCE 0
#define ERROR -1
typedef struct snmp_basic_i{
int snmp_on; // snmp主服务启用
int snmp_cycle_time;//服务更新设备间隔(秒)
int snmp_count;//snmp设备个数统计
}snmp_basic_info;
typedef struct snmp_machine{
int snmp_device_on;//当前设备是否启用获取
char m_ip[20]; // 机器ip
int snmp_version;// snmp 版本号
int snmp_auth;//snmp加密方式
int snmp_ency;//snmp认证方式
char community[LEN]; //snmp 团体字
int time_cycle;// 获取周期时间 5秒 10秒等更新周期
char security_name[LEN];//登录名称
char security_pass[LEN];//密码
char priiv_pass[LEN];//私钥
struct timeval cur_time;///开始获取时间 戳 上一次更新的时间戳
int machine_type;// 机器分类 common 思科 后续需要扩展
char machine_name[LEN];// 机器名称
char machine_id[LEN];// 机器id
char cpu_oid[5][OID_LEN];// cpu oid
char mem_oid[6][OID_LEN];// 内存 oid
char cpu_use_percent[RES_LEN];//cpu 使用率
char mem_use_percent[RES_LEN];//内存使用率
netsnmp_session s_session;
}snmp_machine_info;
int is_valic_ip(char *ip);
int snmp_get_info(netsnmp_session * session,char *dest_ip ,char * oid_val, int * res);
int snmp_dialog_create(snmp_machine_info * snmp_machine,snmp_basic_info snmp_info);
int snmp_basic_conf(snmp_basic_info * snmp_info,cJSON * root);
int snmp_device_conf(snmp_machine_info * machine,cJSON * root);
int snmp_config_init(snmp_machine_info ** snmp_machine,snmp_basic_info * snmp_info);
int get_cycle_second(struct timeval mache,int mache_time_cycle);
//通用 机器cpu 内存获取
void snmp_common(snmp_machine_info *snmp_machine);
//思科 路由 cpu 内存获取
void snmp_cisco(snmp_machine_info *snmp_machine);
void snmp_get_message(snmp_machine_info * snmp_machine);
void snmp_interval_get(snmp_machine_info *snmp_machine,snmp_basic_info snmp_info);
void snmp_free(snmp_machine_info * snmp_machine);
void * snmp_init(void * tmp);
void snmp_start();
#endif
/*
*@author: 赵秋然
*@date:2021年8月7日
*@description:snmp.c
*/
#include "snmp.h"
int quit = 0;
pthread_t snmp_tid;
int is_valic_ip(char *ip){
if(ip == NULL){
return ERROR;
}
char ip_val[30] = {'\0'};
int a,b,c,d;
strncpy(ip_val,ip,sizeof(ip_val)/sizeof(char)-1);
if (4==sscanf(ip_val,"%d.%d.%d.%d",&a,&b,&c,&d)){
if (0<=a && a<=255
&& 0<=b && b<=255
&& 0<=c && c<=255
&& 0<=d && d<=255){
return SUCCE;
}
}
return ERROR;
}
int snmp_get_info(netsnmp_session * session,char *dest_ip ,char * oid_val, int * res){
netsnmp_session * ss = NULL;
netsnmp_pdu * pdu;
netsnmp_pdu * response;
struct variable_list *vars;
int status;
if(session == NULL || dest_ip == NULL || oid_val == NULL || res == NULL){
printf("snmp_get_info parameter is error \n");
return STAT_ERROR;
}
if(is_valic_ip(dest_ip)){
printf("snmp_get_info is_valic_ip ip is error \n");
return STAT_ERROR;
}
session->peername =strdup(dest_ip) ;
ss = snmp_open(session);
if(ss == NULL){
snmp_sess_perror(