Я хочу собрать брокера 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, а не частичное.
Что-то не так? MQTTBOX, пружинная сетчатая розетка ? или я не прав, handleBinaryMessage метод должен иметь дело с частичным сообщением?