Python pysnmp:在陷阱中发送十六进制字符串

Python pysnmp:在陷阱中发送十六进制字符串,python,snmp,net-snmp,pysnmp,Python,Snmp,Net Snmp,Pysnmp,我想要的是像我们的一个网络设备那样发送snmp陷阱。陷阱包含一个DataTime的名称值,它类似于十六进制字符串 e.g. 1.3.6.1.4.1.193.82.1.8.1.4.0 : 07:de:07:10:0a:0c:1e:00:2b:08:00 当我使用netsnmp的snmptrap命令发送陷阱时,我们的陷阱解码器可以成功地将十六进制字符串解析为dateandtime格式(YYYY-MM-HH HH:MM:ss),就像它从我们的网络设备得到了一个真正的陷阱一样 我使用的命令如下所示:

我想要的是像我们的一个网络设备那样发送snmp陷阱。陷阱包含一个DataTime的名称值,它类似于十六进制字符串

e.g. 1.3.6.1.4.1.193.82.1.8.1.4.0 : 07:de:07:10:0a:0c:1e:00:2b:08:00
当我使用
netsnmp
snmptrap
命令发送陷阱时,我们的陷阱解码器可以成功地将十六进制字符串解析为
dateandtime
格式(
YYYY-MM-HH HH:MM:ss
),就像它从我们的网络设备得到了一个真正的陷阱一样

我使用的命令如下所示:

sudo /usr/local/net-snmp/bin/snmptrap -v 2c -c LI_OSS 10.184.74.66:162 "" 1.3.6.1.4.1.193.82.2.0.1 1.3.6.1.4.1.193.82.1.8.1.4.0 x "07de07100a0c1e002b0800"
x
表示字符串“
07de07100a0c1e002b0800
”是某种十六进制格式

当我尝试使用pysnmp发送完成相同的任务时,我们的陷阱解码器程序确实收到了陷阱,但无法解析日期和时间。 这是我用来发送陷阱的代码,它是pysnmp的官方示例

我只修改了主机和以下部分:

ntfOrg.sendNotification(
    snmpEngine,
    # Notification targets
    'my-notification',
    # Trap OID (SNMPv2-MIB::coldStart)
    (1,3,6,1,4,1,193,82,2,0,1),
    # ( (oid, value), ... )
    (
      ('1.3.6.1.4.1.193.82.1.8.1.4.0', rfc1902.OctetString('07de07100a0c1e002b0800'))

)
)
为了找出差异,我捕获了使用WireShark使用
snmptrap
pysnmp
发送陷阱的包,下面是差异。请注意,我没有使用相同的陷阱OID,但现象保持不变

第一幅图是使用snmptrap发送陷阱,另一幅图是使用pysnmp时。 八进制字符串是完全不同的。 有人知道为什么会这样吗?在我的情况下,如何使用pysnmp发送陷阱?提前多谢!

您将ASCII字符串作为OctetString()对象初始化器传递。您应该向OctetString构造函数指示您的初始化器将被解释为十六进制字符串。这可以通过hexValue关键字参数完成。考虑:

>>> str(univ.OctetString('07de07100a0c1e002b0800'))
'07de07100a0c1e002b0800'
>>> str(univ.OctetString(hexValue='07de07100a0c1e002b0800'))
'\x07\xde\x07\x10\n\x0c\x1e\x00+\x08\x00'

您将ASCII字符串作为OctetString()对象初始化器传递。您应该向OctetString构造函数指示您的初始化器将被解释为十六进制字符串。这可以通过hexValue关键字参数完成。考虑:

>>> str(univ.OctetString('07de07100a0c1e002b0800'))
'07de07100a0c1e002b0800'
>>> str(univ.OctetString(hexValue='07de07100a0c1e002b0800'))
'\x07\xde\x07\x10\n\x0c\x1e\x00+\x08\x00'

您将ASCII字符串作为OctetString()对象初始化器传递。您应该向OctetString构造函数指示您的初始化器将被解释为十六进制字符串。这可以通过hexValue关键字参数完成。考虑:

>>> str(univ.OctetString('07de07100a0c1e002b0800'))
'07de07100a0c1e002b0800'
>>> str(univ.OctetString(hexValue='07de07100a0c1e002b0800'))
'\x07\xde\x07\x10\n\x0c\x1e\x00+\x08\x00'

您将ASCII字符串作为OctetString()对象初始化器传递。您应该向OctetString构造函数指示您的初始化器将被解释为十六进制字符串。这可以通过hexValue关键字参数完成。考虑:

>>> str(univ.OctetString('07de07100a0c1e002b0800'))
'07de07100a0c1e002b0800'
>>> str(univ.OctetString(hexValue='07de07100a0c1e002b0800'))
'\x07\xde\x07\x10\n\x0c\x1e\x00+\x08\x00'

在第二个屏幕截图中,编码字符串实际上是“07de07100a0c1e002b0800”的ASCII码。您无意中将字符串编码为字符串而不是字节序列。我不是python程序员,但您可能会使用类似于
rfc1902.OctetString('0x07de07100a0c1e002b0800')
的东西。我稍后会尝试您的建议并给出反馈。谢谢!在第二个屏幕截图中,编码的字符串实际上是“07de07100a0c1e002b0800”的ASCII码。您无意中将字符串编码为字符串而不是字节序列。我不是python程序员,但您可能会使用类似于
rfc1902.OctetString('0x07de07100a0c1e002b0800')
的东西。我稍后会尝试您的建议并给出反馈。谢谢!在第二个屏幕截图中,编码的字符串实际上是“07de07100a0c1e002b0800”的ASCII码。您无意中将字符串编码为字符串而不是字节序列。我不是python程序员,但您可能会使用类似于
rfc1902.OctetString('0x07de07100a0c1e002b0800')
的东西。我稍后会尝试您的建议并给出反馈。谢谢!在第二个屏幕截图中,编码的字符串实际上是“07de07100a0c1e002b0800”的ASCII码。您无意中将字符串编码为字符串而不是字节序列。我不是python程序员,但您可能会使用类似于
rfc1902.OctetString('0x07de07100a0c1e002b0800')
的东西。我稍后会尝试您的建议并给出反馈。谢谢