You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SNMP(OID-MIB)实现设备间数据传输的相关问题咨询

SNMP多设备数据传输问题解答

1. 是否需要自定义专属MIB和OID

是否自定义取决于你要传输的数据类型:

  • 无需自定义场景:如果待传输的是设备通用指标(如CPU/内存使用率、网口流量、系统运行时长等),这类参数已有公有MIB(如MIB-II、接口MIB等)定义的标准OID覆盖,直接复用即可,不需要额外开发。
  • 需要自定义场景:如果待传输的是设备特有私有数据(如自定义传感器数值、业务模块专属运行状态、私有告警类型等),公有MIB没有对应定义,就需要自定义专属MIB文件、申请私有OID分支做数据建模,保证管理端可以正确解析私有数据。3台不同类型的设备可以分别使用独立的私有OID分支,不会出现标识冲突。

2. 能否通过C代码实现数据传输功能

完全可以,业界通用的Net-SNMP开源库原生支持C语言开发,可分别实现设备端SNMP代理、管理端采集程序的全链路功能:

  • 设备端(被管理侧):基于Net-SNMP开发自定义SNMP Agent,将待上报的各类数据绑定到对应OID节点,既可以响应管理端的GET/GETBULK查询请求返回数据,也可以通过TRAP主动向管理端推送事件、告警类数据。
  • 管理端:基于Net-SNMP的C API开发采集程序,向3台设备的SNMP Agent发起查询请求,解析返回的OID对应数据后即可做后续存储、分析处理。

以下是管理端发起SNMP GET请求的核心代码示例:

// 基于Net-SNMP库的SNMP查询Demo
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>

int main(int argc, char **argv) {
    struct snmp_session session, *session_ptr;
    struct snmp_pdu *request_pdu, *response_pdu;
    oid target_oid[MAX_OID_LEN];
    size_t oid_len = MAX_OID_LEN;
    int req_status;

    // 初始化SNMP库
    init_snmp("snmp_collector");
    snmp_sess_init(&session);
    session.peername = "192.168.1.20"; // 待采集设备的IP
    session.version = SNMP_VERSION_2c;
    session.community = (u_char *)"public"; // SNMP读团体字
    session.community_len = strlen((const char *)session.community);

    // 建立SNMP会话
    session_ptr = snmp_open(&session);
    if (!session_ptr) {
        snmp_perror("SNMP会话建立失败");
        exit(EXIT_FAILURE);
    }

    // 构造GET请求PDU,填入目标OID
    request_pdu = snmp_pdu_create(SNMP_MSG_GET);
    // 示例OID:MIB-II的系统描述字段
    read_objid("1.3.6.1.2.1.1.1.0", target_oid, &oid_len);
    snmp_add_null_var(request_pdu, target_oid, oid_len);

    // 同步发送请求并接收响应
    req_status = snmp_synch_response(session_ptr, request_pdu, &response_pdu);
    if (req_status == STAT_SUCCESS && response_pdu->errstat == SNMP_ERR_NOERROR) {
        // 打印返回的OID对应数据
        print_variable(response_pdu->variables->name, 
                      response_pdu->variables->name_length, 
                      response_pdu->variables);
    }

    // 释放资源
    if (response_pdu) snmp_free_pdu(response_pdu);
    snmp_close(session_ptr);
    return EXIT_SUCCESS;
}

编译时需要链接Net-SNMP依赖,指令为:
gcc snmp_demo.c -o snmp_demo $(pkg-config --cflags --libs netsnmp)


内容的提问来源于stack exchange,提问作者M Acar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:24:00