如何读取SNMP OID输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何读取SNMP OID输出相关的知识,希望对你有一定的参考价值。
我有一个快速的问题。它最有可能是用户错误,所以我在开始之前道歉。
我正在尝试为设备设置阈值,以便当我们的某台打印机处于某种状态时它会提醒我们。 (卡住了,没有碳粉,没有纸等)我找到了处理这种情况的特定油。 (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,这样我就可以设置阈值,这样当它看到时,例如,它会执行某个动作。
谢谢你的帮助!
你读错了。您收到的数据实际上应该被解释为一个位数组,并且在您的情况下,每个位都是它自己的特定警报值
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个)自己解析前两个和后两个,然后你得到实际的结果。
正如我所说,我所看到的并没有真正的标准,你必须使用它,直到你确定你知道如何发送数据以及如何解析数据。
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
以上是关于如何读取SNMP OID输出的主要内容,如果未能解决你的问题,请参考以下文章
什么是CISCO 设备oid?如何获取cisco设备各种OID
??????SNMP??????OID?????????????????????????????????????????????CPU??????????????????