我需要一个关于如何让它发挥作用的建议。
我们有一台打印服务器,它有一些“pcl 到 pdf”转换器应用程序,该应用程序监听端口 9001,收集 PCL 作业并从 PCL 创建 PDF。问题是 pcl 到 pdf 应用程序不支持 SNMP。由于所有这些都发生在 citrix 环境中,citrix 使用 snmp 协议来查询打印机状态。由于 IT 限制,我们无法在 citrix 中禁用 SNMP。由于所有这些原因,该打印机被报告为所有用户都处于脱机状态,无法使用。
当我们将数据包捕获放到机器上时,我们会看到一些打印机陷阱/oid:
1.3.6.1.2.1.25.3.2.1.5.1
1.3.6.1.2.1.25.3.5.1.1.1
1.3.6.1.2.1.25.3.5.1.2.1
如果我们能够以某种方式模拟打印机对上述 OID 上的 snmp 查询的响应,那么我们的问题就可以得到解决。
有什么建议么?
答案1
我设法找到了解决我的问题的方法。
我下载了#SNMP(基于 C# 的开源 SNMP)其中包含 SNMPD 项目(SNMP 代理),然后我编写了几个处理我必须响应的 OID 的类。
基于:http://www.oid-info.com/get/1.3.6.1.2.1.25.3.2.1.5
public class hrDeviceStatus : ScalarObject
{
private readonly Integer32 _value = new Integer32(2); // running 2
public hrDeviceStatus()
: base(new ObjectIdentifier("1.3.6.1.2.1.25.3.2.1.5.1"))
{
}
public override ISnmpData Data
{
get
{
return _value;
}
set { }
}
}
基于:http://www.oid-info.com/get/1.3.6.1.2.1.25.3.5.1.1
public class hrPrinterStatus : ScalarObject
{
private readonly Integer32 _value = new Integer32(1); // other
public hrPrinterStatus()
: base(new ObjectIdentifier("1.3.6.1.2.1.25.3.5.1.1.1"))
{
}
public override ISnmpData Data
{
get
{
return _value;
}
set { }
}
}
基于:http://www.oid-info.com/get/1.3.6.1.2.1.25.3.5.1.2
public class hrPrinterDetectedErrorState : ScalarObject
{
private readonly OctetString _value = new OctetString("\0\0"); // all 16 bits set to 0
public hrPrinterDetectedErrorState()
: base(new ObjectIdentifier("1.3.6.1.2.1.25.3.5.1.2.1"))
{
}
public override ISnmpData Data
{
get
{
return _value;
}
set { }
}
}
然后我将它们添加到对象存储中。
var store = Container.Resolve<ObjectStore>();
store.Add(new hrDeviceStatus());
store.Add(new hrPrinterStatus());
store.Add(new hrPrinterDetectedErrorState());
就这样。感谢所有提供帮助的人。