|
发表于 2013-8-28 10:55:17
|
显示全部楼层
我自己实现的代码,作为例子,system子树的MIB代码这样的:
////////////////////////////////////////////////////////////////////////////////
// sysDescr节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.1;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysDescr_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
unsigned len;
len = snmpIfPF.snmp.get_sysDescr(globalTextBuffer, SNMP_TEXT_LEN);
return mib_set_string(vobj, globalTextBuffer, len);
}
////////////////////////////////////////////////////////////////////////////////
// sysObjectID节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.2;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:Id;
// 新的类型定义:ASN_OID
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysObjectID_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
return mib_set_oid(vobj, snmpIfPF.snmp.sysObjectID->nodes, snmpIfPF.snmp.sysObjectID->len);
}
////////////////////////////////////////////////////////////////////////////////
// sysUpTime节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.3;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:TimeTicks;
// 新的类型定义:ASN_TIMETICKS
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysUpTime_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
return mib_set_integer(vobj, snmpIfPF.snmp.get_sysUpTime());
}
////////////////////////////////////////////////////////////////////////////////
// sysContact节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.4;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysContact_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
unsigned len;
len = snmpIfPF.snmp.get_sysContact(globalTextBuffer, SNMP_TEXT_LEN);
return mib_set_string(vobj, globalTextBuffer, len);
}
////////////////////////////////////////////////////////////////////////////////
// sysContact节点的SET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.4;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysContact_Set(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
snmpIfPF.snmp.set_sysContact(vobj->octet.ptr, vobj->octet.len);
return ERRSTAT_NOERROR;
}
////////////////////////////////////////////////////////////////////////////////
// sysName节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.5;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysName_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
unsigned len;
len = snmpIfPF.snmp.get_sysName(globalTextBuffer, SNMP_TEXT_LEN);
return mib_set_string(vobj, globalTextBuffer, len);
}
////////////////////////////////////////////////////////////////////////////////
// sysName节点的SET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.5;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysName_Set(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
snmpIfPF.snmp.set_sysName(vobj->octet.ptr, vobj->octet.len);
return ERRSTAT_NOERROR;
}
////////////////////////////////////////////////////////////////////////////////
// sysLocation节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.6;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysLocation_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
unsigned len;
len = snmpIfPF.snmp.get_sysLocation(globalTextBuffer, SNMP_TEXT_LEN);
return mib_set_string(vobj, globalTextBuffer, len);
}
////////////////////////////////////////////////////////////////////////////////
// sysLocation节点的SET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.6;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:OctetString (SIZE (0..255));
// 新的类型定义:ASN_OCTET
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysLocation_Set(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
snmpIfPF.snmp.set_sysLocation(vobj->octet.ptr, vobj->octet.len);
return ERRSTAT_NOERROR;
}
////////////////////////////////////////////////////////////////////////////////
// sysServices节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.1.7;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:Integer (0..127);
// 新的类型定义:ASN_INTEGER
////////////////////////////////////////////////////////////////////////////////
snmp_api_t sysServices_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
return mib_set_integer(vobj, snmpIfPF.snmp.get_sysServices());
}
////////////////////////////////////////////////////////////////////////////////
// snmpEnableAuthenTraps节点的GET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.11.30;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:Integer { enabled(1), disabled(2) };
// 新的类型定义:ASN_INTEGER
////////////////////////////////////////////////////////////////////////////////
snmp_api_t snmpEnableAuthenTraps_Get(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
// 注意:vobj指向的变量包含的是缓冲区指针和剩余字节数。
return mib_set_integer(vobj, 2);
}
////////////////////////////////////////////////////////////////////////////////
// snmpEnableAuthenTraps节点的SET方法,Usage是:Object;
// 该节点的完整标识符是:1.3.6.1.2.1.11.30;
// 属于这个模块:RFC1213-MIB; 状态是:Mandatory;
// 原始类型定义:Integer { enabled(1), disabled(2) };
// 新的类型定义:ASN_INTEGER
////////////////////////////////////////////////////////////////////////////////
snmp_api_t snmpEnableAuthenTraps_Set(const mib_leaf_t *leaf, oid_var_t *vname, snmp_var_t *vobj)
{
return ERRSTAT_READONLY;
}
////////////////////////////////////////////////////////////////////////////////
以上代码的函数框架由自己设计的MIB代码生成器生成(函数内容手工添加)。
除了这些MIB叶子节点的读取和写入函数,后台就是查找MIB树,BER编解码的基础功能了,这里只给点思路,具体实现还是建议你用现成的如microchip-snmp这些库。
uip或者lwip这些以太网协议栈就不多说了。 |
|