【问题标题】:Dealing with an incrementing SNMP OID?处理递增的 SNMP OID?
【发布时间】:2011-05-11 15:25:00
【问题描述】:

我正在尝试使用 SNMP 从打印机获取数据。如果我关闭再打开打印机,我需要get 的 OID 是.1.3.6.1.2.1.43.18.1.1.8.1.1。每次打印机发生“事件”时,例如暂停、缺纸或卡纸,我想要的数据的 OID 就会增加。

例如,我打开打印机并查询.1.3.6.1.2.1.43.18.1.1.8.1.1.,我得到“暂停”作为值。我取消暂停打印机并从打印机中取出所有纸张,为了获得“添加纸张”消息,我必须查询 .1.3.6.1.2.1.43.18.1.1.8.1.2

我不知道这是否是正常的 SNMP 行为,但我想知道人们建议我在这些情况下如何以编程方式获取打印机状态?

【问题讨论】:

    标签: c# snmp


    【解决方案1】:

    是的,您从警报表中检索行是正常的:

    看看 mib 吧:

    mib对应的文本部分是(from RFC 1759):

    prtAlertTable OBJECT-TYPE
        SYNTAX     SEQUENCE OF PrtAlertEntry
        MAX-ACCESS not-accessible
        STATUS     current
        DESCRIPTION
            ""
        ::= { prtAlert 1 }
    
    prtAlertEntry OBJECT-TYPE
        SYNTAX     PrtAlertEntry
        MAX-ACCESS not-accessible
        STATUS     current
        DESCRIPTION
            "Entries may exist in the table for each device
            index who's device type is `printer'."
        INDEX  { hrDeviceIndex, prtAlertIndex }
        ::= { prtAlertTable 1 }
    
    PrtAlertEntry ::= SEQUENCE {
        prtAlertIndex               Integer32,
        prtAlertSeverityLevel       INTEGER,
        prtAlertTrainingLevel       INTEGER,
        prtAlertGroup               INTEGER,
        prtAlertGroupIndex          Integer32,
        prtAlertLocation            Integer32,
        prtAlertCode                INTEGER,
        prtAlertDescription         OCTET STRING,
        prtAlertTime                TimeTicks
    }
    

    所以 SNMP 的工作方式是通过行索引为 MIB 的 OID 条目添加后缀。您可以通过 Get-Bulk 获取整个表,但我认为您首先要了解如何检索 SNMP 表。

    在您的确切情况下:1.3.6.1.2.1.43.18.1.1.8.1.1 您必须将其阅读为:

    1.3.6.1.2.1.43.18.1.1.8:prtAlertDescription 后跟

    1 : hrDeviceIndex 后跟

    1 : prtAlertIndex 是行。

    您可以找到一个名为 snmpsharpnet 的程序集,这对于在 .NET 上使用 SNMP 非常有帮助。

    【讨论】:

    • 我实际上已经在使用 snmpsharp 了。打印机只支持 SNMP v1,这是否意味着我不能做 GetBulk?
    • 是 Get-Bulk 仅在 SNMPV2c 上可用。所以你必须从第一个冒号开始编写一个walk,(看看get-next)
    • 好的,我认为最好只做一个 Get 递增值,直到我遇到什么。有点像我开始的地方,但至少我知道没有更好的选择。
    • 我编辑答案值得您投票,多解释一下您提供的 OID。但是对不起,我不会在您的评论中验证您的结论。 阅读 prtAlertIndex 的 MIB 描述,因为您可能会有疑问(我更新了 ce RFC 链接的答案)
    • 感谢您的回复。我在那个 RFC 中阅读了 prtAlertIndex 的描述。阅读这对我很有用。它看起来仍然像连续检查每个 OID(例如 1.3.6.1.2.1.43.18.1.1.8.1.1、1.3.6.1.2.1.43.18.1.1.8.1.2、1.3.6.1.2.1.43.18.1.1.8.1 .3 等)直到我找到命中是我可以采取的唯一途径,因为我无法访问我的特定打印机的 prtAlertIndex 值(1.3.6.1.2.1.43.18.1.1.1)。当我尝试查询该 OID 时,我收到一条错误消息“没有这样的名称”。
    【解决方案2】:

    您的打印机似乎正在存储状态列表。您必须从 OID .1.3.6.1.2.1.43.18.1.1.8.1.1 开始批量获取并使用组中的最后一个变量绑定。

    【讨论】:

    • 这是否等同于在递增 OID 的最后一位时重复执行 Get?我以前没有听说过 Get Bulk,但在调查它时,它听起来就像它在引擎盖下所做的那样。您向它提供一个数字,该数字表示要进行的最大隐式 GetNext 调用,它会一直执行此操作,直到找到一个值或达到指定的最大数字为止。
    • 如果您使用的是 SNMP v2,获取批量 PDU 允许在一次操作中从表中获取一堆值。如果表对于一个数据报来说太大,您可能需要发送多个批量获取请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多