如何读取SNMP OID输出

问题描述 投票:4回答:2

我有一个快速的问题。它最有可能是用户错误,所以我在开始之前道歉。

我正在尝试为设备设置阈值,以便当我们的某台打印机处于某种状态时它会提醒我们。 (卡住了,没有碳粉,没有纸等)我找到了处理这种情况的特定油。 (1.3.6.1.2.1.25.3.5.1.2.1)特定的oid在HOST-RESOURCE-MIB下称为hrPrinterDetectedErrorState。我已经确认我可以通过SNMPWALK查看oid。我的问题是将数据解释出来。我在MIB中读到的内容以及我通过SNMPWALK看到的内容是不同的。

以下是MIB中oid的描述:

     "This object represents any error conditions detected
      by the printer.  The error conditions are encoded as
      bits in an octet string, with the following
      definitions:

            Condition        Bit #

            lowPaper              0

            noPaper              1
            lowToner              2
            noToner              3
            doorOpen              4
            jammed                5
            offline              6
            serviceRequested      7
            inputTrayMissing      8
            outputTrayMissing    9
            markerSupplyMissing  10
            outputNearFull      11
            outputFull          12
            inputTrayEmpty      13
            overduePreventMaint  14

      Bits are numbered starting with the most significant
      bit of the first byte being bit 0, the least
      significant bit of the first byte being bit 7, the
      most significant bit of the second byte being bit 8,
      and so on.  A one bit encodes that the condition was
      detected, while a zero bit encodes that the condition
      was not detected.

      This object is useful for alerting an operator to
      specific warning or error conditions that may occur,
      especially those requiring human intervention."

奇怪的是,SNMPWALK说oid是一个Hex-String,而MIB指定它应该是一个Octet-String。两者有什么不同?我是否需要以某种方式转换SNMPWALK输出的数据以使其与MIB所说的相匹配?

为了测试一切,我将打印机放入几个不同的“状态”。然后我在设备上运行SNMPWALK以查看oid输出。结果如下。正如您将看到的,这些结果与MIB指定的结果不匹配。

Case 1: Opened the toner door

Expected Output based on MIB: 4
SNMP Output: 08

Case 2: Removed Toner & Closed the door

Expected Output based on MIB:  1
SNMP Output:  10

Case 3: Placed 1 sheet of paper and printed a 2 page document. The printer ran out of paper.

Expected Output based on MIB: 0 or 1
SNMP Output: @

我对输出感到困惑。我只需要知道如何读取oid,这样我就可以设置阈值,这样当它看到时,例如,它会执行某个动作。

谢谢你的帮助!

printing snmp mib oid
2个回答
3
投票

你读错了。您收到的数据实际上应该被解释为一个位数组,并且在您的情况下,每个位都是它自己的特定警报值

Expected Output based on MIB: 4
SNMP Output: 08

你实际上得到了输出:

00001000 00000000

这里的第一个字节涵盖了这些值

lowPaper             0
noPaper              1
lowToner             2
noToner              3
doorOpen             4
jammed               5
offline              6
serviceRequested     7

所以lowpaper是0位,nopaper是bit 1,lowtoner是bit2等,而dooropen是bit 4,你可以看到该位设置为1表示门是打开的。

编辑:

这非常依赖于设备和实现。要知道如何正确解析它涉及大量的反复试验(至少根据我的经验)。作为一个例子,如果你回到消息9104,这可能是

91 and 04 are separate so you first translate 91 to binary from hex and then the 
same thing with 04
91: 10010001
04: 00000100

这意味着低纸,noToner,服务请求和inputTrayEmpty。这似乎是最有效的方式。

如果你只返回一个字节,则意味着你应该只查找前8位的警报。作为一个你需要注意的事情的例子:如果唯一的警报是门打开你可能只回到08但它实际上是0008其中前2个十六进制字符实际上是警报的第二部分但不是显示是因为它们不存在。所以在你的情况下,你实际上首先必须切换字节(如果有4个)自己解析前两个和后两个,然后你得到实际的结果。

正如我所说,我所看到的并没有真正的标准,你必须使用它,直到你确定你知道如何发送数据以及如何解析数据。


1
投票

Powershell函数用于解释hrPrinterDetectedErrorState octetstring(sharpsnmplib是否执行此操作?编辑:您需要专业版)。

[flags()] Enum hrPrinterDetectedErrorState
{
  lowPaper            = 0x8000
  noPaper             = 0x4000
  lowToner            = 0x2000
  noToner             = 0x1000
  doorOpen            = 0x0800
  jammed              = 0x0400
  Offline             = 0x0200
  serviceRequested    = 0x0100

  inputTrayMissing    = 0x0080
  outputTrayMissing   = 0x0040
  markerSupplyMissing = 0x0020
  outputNearFull      = 0x0010
  outputFull          = 0x0008
  inputTrayEmpty      = 0x0004
  overduePreventMaint = 0x0002
  notUsed             = 0x0001
}

function snmpmessage($data) {

  $bytes = [byte[]][char[]]$data

  $code = [int]$bytes[0]
  $code = $code -shl 8

  if ($bytes[1]) { $code = $code + $bytes[1] }

  [hrPrinterDetectedErrorState]$code

}

PS C:\> snmpmessage -join [char[]](0x91,0x04)
inputTrayEmpty, serviceRequested, noToner, lowPaper
© www.soinside.com 2019 - 2024. All rights reserved.