2011-05-11 269 views
0

我正在嘗試使用SNMP從打印機獲取數據。如果我關閉和打開打印機,我需要的OID是get.1.3.6.1.2.1.43.18.1.1.8.1.1。每次打印機發生「暫停」,缺紙或卡紙等「事件」時,我想要的數據的OID都會增加。處理遞增的SNMP 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行爲,但我想知道人們在這些情況下建議我如何以編程方式獲取打印機狀態?

回答

3

是的,這是正常的,你是retreiving從警報表中的行:

隨便看看的MIB:

enter image description here

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:其次

1 prtAlertDescription:在hrDeviceIndex其次

1:在prtAlertIndex這是該行。

建議您可以找到一個名爲snmpsharpnet的程序集,這對於使用.NET開發SNMP非常有幫助。

+0

我實際上已經在使用snmpsharp了。但打印機只支持SNMP v1,這是否意味着我不能做GetBulk? – omatase 2011-05-11 19:59:07

+0

是Get-Bulk僅在SNMPV2c上可用。所以你必須從第一個冒號 – JPBlanc 2011-05-11 20:12:49

+0

開始編程散步(看看下一個),我認爲這可能是最好的,然後在獲得增量值之前,直到我點擊某個東西。我開始的地方,但至少我知道那裏沒有更好的選擇。 – omatase 2011-05-11 20:30:43

1

看起來您的打印機正在存儲一個狀態列表。您必須從OID .1.3.6.1.2.1.43.18.1.1.8.1.1開始批量啓動,並使用組中最後一個變量綁定。

+0

這相當於在遞增OID的最後一位時重複執行Get操作嗎?我之前沒有聽說過Get Bulk,但是在研究它的時候,聽起來就像它在引擎蓋下做的那樣。您提供了一個代表最大隱式GetNext調用的數字,並且直到它找到一個值或直到它達到指定的最大數量爲止。 – omatase 2011-05-11 17:22:47

+0

如果您使用的是SNMP v2,則獲取批量PDU允許在一次操作中從表中獲取一堆值。如果表對於一個數據報而言太大,則可能需要發送多個獲取批量請求。 – Olaf 2011-05-11 17:28:34