android--snmp移植

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值