1.Linux环境
略
2.安装
net snmp开源软件
http://www.net-snmp.org/docs/man/
3.需求背景
目前准备做一个设备网管,采用snmp协议,目前刚刚研究snmp相关,下面是要做的事情:
web server 第三方网管
-----------|--------------------------------------|--------------
| |
|-------json---------|-------snmp------| net-snmp client/manager
|
|适 配 层|
--------------------------------|---------------------------------
snmp
| net-snmp agent
设 备
其中web server是内部的一套设备网管(B/S架构),第三方网管采用snmp协议,内部的网管采用json格式请求,目前要做的事情就是不管是第三方还是内部网管下来的请求是什么格式(json or snmp),到设备这一层都是snmp,这样的话,就要在适配层做一个解析封装模块(json<-->snmp),这个是上面要求的,本来做成两套很容易实现。
这样搞的话,目前要做的两件事,第一件事情,在net-snmp client/manager这一层,封装snmp相关命令接口(get、set等),注意区分版本(v1,v2,v3),主要是格式问题。第二件事情,实现适配功能,就是将上层下来的json请求解析成snmp方式,应答时转换成json格式。
4.接口封装
今天仅仅只是做了简单实验,也不知道这样是不是可行的。直接代码吧。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFF_SIZE 80
typedef struct
{
char *p_cmd_name;//snmpget/set等
char *p_version;//v1/V2/V3
char *p_community;//public
char *p_ip_address;//设备ip
char *p_oid;//MIB对应的oid信息
}snmp_cmd_s;
void create_snmp_cmd(const snmp_cmd_s *p_cmd_struct, char *p_cmd)
{
if(NULL == p_cmd_struct || NULL == p_cmd)
{
printf("error : NULL pointer.\n");
return;
}
memset(p_cmd, 0, strlen(p_cmd));
//创建v1、V2的命令
strncpy(p_cmd, p_cmd_struct->p_cmd_name, strlen(p_cmd_struct->p_cmd_name));
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, "-v", strlen("-v"));//命令格式
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, p_cmd_struct->p_version, strlen(p_cmd_struct->p_version));//1or2c
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, "-c", strlen("-c"));//命令格式
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, p_cmd_struct->p_community, strlen(p_cmd_struct->p_community));//public
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, p_cmd_struct->p_ip_address, strlen(p_cmd_struct->p_ip_address));//dev ip
strncat(p_cmd, " ", strlen(" "));//加空格
strncat(p_cmd, p_cmd_struct->p_oid, strlen(p_cmd_struct->p_oid));//mib oid
//strncat(p_cmd, " ", strlen(" "));//加空格 ,最后一个空格不需要
return;
}
int exec_snmp_cmd(const char *p_cmd)
{
FILE *fp;
char buffer[BUFF_SIZE] = {0};
if (NULL == (fp = popen(p_cmd, "r")))
{
perror("error : Fail to popen.\n");
exit(1);
}
while(NULL != fgets(buffer, sizeof(buffer), fp))
{
printf("%s", buffer);
}
pclose(fp);
return 0;
}
int main(void)
{
#if 0
int ret = exec_snmp_cmd("cat /etc/passwd");
if (ret)
{
printf("error : set snmp cmd failed.\n");
}
#endif
char cmd_str[BUFF_SIZE] = {0};
snmp_cmd_s snmp_walk_cmd =
{
"snmpwalk",
"1",
"public",
"127.0.0.1",
/*"sysDescr",*/
".1.3.6.1.4.1.2021.4.5.0",//查看内存容量的oid
};
//1.创建命令
create_snmp_cmd(&snmp_walk_cmd, cmd_str);
//2.执行命令
exec_snmp_cmd(cmd_str);
return 0;
}
运行情况:
[root@x64-dev ~]# ./popen
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 484676 kB
望各位对snmp有经验的大神多多指教,多谢。