我添加SNMP以太网类MIB变量,以我们现有的SNMP C ++代码库,并做了第一次。
我现在面临的困难是了解MIB变量的数据类型,并将其映射到C ++数据类型 - 例如dot3StatsIndex MIB变量语法InterfaceIndex是什么呢等同数据类型在C ++中。
自从我采取了第一次或者更确切地说,是在学习阶段 - 请让我知道什么是不同的ASN.1数据类型,以及他们是否都在上面列出的类型以及如何映射到C ++数据类型?
另外如何从RFC导出MIB变量的数据类型?
我想,如果你只是按照类型继承链中,你最终用碱SNMP类型应该映射到你的类型。
对于InterfaceIndex
,看到哪些MIB它是进口的(它的IF-MIB
):
IMPORTS
MODULE-IDENTITY, OBJECT-TYPE, OBJECT-IDENTITY,
Integer32, Counter32, Counter64, mib-2, transmission
FROM SNMPv2-SMI
MODULE-COMPLIANCE, OBJECT-GROUP
FROM SNMPv2-CONF
TruthValue
FROM SNMPv2-TC
ifIndex, InterfaceIndex
FROM IF-MIB;
然后找到其应该引用一个基本类型(它Integer32
这可能映射到ASN1_INT
)的定义。
InterfaceIndex ::= TEXTUAL-CONVENTION
DISPLAY-HINT "d"
STATUS current
DESCRIPTION
"A unique value, greater than zero, for each interface or ...
network management system to the next re-initialization."
SYNTAX Integer32 (1..2147483647)
在我的C ++ SNMP代理,我写的东西像下面(不幸的是,实际的源代码不再提供给我,我敢肯定有更多的选择,但你的想法):
using varbind_val_t = std::variant<
// ASN.1 INTEGER, SMIv2 Integer32
int32_t,
// ASN.1 OCTET STRING
std::string,
// ASN.1 OBJECT IDENTIFIER
oid_t,
// RFC4001 InetAddressType (TextualConvention)
IpAddress::Type, // enum saying IPv4 or IPv6
// RFC4001 InetAddress (TextualConvention)
IpAddress, // can be an IPv4 or IPv6 address
// SMIv2 IpAddress
ipv4_t,
// ASN.1 MacAddress (TextualConvention)
mac_address_t,
// SMIv2 Counter32/Gauge32/TimeTicks/Unsigned32
uint32_t,
// SMIv2 Counter64
uint64_t
>;
当建立或接收的PDU,该变体的有关访问者将编码或从上面给出的C ++类的值进行解码的给定值的线表示。有时,这是一个非常薄的包装(整数是一个整数!),有时它需要多一点的工作(oid_t需要展开)。这是非常快速和灵活。问题的关键是,映射是完全由你 - 尽量挑选具有相同范围的可能值的类型,否则你可能会沿途某处丢失信息。但没有“的” C ++类型ASN.1或SMIv2的类型的映射。
任何文本的约定如InterfaceIndex
不是真正的类型,但线索SNMP管理者就如何代表某些字段。对于那些不包括在上述列表中作为特殊情况,我只是用实际的基础类型的,在这种情况下,作为显示伊利亚,Integer32
。你可以阅读的MIB追查一下这些东西的真正含义是(或使用经理像iReasoning这不告诉你的一个相当不错的工作)。
您应参照相关规范,以确定您需要支持哪些类型: