C NET-SNMP 专门通过 MIB 名称获取和设置,而不是 OID
C NET-SNMP Get and Set specifically via MIB Name, Not OID
我已经用 C 编写并测试了通用 SNMP 客户端模块的软件以及使用该通用模块的实现。我无法通过传入 MIB 名称(例如 sysDescr)而不是 OID(例如 1.3.6.1.2.1.1.1)来获取工作请求。
当我将包含 OID 的字符数组传递给 _snmp_parse_oid()_ 而不是名称时,我成功了。
我已经检查了 MIB 文件以确保我使用了正确的名称。当我 运行 命令行 SNMP 转换名称时,它给我上面列出的 OID:
$ snmptranslate -m +<MIB File> -IR -On <MIB Name>
.#.#.#.#.#.#.#####.#.#.#.#.#.#
(在上面的命令中,我用 <MIB File>
替换了我的实际 mib 文件,用 <MIB Name>
替换了 mib 名称,用 #
从命令返回的 OID 编号字符)
以下是我的通用 SNMP get 函数的代码,假设返回值为 #define 数字,并且为了简洁起见我删除了一些错误处理:
/// @Synopsis Function to send out get request since the
/// SNMPOidData object has been setup
///
/// @Param oid_name String containing the OID to set
/// @Param value Value to set
///
/// @Returns Error
int snmpGet(SNMPAgent *this, char const * const oid_name, SNMPOidData * value)
{
netsnmp_pdu *pdu;
netsnmp_pdu *response;
netsnmp_variable_list *vars;
oid *retrieved_oid;
oidStruct oid_to_get;
int status = 0;
int result = ERROR_SUCCESS;
// Create the PDU for the data for our request
pdu = snmp_pdu_create(SNMP_MSG_GET);
oid_to_get.OidLen = MAX_OID_LEN; // Set max length
// Send out the request(s)
retrieved_oid = snmp_parse_oid(oid_name, oid_to_get.Oid, &oid_to_get.OidLen);
// Set the data
snmp_add_null_var(pdu, oid_to_get.Oid, oid_to_get.OidLen))
// Send the request out
status = snmp_synch_response(this->port.snmp_session_handle, pdu, &response);
if (STAT_SUCCESS == status)
{
if (SNMP_ERR_NOERROR == response->errstat)
{
vars = response->variables;
value->type = vars->type;
if (vars->next_variable != NULL)
{
// There are more values, set return type to null
value->type = ASN_NULL;
}
else if (!(CHECK_END(vars->type))) // Exception
{
result = ERROR_NOT_PRESENT;
fprintf(stderr, "Warning: OID=%s gets snmp exception %d \n",
oid_name, vars->type);
}
else if ((vars->type == ASN_INTEGER)
|| (vars->type == ASN_COUNTER)
|| (vars->type == ASN_UNSIGNED))
{
value->integer = *(vars->val.integer);
value->str_len = sizeof(value->integer);
}
else
{
value->str_len = vars->val_len;
if (value->str_len >= MAX_ASN_STR_LEN)
value->str_len = MAX_ASN_STR_LEN;
if (value->str_len > 0)
memcpy(value->string, vars->val.string, value->str_len);
// guarantee NULL terminated string
value->string[value->str_len] = '[=11=]';
}
}
}
this->freePDU(response); // Clean up: free the response
return result;
}
我得到的错误:
oid_name: Unknown Object Identifier (Sub-id not found: (top) -> <MIB Name>)
来自以下调用:
retrieved_oid = snmp_parse_oid(oid_name, oid_to_get.Oid, &oid_to_get.OidLen);
我已确保 MIB 文件位于机器上的配置位置(如果不是这种情况,snmptranslate 将无法工作)。
我在 Google 结果上花费了大量时间,并直接在 Stack Overflow 上进行搜索。
以下是一个很好的教程,但没有解决我的问题(他们直接引用他们想要获取值的 OID):
http://www.net-snmp.org/wiki/index.php/TUT:Simple_Application
任何帮助或见解将不胜感激。
我能想到的一些其他信息是,它正在 armv5tejl 目标上编译为 运行 运行ning Linux 通过以太网与外部设备通信。
谢谢,
当我通过字符串名称调用 MIB 变量时,我使用了以下 net-snmp 函数。
read_objid(OID, anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
其中:
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
在我的程序中,我将所有这些打包到一个函数调用中。
void packSingleGetOID(const char *OID, struct snmp_pdu *pdu){
// OID in / PDU out
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
read_objid(OID, anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
}
我传入 MIB OID 字符串和指向会话 pdu 的指针。请记住 OID 字符串是 MIB_Name::variable
。
我已经用 C 编写并测试了通用 SNMP 客户端模块的软件以及使用该通用模块的实现。我无法通过传入 MIB 名称(例如 sysDescr)而不是 OID(例如 1.3.6.1.2.1.1.1)来获取工作请求。
当我将包含 OID 的字符数组传递给 _snmp_parse_oid()_ 而不是名称时,我成功了。
我已经检查了 MIB 文件以确保我使用了正确的名称。当我 运行 命令行 SNMP 转换名称时,它给我上面列出的 OID:
$ snmptranslate -m +<MIB File> -IR -On <MIB Name>
.#.#.#.#.#.#.#####.#.#.#.#.#.#
(在上面的命令中,我用 <MIB File>
替换了我的实际 mib 文件,用 <MIB Name>
替换了 mib 名称,用 #
从命令返回的 OID 编号字符)
以下是我的通用 SNMP get 函数的代码,假设返回值为 #define 数字,并且为了简洁起见我删除了一些错误处理:
/// @Synopsis Function to send out get request since the
/// SNMPOidData object has been setup
///
/// @Param oid_name String containing the OID to set
/// @Param value Value to set
///
/// @Returns Error
int snmpGet(SNMPAgent *this, char const * const oid_name, SNMPOidData * value)
{
netsnmp_pdu *pdu;
netsnmp_pdu *response;
netsnmp_variable_list *vars;
oid *retrieved_oid;
oidStruct oid_to_get;
int status = 0;
int result = ERROR_SUCCESS;
// Create the PDU for the data for our request
pdu = snmp_pdu_create(SNMP_MSG_GET);
oid_to_get.OidLen = MAX_OID_LEN; // Set max length
// Send out the request(s)
retrieved_oid = snmp_parse_oid(oid_name, oid_to_get.Oid, &oid_to_get.OidLen);
// Set the data
snmp_add_null_var(pdu, oid_to_get.Oid, oid_to_get.OidLen))
// Send the request out
status = snmp_synch_response(this->port.snmp_session_handle, pdu, &response);
if (STAT_SUCCESS == status)
{
if (SNMP_ERR_NOERROR == response->errstat)
{
vars = response->variables;
value->type = vars->type;
if (vars->next_variable != NULL)
{
// There are more values, set return type to null
value->type = ASN_NULL;
}
else if (!(CHECK_END(vars->type))) // Exception
{
result = ERROR_NOT_PRESENT;
fprintf(stderr, "Warning: OID=%s gets snmp exception %d \n",
oid_name, vars->type);
}
else if ((vars->type == ASN_INTEGER)
|| (vars->type == ASN_COUNTER)
|| (vars->type == ASN_UNSIGNED))
{
value->integer = *(vars->val.integer);
value->str_len = sizeof(value->integer);
}
else
{
value->str_len = vars->val_len;
if (value->str_len >= MAX_ASN_STR_LEN)
value->str_len = MAX_ASN_STR_LEN;
if (value->str_len > 0)
memcpy(value->string, vars->val.string, value->str_len);
// guarantee NULL terminated string
value->string[value->str_len] = '[=11=]';
}
}
}
this->freePDU(response); // Clean up: free the response
return result;
}
我得到的错误:
oid_name: Unknown Object Identifier (Sub-id not found: (top) -> <MIB Name>)
来自以下调用:
retrieved_oid = snmp_parse_oid(oid_name, oid_to_get.Oid, &oid_to_get.OidLen);
我已确保 MIB 文件位于机器上的配置位置(如果不是这种情况,snmptranslate 将无法工作)。
我在 Google 结果上花费了大量时间,并直接在 Stack Overflow 上进行搜索。 以下是一个很好的教程,但没有解决我的问题(他们直接引用他们想要获取值的 OID): http://www.net-snmp.org/wiki/index.php/TUT:Simple_Application
任何帮助或见解将不胜感激。
我能想到的一些其他信息是,它正在 armv5tejl 目标上编译为 运行 运行ning Linux 通过以太网与外部设备通信。
谢谢,
当我通过字符串名称调用 MIB 变量时,我使用了以下 net-snmp 函数。
read_objid(OID, anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
其中:
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
在我的程序中,我将所有这些打包到一个函数调用中。
void packSingleGetOID(const char *OID, struct snmp_pdu *pdu){
// OID in / PDU out
oid anOID[MAX_OID_LEN];
size_t anOID_len = MAX_OID_LEN;
read_objid(OID, anOID, &anOID_len);
snmp_add_null_var(pdu, anOID, anOID_len);
}
我传入 MIB OID 字符串和指向会话 pdu 的指针。请记住 OID 字符串是 MIB_Name::variable
。