Ошибка декодирования сообщения в BinaryWebSocketHandler.handleBinaryMessage - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу собрать брокера MQTT с весенней загрузкой. Не интеграция с существующим MQTT-брокером, реальным брокером, подобным Mosquitto в C ++.

Я пробую это с помощью spring-boot-starter-websocket (версия 2.1.10.RELEASE) и основного логика c аналогично протоколу 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 очень хорошо взаимодействует с ним, подключается и публикует sh, подписывается и т. д.

Когда я тестирую его с помощью MQTTBOX (https://github.com/workswithweb/MQTTBox) , это показывает ошибку в BinaryWebSocketHandler.handleBinaryMessage как следующее:

"сообщение декодирования не удалось, ошибка (java .lang.IndexOutOfBoundsException: readerIndex (1 ) + length (1) превышает writerIndex (1): UnpooledByteBufAllocator $ InstrumentedUnpooledUnsafeHeapByteBuf (ridx: 1, widx: 1, cap: 1)) "

Это показывает в Wireshark, что сообщение MQTT разбивается в какой-то кусок пакета websocket. И метод handleBinaryMessage вызывается один раз после прибытия пакета. Но метод декодирования в handleBinaryMessage ожидал целое сообщение MQTT, а не частичное.

enter image description here

Что-то не так? MQTTBOX, пружинная сетчатая розетка ? или я не прав, handleBinaryMessage метод должен иметь дело с частичным сообщением?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...