Android 中基于 Websocket 的 MQTT

Posted

技术标签:

【中文标题】Android 中基于 Websocket 的 MQTT【英文标题】:MQTT Over Websockets in Android 【发布时间】:2017-11-29 22:45:29 【问题描述】:

我正在使用 Paho android Service for MQTT over web sockets。

https://www.hivemq.com/blog/mqtt-client-library-enyclopedia-paho-android-service

我的问题是如何设置包含查询参数的代理 WSS URI。

例如:wss://test.amazon.com:80/mqtt?query1=value&query2=value

编辑

如果我们添加完整的 URL,PAHO 客户端库会抛出以下异常:

MqttException (0) - java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:664)
W/System.err:     at java.lang.Thread.run(Thread.java:761)
W/System.err: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.receiveHandshakeResponse(WebSocketHandshake.java:133)
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketHandshake.execute(WebSocketHandshake.java:74)
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.websocket.WebSocketSecureNetworkModule.start(WebSocketSecureNetworkModule.java:77)
W/System.err:     at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)

编辑 2

CLIENT = new MqttAndroidClient(this, "wss://test.amazon.com:80/mqtt?query1=value&query2=value", clientId, new MemoryPersistence());
CLIENT.setCallback(this);

MQTT_CONNECTION_OPTIONS = new MqttConnectOptions();
MQTT_CONNECTION_OPTIONS.setCleanSession(true);

try 
    IMqttToken token = CLIENT.connect(MQTT_CONNECTION_OPTIONS);
    token.setActionCallback(new IMqttActionListener() 
        @Override
        public void onSuccess(IMqttToken asyncActionToken) 
            Log.v("tag", "onsuccess");
        

        @Override
        public void onFailure(IMqttToken asyncActionToken, Throwable exception) 
            exception.printStackTrace();
        
    );


 catch (MqttException e) 
    e.printStackTrace();

【问题讨论】:

如果您只是将该 URL 指定为连接 URL,会发生什么?显示您的代码和引发的任何错误 在你设置连接的地方包含你的代码,但如果这是正确的,那么这是 Paho 代码中的一个错误(它应该比那更优雅地失败0 添加了连接的代码部分。 针对 Paho 客户端打开一个缺陷 【参考方案1】:

更改版本

编译'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'

编译'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.0'

解决了这个问题。他们在 v1.2.0 中修复了这个问题

【讨论】:

以上是关于Android 中基于 Websocket 的 MQTT的主要内容,如果未能解决你的问题,请参考以下文章

在基于 Spring MVC 的服务器上实现 WebSocket

android studio连接io.socket:sokect.io-client服务器的条件

android websocket 应用

Android浏览器中的假websocket功能

使用 php 在 android 中使用 websocket 实现聊天

Websocket基于框架