В моем 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 , который довольно неплохо говорит вам).
Вам следует обратиться к соответствующим спецификациямчтобы определить, какие типы вам нужно поддерживать: