SNMP(Simple Network Management Protocol,简单网络管理协议)
SNMP工作过程
在典型的SNMP用法中,有许多系统被管理,而且是有一或多个系统在管理它们。每一个被管理的系统上又运行一个叫做代理者(agent)的
软件元件,且透过SNMP对管理系统报告资讯。
基本上,SNMP代理者以
变量呈现管理资料。管理系统透过GET,GETNEXT和GETBULK协定指令取回资讯,或是代理者在没有被询问的情况下,使用TRAP或INFORM传送资料。管理系统也可以传送配置更新或控制的请求,透过SET协定指令达到主动管理系统的目的。配置和控制指令只有当网络基本结构需要改变的时候使用,而监控指令则通常是常态性的工作。
下面的代码用来在机顶盒中获取cable moden Mac地址。
int get_mac(char *mac)
{
char snmpdata[32];
char *ptmac;
if (0 != snmp_session_init(CM_MAC, "192.168.100.1", "public", snmpdata))
{
printf("(err) snmp_session_init failed\n");
return -1;
}
ptmac = strstr(snmpdata, " ");
strcpy(mac, ptmac + 1);
return 0;
}
int snmp_session_init(const char *docsis_oid, char *device_ip, char *community_str, char *snmpdata)
{
struct snmp_session session;
struct snmp_session *sess_handle;
struct snmp_pdu *pdu = NULL;
struct snmp_pdu *response = NULL;
struct variable_list *vars = NULL;
oid id_oid[MAX_OID_LEN];
size_t id_len = MAX_OID_LEN;
int status = 0;
char retdata[500];
//printf("(in) snmp_session_init\n");
//printf("docsis_oid = %s\n", docsis_oid);
if (!docsis_oid || !device_ip || !community_str)
{
printf("(err) invalid input\n");
return -1;
}
init_snmp("APC Check");//初始化SNMP库
snmp_sess_init(&session);// // 初始化会话结构变量
session.version = SNMP_VERSION_1;
session.community = (u_char *)community_str;
session.community_len = strlen(community_str);
session.peername = device_ip;
sess_handle = snmp_open(&session); //打开一个snmp会话
if (!sess_handle)
{
printf("(err) snmp_open failed\n");
return -1;
}
pdu = snmp_pdu_create(SNMP_MSG_GET); //创建一个SNMPv1 PDU,
read_objid(docsis_oid, id_oid, &id_len);
snmp_add_null_var(pdu, id_oid, id_len);
status = snmp_synch_response(sess_handle, pdu, &response); //与SNMP代理进行通讯. 这里使用的是同步通讯机制
if (status == STAT_SUCCESS && response->errstat == SNMP_ERR_NOERROR) //处理反馈.如果通讯成功
{
vars = response->variables;
memset(retdata, '\0', 500);
snprint_value(retdata, 500, vars->name, vars->name_length, vars);
}
else
{
if (response)
snmp_free_pdu(response);
snmp_close(sess_handle);
printf("(err) snmp_synch_response failed\n");
return -1;
}
printf("retdata = %s, len = %d\n", retdata, strlen(retdata));
strcpy(snmpdata, retdata);
if (response)
snmp_free_pdu(response);//由程序释放API分配的内存
snmp_close(sess_handle);//关闭会话
//printf("(out) snmp_session_init\n");
return 0;
}
移植到android上面的时候,需要将下面解压版本里面的mibs拷贝到盒子里面NETSNMP_DEFAULT_MIBDIRS定义的几个目录中的一个
http://download.csdn.net/detail/new_abc/5087022