项目中要用到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();
}
5408

被折叠的 条评论
为什么被折叠?



