当前位置: 首页 > 知识库问答 >
问题:

将mule消息有效负载转换为snmp陷阱或pdu对象

长孙景焕
2023-03-14

我已经应用了一个使用snmp4j发送和接收陷阱的示例,一切都很好。
但问题是:
当使用mule esb接收snmp陷阱时,我无法将传入的消息有效负载转换为PDU(或任何snmp4j合适的对象)以从中提取数据,我已经做了很多搜索,但徒劳无功。
有人能帮助我:
将我从udpendpoint收到的mule esb消息有效负载转换为org.snmp4j。从PDU对象中提取陷阱数据吗?
这是我的代码:

public synchronized MuleEvent process(MuleEvent event) throws MuleException {
        byte[] encodedMessage = event.getMessage().getPayload(byte[].class);
        //next line is not working but its only sample of what I Am looking for 
        PDU pdu = new PDU(encodedMessage );
.....

共有3个答案

水渊
2023-03-14

您需要创建一个自定义转换器来转换相关SNMP4J对象中的消息有效负载。或者,如果SNMP4J API足够简单,这可以使用表达式转换器来完成。

傅穆冉
2023-03-14

当您实现自己的TransportMapping并将其与SNMP4J MessageDispatcherImpl关联时,可以更轻松地将BER流转换为SNMP4J PDU。然后将所有必要的MessageProcessingModels和SecurityProtocols添加到消息调度程序。

最后,将CommandResponder接口的实现添加到消息调度程序中,就完成了。

苗阳文
2023-03-14
public class SNMP4JParser implements Callable {

    /**
     * The following objects are all necessary in order to use SNMP4j as a parser for raw messages.
     * This was all inspired by SNMP4j source code, in particular MessageDispatcherImpl.java
     */
    private MessageProcessingModel model = null;
    private MessageDispatcher dispatcher = null;
    private Address listenAddress = null;
    private Integer32 messageProcessingModel = null;
    private Integer32 securityModel = null;
    private OctetString securityName = null;
    private Integer32 securityLevel = null;
    private PduHandle handle = null;
    private StatusInformation statusInfo = null;
    private MutableStateReference mutableStateReference = null;

    /**
     * Taken from org.snmp4j.transport.AbstractTransportMapping class
     */
    protected Integer32 maxInboundMessageSize = new Integer32 ( (1 << 16) - 1 );

    /**
     * Taken from org.snmp4j.MessageDispatcherImpl class
     */
    private int transactionID = new Random().nextInt(Integer.MAX_VALUE - 2) + 1;

    /**
     * Create all objects that SNMP4j needs to parse a raw SNMP message
     */
    public SNMP4JParser()
    {
        model = new MPv1();
        dispatcher = new MessageDispatcherImpl();
        listenAddress = GenericAddress.parse("udp:0.0.0.0/2001");
        messageProcessingModel = new Integer32();
        securityModel = new Integer32();
        securityName = new OctetString();
        securityLevel = new Integer32();
        handle = new PduHandle(transactionID);
        statusInfo = new StatusInformation();
        mutableStateReference = new MutableStateReference();
    }

    /**
     * @see org.mule.api.lifecycle.Callable#onCall(org.mule.api.MuleEventContext)
     */
    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception
    {
        byte[] payloadBytes = eventContext.getMessage().getPayloadAsBytes();
        ByteBuffer buffer = ByteBuffer.wrap(payloadBytes);
        BERInputStream wholeMessage = new BERInputStream(buffer);
        MutablePDU mutablePdu = new MutablePDU();

        int status = model.prepareDataElements(
                dispatcher, 
                listenAddress, 
                wholeMessage,
                messageProcessingModel, 
                securityModel,
                securityName, 
                securityLevel, 
                mutablePdu,
                handle, 
                maxInboundMessageSize, 
                statusInfo,
                mutableStateReference);

        if ( status !=  SnmpConstants.SNMP_MP_OK )
            throw new RuntimeException(
                "Couldn't parse SNMP message. model.prepareDataElements() returned " + status);

        return mutablePdu.getPdu();
    }

}

我用这样的流对其进行了测试(我使用了snmp4j-1.11.5和mule-standalone-3.4.0)

<udp:connector name="connector" doc:name="UDP"/>
<flow name="snmp-demo-trapHandlingFlow" doc:name="snmp-demo-trapHandlingFlow">
    <udp:inbound-endpoint host="0.0.0.0" port="2001" responseTimeout="10000"  doc:name="UDP"/>
    <logger message="TRAP RECEIVED - #[System.currentTimeMillis()]" level="DEBUG" doc:name="Inbound timestamp"/>
    <component class="com.netboss.flow.demo.SNMP4JParser" doc:name="SNMP4JParser"/>
    [...]

它的工作原理。

现在,我意识到还有一些悬而未决的问题:

  1. 有没有更好/更有效的方法
 类似资料:
  • 我正在使用apache camel(Fuse 2.10.x)和soap over http和soap over JMS。JMS消息由对象消息转换为字节消息格式,这就造成了消息读取的问题。 我正在JBoss5.0GA环境中使用用于websphere MQ的JNDI连接。 我们遇到了IBM属性的另一个问题,通过删除属性解决了这个问题。我们还有camel header属性来设置消息

  • 我在Python3中收到了一条SNMP陷阱消息,得到了一个十六进制数。 如何将其转换为字符串以便查看? 接收数据(十六进制) B'0E\x02\x01\x01\x04\x06404040\xa78\x02\x04\x00\xf6\x17~\x02\x01\x00\x02\x01\x000*0\x0f\x06\x08\x06\x01\x02\x01\x01\x03\x00C\x03\x01k0\x1

  • 我对SNMP相当陌生,我使用snmp4j库在java中创建了一个SNMP代理。在我的代码中,我添加了localhost作为陷阱目标。因此,我在端口162上收到通知: 我现在尝试的是使用snmp浏览器(如iReasoning MIB browser)从另一个ip地址接收陷阱。但在那里,我无法向目标mib添加条目。 我错过了什么吗? 谢谢你。 编辑: 我想使用mib浏览器向目标地址表添加一个条目。使用

  • 在我的例子中,我在Mule3中使用Java完成了XML有效载荷转换。 但是在Mule 4中,我们是否能够使用Dataweave 2.0转换xml有效载荷。 我有一个XML请求和预期的响应负载。但是不知道用Dataweave 2.0来改造 输入XML:https://github.com/Manikandan99/demo/blob/master/input_xml_request 输出 XML:h

  • 如何使用C或C和net snmp模块接收陷阱。我需要示例代码,但示例位于http://www.net-snmp.org/使用系统调用,但不要使用API方法。

  • 我在Kafka中有这样的配置 我有一个类,有相同的有效负载代码,我如何在任何时候在对象中转换它? 大家好,我有一个微服务接收这个字符串并且正在工作,但是我需要将这个字符串转换为一个特定的对象,当我使用ObjectMapper转换应用程序时,会返回这个异常: 抛出异常;嵌套异常是com.fasterxml.jackson.databind.exc.InvalidDefinitionException