如何以空值正确响应 SNMP (2c) GetRequest?

How can I properly respond with a null value to an SNMP (2c) GetRequest?

我正在为传感器产品开发 SNMP (2c) 代理。我只是在学习 SNMP 和 MIB 格式,并努力表示可能未知的特定值。

例如,我将温度 OBJECT-TYPE 定义为 Integer32,但有时该值不可用或未知。如果我以空值响应,则 SNMP 管理器超时*。当温度值未知或不可用时,我更愿意使用空值,而不是就某些特定值达成一致。

这让我想到以下问题:

  1. SNMP v2c/MIB 是否支持类似于可为空整数的数据类型?
  2. 如果是这样,在 MIB 中表示它的正确方法是什么?

* 我正在使用MG-SOFT's MIB Browser to get values as a testing method. If the value is null, it times out (even though the agent responded). If the value is an integer, it works as expected. I am using nSoftware IP*Works! SNMP library开发代理。

在试验中,我在动态更改 SNMP 代理对象类型方面取得了一些成功:

int? temperature = ReadTemperature();
snmpAgent.Objects[i].Value = temperature.ToString();
snmpAgent.Objects[i].ObjectType = temperature.HasValue ? SNMPObjectTypes.otInteger : SNMPObjectTypes.otNull;

使用 MIB 浏览器执行 GetRequest 时,它似乎可以处理这两种情况。即使 MIB 没有指定特定的 OID 可以为空,只是 SYNTAX Integer32,它似乎可以工作。不同的 SNMP 管理器可能会有不同的行为。

(此示例特定于 IPWorks SNMP 代理。)

发帖来自评论:

你不应该这样做。 OID 值应该始终是单数的,它们不应该动态更改,如果有人为此使用 mibfile,那么对于正在为此传感器实施通信协议的人来说,这将是不正确和误导的。正确的做法是有 2 个 OID,一个是传感器的值,另一个是传感器的状态。