使用snmp++库去执行set,get操作

项目中要用到snmp协议去控制pdu,客户说执行速度太慢,要求秒控制,原先是使用net-snmp库。想着是不是换个库速度能快点,与是用snmp++去测试。

先是去下载 https://www.agentpp.com/download.html里的C++ APIs里的snmp++3.6.3

看看了下解压的README.xx文件,一个是v3的,一个是说用autoreconf去编译,结果我的提示autoreconf版本不对,要换,看了下网上编译好麻烦,不用管。

又看到了里面有configure文件,直接 

./configure 

make

即可

写代码测试,先是用百度ai找了示例代码,结果都不太行,和我下的最新的库对不上。后来自己看了提供的demo代码。编译了后用consoleExamples下的snmpSet去测试。

结果获取值对的,设置值就报错

Set Status = SNMP: Variable does not exist,后来注意到打印的信息

SNMP++ Set to 192.168.20.107 SNMPV1 Retries=1 Timeout=2000ms SET-community=public GET-community=public
set权限是public,一般都是private,于是手动设置了下参数,果然是权限问题。

要注意snmp++的数据类型,如果Snmp_pp::Vb的set_value传的变量类型不对,则会报错

SNMP: Cannot create/modify variable, Wrong Type

看头文件的解释,如果协议是v1,v2c则用CTarget,如果是v3则用UTarget.

Snmp::Pdu在get和set操作时,不用一个,要另设置一个

付上代码

void Worker::snmpSet(char *value)
{
    // 初始化SNMP库
        Snmp_pp::Snmp::socket_startup();

        // 创建会话(复用同一会话)
        int status;
        Snmp_pp::Snmp snmp(status);
        
        if (status != SNMP_CLASS_SUCCESS) {
            cerr << "SNMP会话创建失败: " << snmp.error_msg(status) << endl;
            return;
        }

        // 配置目标设备
        Snmp_pp::CTarget target(Snmp_pp::IpAddress(ip_.toUtf8().constData()),"public","private");
        target.set_version(Snmp_pp::version1);

        // 执行批量SET
        for (QString oid : oidList)
        {
            Snmp_pp::Pdu pdu;
            Snmp_pp::Vb vb;
            vb.set_oid(oid.toUtf8().constData());

//            vb.set_value((long)atoi(value)); // 
            vb.set_value(atol(value));
            pdu += vb;
            status = snmp.set(pdu, target);

//            status = snmp.get(pdu,target);
//            if(status == SNMP_CLASS_SUCCESS)
//            {
//                pdu.get_vb(vb,0);
//                qDebug() << "Oid = " << vb.get_printable_oid() << " current value=" <<
//                            vb.get_printable_value() << "syntax=" << vb.get_syntax();
//                if(vb.get_syntax() == sNMP_SYNTAX_INT)
//                {
//                    long i = 0;
//                    if(strcmp(value,"1") == 0)
//                    {
//                        i = 1;
//                    }

//                        vb.set_value(i);
//                        Snmp_pp::Pdu setPdu;
//                        setPdu += vb;
//                        status = snmp.set(setPdu,target);
//                        if (status != SNMP_CLASS_SUCCESS)
//                        {
//                            qDebug() << "OID[" << oid << "]设置失败: " << snmp.error_msg(status);
//                        } else
//                        {
//                            qDebug() << "OID[" << oid << "]更新成功";
//                        }
//                }
//            }
            if (status != SNMP_CLASS_SUCCESS)
            {
                qDebug() << "OID[" << oid << "]设置失败: " << snmp.error_msg(status);
            } else
            {
                qDebug() << "OID[" << oid << "]更新成功";
            }


        }

        Snmp_pp::Snmp::socket_cleanup();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值