每次调试程序的时候,都需要一个真实的设备来做agent,当agent出问题的时候往往会影响项目进度,于是想能否找到一个windows上的替代品来做测试,只要有MIB就可以测试了。经过几个月摸索现在终于找到一个替代品,用net-snmp 的扩展agent方式。这里以v5.4.2.1作介绍(注意,有些版本在windows上编译会带来一些问题,我没有去细究)。
1. 要在windows上编译,请先下载ActivePerl,我这里用的是ActivePerl-5.10.0.1004-MSWin32-x86-287188.msi。下载,安装之后进入net-snmp目录下的win32子目录,敲入build(注意可能之前要提示的敲入vcvars32.bat),然后按照提示操作即可:
这里接受默认的安装路径,选项3保持不动,4也保持不动,把5,6选项值为enable,按数字5,6即可,然后按F键,程序开始编译。
2。编译完之后,进入c:/usr/bin目录,把你需要用来测试的的MIB文件放入share/snmp/mibs目录下,假设测试mib为DAP-2590.mib,我们要测试里面的lanIfSettingTable节点。定义如下:
DAP-2590-v111 DEFINITIONS ::= BEGIN
IMPORTS
private, IpAddress, TimeTicks FROM RFC1155-SMI
ifIndex FROM RFC1213-MIB
OBJECT-TYPE FROM RFC-1212
-- TruthValue FROM SNMPv2-TC
MacAddress FROM SNMPv2-TC
NOTIFICATION-TYPE FROM SNMPv2-SMI;
DisplayString ::= OCTET STRING
-- This data type is used to model textual information taken
-- from the NVT ASCII character set. By convention, objects
-- with this syntax are declared as having
--
-- SIZE(0..255)
enterprises OBJECT IDENTIFIER ::= { private 1 }
dlink OBJECT IDENTIFIER ::= { enterprises 171 }
dlink-products OBJECT IDENTIFIER ::= { 10 }
dlink-dwlfamily OBJECT IDENTIFIER ::= { dlink-products 37 }
-- dwlfamily means D-Link wireless family
dap2590 OBJECT IDENTIFIER ::= { dlink-dwlfamily 36 }
interface OBJECT IDENTIFIER ::= { dap2590 2 }
lan OBJECT IDENTIFIER ::= { interface 1 }
lanIfSetting OBJECT IDENTIFIER ::= { lan 1 }
lanIfSettingTable OBJECT-TYPE
SYNTAX SEQUENCE OF LanIfSettingEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
""
::= { lanIfSetting 1 }
lanIfSettingEntry OBJECT-TYPE
SYNTAX LanIfSettingEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
""
INDEX {ifIndex}
::= { lanIfSettingTable 1 }
LanIfSettingEntry
::= SEQUENCE
{
lanIfGetIpAddressFrom INTEGER,
lanIfIpAddress IpAddress,
lanIfSubnetMask IpAddress,
lanIfDefaultGateway IpAddress,
lanIfMacAddress MacAddress
}
lanIfGetIpAddressFrom OBJECT-TYPE
SYNTAX INTEGER {static(1), dynamic(2)}
ACCESS read-write
STATUS mandatory
DESCRIPTION
""
::= { lanIfSettingEntry 1 }
lanIfIpAddress OBJECT-TYPE
SYNTAX IpAddress
ACCESS read-write
STATUS mandatory
DESCRIPTION
""
::= { lanIfSettingEntry 2 }
lanIfSubnetMask OBJECT-TYPE
SYNTAX IpAddress
ACCESS read-write
STATUS mandatory
DESCRIPTION
""
::= { lanIfSettingEntry 3 }
lanIfDefaultGateway OBJECT-TYPE
SYNTAX IpAddress
ACCESS read-write
STATUS mandatory
DESCRIPTION
""
::= { lanIfSettingEntry 4 }
lanIfMacAddress OBJECT-TYPE
SYNTAX MacAddress
ACCESS read-only
STATUS mandatory
DESCRIPTION
""
::= { lanIfSettingEntry 5 }
打开share/snmp下的snmp.conf文件加入:
mibs +DAP-2590-v111
注意+后面跟的是MIB文件定义的module名称,而不是mib文件名。
然后敲入:
Snmptranslate -On -Tp DAP-2590-v111::lanIfSettingTalbe
注意,参数后面键入的module名称要区分大小写的。在mib2c中可以省去module名称DAP-2590-v111
mib2c -c mib2c-create-dateset.conf lanIfSettingTable
将产生lanIfSettingTable.c,lanIfSettingTable.h,修改lanIfSettingTable.c
void
initialize_table_lanIfSettingTable(void)
{
static oid lanIfSettingTable_oid[] = {1,3,6,1,4,1,171,10,37,36,2,1,1,1};
size_t lanIfSettingTable_oid_len = OID_LENGTH(lanIfSettingTable_oid);
netsnmp_table_data_set *table_set;
/* create the table structure itself */
table_set = netsnmp_create_table_data_set("lanIfSettingTable");
/* comment this out or delete if you don't support creation of new rows */
table_set->allow_creation = 1;
/***************************************************
* Adding indexes
*/
DEBUGMSGTL(("initialize_table_lanIfSettingTable",
"adding indexes to table lanIfSettingTable/n"));
netsnmp_table_set_add_indexes(table_set,
ASN_INTEGER, /* index: ifIndex */
0);
DEBUGMSGTL(("initialize_table_lanIfSettingTable",
"adding column types to table lanIfSettingTable/n"));
netsnmp_table_set_multi_add_default_row(table_set,
COLUMN_LANIFGETIPADDRESSFROM, ASN_INTEGER, 1,
NULL, 0,
COLUMN_LANIFIPADDRESS, ASN_IPADDRESS, 1,
NULL, 0,
COLUMN_LANIFSUBNETMASK, ASN_IPADDRESS, 1,
NULL, 0,
COLUMN_LANIFDEFAULTGATEWAY, ASN_IPADDRESS, 1,
NULL, 0,
COLUMN_LANIFMACADDRESS, ASN_OCTET_STR, 0,
NULL, 0,
0);
/* registering the table with the master agent */
/* note: if you don't need a subhandler to deal with any aspects
of the request, change lanIfSettingTable_handler to "NULL" */
netsnmp_register_table_data_set(netsnmp_create_handler_registration("lanIfSettingTable", NULL,
lanIfSettingTable_oid,
lanIfSettingTable_oid_len,
HANDLER_CAN_RWRITE),
table_set, NULL);
/*
* Finally, this actually allows the "add_row" token it the
* * snmpd.conf file to add rows to this table.
* * Example snmpd.conf line:
* * add_row netSnmpIETFWGTable eos "Glenn Waters" "Dale Francisco"
*/
netsnmp_register_auto_data_table(table_set, NULL);//注意添加上这一句,它是从snmpd.conf中读取table信息。snmpd.conf文件在哪里?就在刚刚提到的snmp.conf同层目录下,没有自己可创建一个,文本格式。在该文件中加入:
add_row lanIfSettingTable 1 1 192.168.0.20 255.255.255.0 192.168.0.1 0x001122ff4455
add_row lanIfSettingTable 2 2 192.168.0.21 255.255.255.0 192.168.0.1 0x001122ff4456
这样就有两行数据了,
}
同时在snmpd.conf中加入:
# This section defines who is allowed to talk to your running
# snmp agent.
# rocommunity: a SNMPv1/SNMPv2c read-only access community name
# arguments: community [default|hostname|network/bits] [oid]
rocommunity public
# rwcommunity: a SNMPv1/SNMPv2c read-write access community name
# arguments: community [default|hostname|network/bits] [oid]
rwcommunity private
设定v2c,v1的community string.
最后按照net-snmp手册添加lanIfSettingTable.c,lanIfSettingTable.h,之后用vc6分别打开netsnmpmibs,snmpd
然后将产生的snmpd.exe替换掉c:/usr/bin目录下同名文件即可,运行:
snmpd -d
snmptable -v2c -c public localhost lanIfSettingTable
成功!