我想用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消息,而不是部分。
出问题了吗? MQTTBOX,Spring websocket ? 还是我错了, handleBinaryMessage 方法需要处理部分消息吗?