在VS2017中编译好SNMP++后,关于如何在VS2017中编译使用SNMP++这个库,可以参考VS2017编译SNMP++步骤记录这篇文章。 参考使用下面的示例代码:
#include <iostream>
#include "snmp_pp/snmp_pp.h"
using namespace std;
#define SYSDESCR "1.3.6.1.2.1.1.1.0" // Object ID for System Descriptor
void get_system_descriptor(){
int status;//return status
CTarget ctarget((IpAddress)"192.168.1.111");
Vb vb(SYSDESCR);//SNMP++ variable Binding
Pdu pdu;//SNMP ++ pdu
//--------[Construct a SNMP++ SNMP Object--------------
Snmp snmp(status);//create a snmp session
if (status != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);//if fail,print error string
return;
}
//---------[Invoke a SNMP++ Get]------------------------
pdu += vb;//add the variable binding
if ((status = snmp.get(pdu,ctarget)) != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);
}
else {
pdu.get_vb(vb,0);//extract the variable binding
cout << "System Descriptor = " << vb.get_printable_value();
}
}
我的代码:
#include <iostream>
#include <libsnmp.h>
#include "snmp_pp/snmp_pp.h"
#ifdef WIN32
#define strcasecmp _stricmp
#endif
#ifdef SNMP_PP_NAMESPACE
using namespace Snmp_pp;
#endif
using namespace std;
// #define SYSDESCR "1.3.6.1.2.1.1.1.0" // Object ID for System Descriptor
// 监控设备33 模拟量输入(AI13) A相输入电压 225.64 无告警 连接正常
// 监测点配置(类型:模拟量输入AI,地址:33,索引:13) 原始硬件描述:A相输入电压
#define SYSDESCR "1.3.6.1.4.1.50688.2.4.33.13.0"
// 设备自身(0) 开关量输入(DI2) 烟感告警 闭合(0) 无告警 连接正常
// 测点配置(类型:开关量输入DI,地址:0,索引:2) 原始硬件描述:烟感告警
// #define SYSDESCR "1.3.6.1.4.1.50688.2.2.0.2.0"
/*
2、控制操作,使用 SET。
控制节点说明 OID 值 类型
主机自身的空调控制 1 1.3.6.1.4.1.50688.2.9.256.1.0 INTEGER
主机自身的空调控制 2 1.3.6.1.4.1.50688.2.9.256.2.0 INTEGER
主机自身的空调控制 3 1.3.6.1.4.1.50688.2.9.256.3.0 INTEGER
主机自身的空调控制 4 1.3.6.1.4.1.50688.2.9.256.4.0 INTEGER
*/
// 01 制冷模式、风速-自动、温度16℃、上下扫风、左右扫风
#define AirConditioning_DESCR "1.3.6.1.4.1.50688.2.9.256.1.0"
// 关机 63 可以在任何模式下学习 关空调
#define AirConditioning_CLOSE_DESCR "1.3.6.1.4.1.50688.2.9.256.63.0"
void get_system_descriptor() {
int status;//return status
//CTarget ctarget((IpAddress)"15.123.41.7", OctetStr("public"), OctetStr("private"));
CTarget ctarget((IpAddress)"15.123.41.7", "public", "private");
Vb vb(SYSDESCR);//SNMP++ variable Binding
Pdu pdu;//SNMP ++ pdu
//--------[Construct a SNMP++ SNMP Object--------------
Snmp snmp(status);//create a snmp session
if (status != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);//if fail,print error string
return;
}
//---------[Invoke a SNMP++ Get]------------------------
pdu += vb;//add the variable binding
if ((status = snmp.get(pdu, ctarget)) != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);
}
else {
pdu.get_vb(vb, 0);//extract the variable binding
cout << "System Descriptor = " << vb.get_printable_value();
}
//snmp.set(pdu, ctarget);
// int Snmp::set(Pdu &pdu, SnmpTarget &target)
//int Snmp::set(Pdu &pdu, SnmpTarget &target,
// const snmp_callback callback,
// const void * callback_data)
}
int main(int argc, char *argv[])
{
get_system_descriptor();
return 0;
}
报错如下图所示:
SNMP++: Transport is not supported 于是百度,在CSDN上找到这么一篇博客:SNMP++: Transport is not supported
即需要在构造Snmp之前添加如下的语句:
Snmp::socket_startup();
修改后的代码如下所示:
#include <iostream>
#include <libsnmp.h>
#include "snmp_pp/snmp_pp.h"
#ifdef WIN32
#define strcasecmp _stricmp
#endif
#ifdef SNMP_PP_NAMESPACE
using namespace Snmp_pp;
#endif
using namespace std;
// #define SYSDESCR "1.3.6.1.2.1.1.1.0" // Object ID for System Descriptor
// 监控设备33 模拟量输入(AI13) A相输入电压 225.64 无告警 连接正常
// 监测点配置(类型:模拟量输入AI,地址:33,索引:13) 原始硬件描述:A相输入电压
#define SYSDESCR "1.3.6.1.4.1.50688.2.4.33.13.0"
// 设备自身(0) 开关量输入(DI2) 烟感告警 闭合(0) 无告警 连接正常
// 测点配置(类型:开关量输入DI,地址:0,索引:2) 原始硬件描述:烟感告警
// #define SYSDESCR "1.3.6.1.4.1.50688.2.2.0.2.0"
/*
2、控制操作,使用 SET。
控制节点说明 OID 值 类型
主机自身的空调控制 1 1.3.6.1.4.1.50688.2.9.256.1.0 INTEGER
主机自身的空调控制 2 1.3.6.1.4.1.50688.2.9.256.2.0 INTEGER
主机自身的空调控制 3 1.3.6.1.4.1.50688.2.9.256.3.0 INTEGER
主机自身的空调控制 4 1.3.6.1.4.1.50688.2.9.256.4.0 INTEGER
*/
// 01 制冷模式、风速-自动、温度16℃、上下扫风、左右扫风
#define AirConditioning_DESCR "1.3.6.1.4.1.50688.2.9.256.1.0"
// 关机 63 可以在任何模式下学习 关空调
#define AirConditioning_CLOSE_DESCR "1.3.6.1.4.1.50688.2.9.256.63.0"
void get_system_descriptor() {
int status;//return status
//CTarget ctarget((IpAddress)"15.123.41.7", OctetStr("public"), OctetStr("private"));
CTarget ctarget((IpAddress)"15.123.41.7", "public", "private");
Vb vb(SYSDESCR);//SNMP++ variable Binding
Pdu pdu;//SNMP ++ pdu
//--------[Construct a SNMP++ SNMP Object--------------
Snmp::socket_startup();
Snmp snmp(status);//create a snmp session
if (status != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);//if fail,print error string
return;
}
//---------[Invoke a SNMP++ Get]------------------------
pdu += vb;//add the variable binding
if ((status = snmp.get(pdu, ctarget)) != SNMP_CLASS_SUCCESS)
{
cout << snmp.error_msg(status);
}
else {
pdu.get_vb(vb, 0);//extract the variable binding
cout << "System Descriptor = " << vb.get_printable_value();
}
//snmp.set(pdu, ctarget);
// int Snmp::set(Pdu &pdu, SnmpTarget &target)
//int Snmp::set(Pdu &pdu, SnmpTarget &target,
// const snmp_callback callback,
// const void * callback_data)
}
int main(int argc, char *argv[])
{
get_system_descriptor();
return 0;
}
注意:IP地址需要根据自己的snmp远程主机进行设置。 修改之前运行代码得到如下的结果: