1

我正在尝试用 Java 实现 SNMP 代理。我使用 snmp4j 库(http://www.snmp4j.org/)。目前,我的代理在 localhost/4700 上工作。由于以下请求,我尝试发送 snmpget 请求:

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1

但我只得到类似“此 OID 中当前不存在此类实例”的信息 这是我的问题:我不知道如何创建一个。我试图向我的 MOTable 添加行,但它似乎不起作用。

这是我的班级实现 MOGRoup 的总结

public class MyMIB 
//--AgentGen BEGIN=_EXTENDS
//--AgentGen END
implements MOGroup 
//--AgentGen BEGIN=_IMPLEMENTS
//--AgentGen END
{
    .
    .
    .

public static final OID oidTableEntry = 
    new OID(new int[] { 1,3,6,1,4,1,1,99,5,4,1,3,1 });
    .
    .
    .

private void createTableEntry(MOFactory moFactory) {
// Index definition
    .
    .
    .

// Table model
tableEntryModel = 
  moFactory.createTableModel(oidTableEntry,
                         tableEntryIndex,
                         tableEntryColumns);
((MOMutableTableModel)tableEntryModel).setRowFactory(
  new TableEntryRowFactory());
tableEntry = 
  moFactory.createTable(oidTableEntry,
                    tableEntryIndex,
                    tableEntryColumns,
                    tableEntryModel);

//Adding rows
ArrayList<Integer> oidMon1List= new ArrayList<Integer>();
oidRow1List = this.getListFromArray(oidTableEntry.getValue());
oidRow1List.add(1);

ArrayList<Integer> oidMon2List= new ArrayList<Integer>();
oidRow2List = this.getListFromArray(oidTableEntry.getValue());
oidRow2List.add(2);

DefaultMOMutableTableModel model =
               (DefaultMOMutableTableModel)tableEntry.getModel();

synchronized(model){
model.addRow(
        model.createRow(
                new OID(getArrayFromList(oidRow1List)), 
                new Variable[]{
                    new Integer32(123)
                    }));

model.addRow(
        model.createRow(
                new OID(getArrayFromList(oidRow2List)), 
                new Variable[]{
                    new Integer32(456)
                    }));   
    }
}

但是下面的请求仍然不起作用。

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1.0

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1.1

我一定不明白如何正确地创建行。你能解释一下我应该怎么做吗?

非常感谢你 !

稍微精确一点:我将这些行添加到我的程序中:

System.out.println("Get row count: " +tableEntryModel.getRowCount());

//first row
System.out.println("TEST1: " +model.getRow(new OID(new int[] {1,3,6,1,4,1,1,99,5,4,1,3,1,1})).getValue(0));
System.out.println("TEST2: " +tableEntry.getValue(new OID(new int[] {1,3,6,1,4,1,1,99,5,4,1,3,1,1,0})));

第一个返回:2(如预期的那样)

第二个返回:123(如预期)

第三个返回:null...在这里,我不明白为什么!

4

2 回答 2

3

我会说,代码和请求不匹配。我猜代码是问题所在,因为在 SNMP4J-Agent 中,表单元格的实例 OID 是由

<tableEntryOID>.<columnSubID>.<rowIndexOID>

因此,如果您的表对象的 OID 为 1.3.6.1.4.1.1.99.5.4.1.3.1 并且您希望第一列中的第一个实例的 ID 为 1,那么您必须创建/添加行:

model.addRow(       
    model.createRow(       
            new OID(1), new Variable[]{ new Integer32(123) })); 

然后可以使用以下方法检索此单元格

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1.1
于 2012-10-14T11:12:41.507 回答
0

好的,我发现了问题所在。实际上,我的代码有效,只是我的请求不正确。

                                        | oidColumn 1.3.6.1.4.1.1.99.5.4.1.3.1.1
 oidRow1 1.3.6.1.4.1.1.99.5.4.1.3.1.1   |       oidColumn.oidRow1
 oidRow2 1.3.6.1.4.1.1.99.5.4.1.3.1.2   |       oidColumn.oidRow2

所以如果我想获得 Row1 的第一个值,我必须提出这个请求:

snmpget -v2c -c public localhost:4700 1.3.6.1.4.1.1.99.5.4.1.3.1.1.1.3.6.1.4.1.1.99.5.4.1.3.1.1
于 2012-08-31T08:01:41.353 回答