SNMP++: Transport is not supported

时间:2022-07-24
本文章向大家介绍SNMP++: Transport is not supported,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

SNMP++: Transport is not supported

在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远程主机进行设置。 修改之前运行代码得到如下的结果:

参考资料