BinaryWebSocketHandler.handleBinaryMessage中的解码消息失败

时间:2020-04-16 13:19:42

标签: spring mqtt

我想用Spring Boot构建一个MQTT代理。没有与现有的MQTT经纪人(像C ++中的mosquitto这样的真正经纪人)集成。

我使用spring-boot-starter-websocket(版本2.1.10.RELEASE)进行了尝试,其主要逻辑类似于spring支持的协议STOMP。

public class WebSocketMqtt extends BinaryWebSocketHandler implements SubProtocolCapable {
    @Override
    public List<String> getSubProtocols() {
        // Sec-WebSocket-Version must be 13
        return Collections.singletonList("mqtt");
    }

    @Override
    public boolean supportsPartialMessages() {
        return super.supportsPartialMessages();
    }

    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {
        MqttMessage req = decode(message);
        // do something and then send response with session
    }

    // some other useless Override methods
}

有效。 org.eclipse.paho.client.mqttv3与它的交互非常好,连接并发布并订阅等等。

当我使用MQTTBOX(https://github.com/workswithweb/MQTTBox)测试它时, 它在 BinaryWebSocketHandler.handleBinaryMessage 中显示错误,如下所示:

”解码消息失败,失败(java.lang.IndexOutOfBoundsException: readerIndex(1)+ length(1)超过writerIndex(1): UnpooledByteBufAllocator $ InstrumentedUnpooledUnsafeHeapByteBuf(ridx: 1,widx:1,上限:1))“

在wireshark中显示,MQTT消息被拆分成一些websocket包。程序包到达后,将一次调用handleBinaryMessage方法。但是handleBinaryMessage中的解码方法需要完整的MQTT消息,而不是部分。

enter image description here

出问题了吗? MQTTBOX,Spring websocket ? 还是我错了, handleBinaryMessage 方法需要处理部分消息吗?

0 个答案:

没有答案