How to verify VerneMQ is start with MQTT version 5.x enable

Hi All

How to verify VerneMQ is start with MQTT version 5.x enable ?

My command to

 docker run -p 1883:1883 -p 8888:8888 -e LISTENER_TCP_ALLOWED_PROTOCOL_VERSIONS=3,4,5 -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" -e "SHARED_SUBSCRIPTION_POLICY=prefer_local" -e LOG_CONSOLE=both -e LOG_CONSOLE_FILE=/opt/scats/log/vernemq.log -e LOG_ERROR_FILE=/opt/scats/log/vernemq_error.log -d vernemq/vernemq &

I can connect to my VerneMQ Broker instacne using MQTT Explorer.

However My Java test written to support MQTT 5 get exception of

excep Connection lost (32109) - java.net.SocketException: Connection reset
Connection lost (32109) - java.net.SocketException: Connection reset
	at org.eclipse.paho.mqttv5.client.internal.CommsReceiver.run(CommsReceiver.java:196)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.net.SocketException: Connection reset
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
	at java.base/java.io.DataInputStream.read(DataInputStream.java:149)
	at org.eclipse.paho.mqttv5.client.wire.MqttInputStream.readFully(MqttInputStream.java:151)
	at org.eclipse.paho.mqttv5.client.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:124)
	at org.eclipse.paho.mqttv5.client.internal.CommsReceiver.run(CommsReceiver.java:139)

The source is download below

Can you please let me know what I am doing wrong?

Thank you for your help and support.


import org.eclipse.paho.mqttv5.client.MqttAsyncClient;
import org.eclipse.paho.mqttv5.client.MqttConnectionOptions;
import org.eclipse.paho.mqttv5.client.IMqttToken;
import org.eclipse.paho.mqttv5.client.persist.MemoryPersistence;
import org.eclipse.paho.mqttv5.common.MqttException;
import org.eclipse.paho.mqttv5.common.MqttMessage;

public class MqttPublishSampleV5 {

    public static void main(String[] args) {

        String topic        = "sp/moc/bc/sdd/rt-veh/veh/1.0.1";
        String content      = "Message from MqttPublishSample";
        int qos             = 1;
       // String broker       = "tcp://10.151.42.64:1883";
        String broker       = "tcp://10.151.42.64:1883";
        String clientId     = generateClientId();
        MemoryPersistence persistence = new MemoryPersistence();

        try {
            MqttConnectionOptions connOpts = new MqttConnectionOptions();
            connOpts.setCleanStart(false);
            connOpts.setKeepAliveInterval(15);
            connOpts.setConnectionTimeout(30);

            MqttAsyncClient sampleClient = new MqttAsyncClient(broker, clientId, persistence);
            System.out.println("Connecting to broker: " + broker);
            IMqttToken token = sampleClient.connect(connOpts);
            token.waitForCompletion();
            System.out.println("Connected");
            System.out.println("Publishing message: "+content);


            MqttMessage message = new MqttMessage(content.getBytes());
            message.setQos(qos);
            token = sampleClient.publish(topic, message);
            token.waitForCompletion();
            System.out.println("Disconnected");
            System.out.println("Close client.");
            sampleClient.close();
            System.exit(0);
        } catch(MqttException me) {
            System.out.println("reason "+me.getReasonCode());
            System.out.println("msg "+me.getMessage());
            System.out.println("loc "+me.getLocalizedMessage());
            System.out.println("cause "+me.getCause());
            System.out.println("excep "+me);
            me.printStackTrace();
        }
    }
    public static String generateClientId() {

        return "scatsava" + System.nanoTime();
    }
}

2 Likes

Please ensure that you use the correct env variable format (regarding “.” and “_”).
Referring you to the “remark” here: GitHub - vernemq/docker-vernemq: VerneMQ Docker image - Starts the VerneMQ MQTT broker and listens on 1883 and 8080 (for websockets).

2 Likes

Hi André

Thank you for your reply, I have the correct environment paramter suggested in URL GitHub - vernemq/docker-vernemq: VerneMQ Docker image - Starts the VerneMQ MQTT broker and listens on 1883 and 8080 (for websockets).

 docker run -p 1883:1883 -p 8888:8888 -e "LISTENER_TCP_ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" -e "SHARED_SUBSCRIPTION_POLICY=prefer_local" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS__POOL_timeout=6000" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS.pool_timeout=60000" -e DOCKER_VERNEMQ_LOG__CONSOLE=both -e "DOCKER_VERNEMQ_LOG__CONSOLE__LEVEL=debug" -e LOG_CONSOLE_FILE=/opt/scats/log/vernemq.log -e LOG_ERROR_FILE=/opt/scats/log/vernemq_error.log -d vernemq/vernemq &

My VerneMQ docker contains is running.

I set -e “LISTENER_TCP_ALLOWED_PROTOCOL_VERSIONS=3,4,5” the enable support for MQTT ver 3.x and 5.x

I am able to connect use MQTT Explorer, my Java client MQTT support ver 3.x can publish to subcribe to VerneMQ docker contains is running.

But my Java client MQTT support ver 5.x can NOT publish to subcribe I get an error of

cause java.net.SocketException: Connection reset
excep Connection lost (32109) - java.net.SocketException: Connection reset
Connection lost (32109) - java.net.SocketException: Connection reset
	at org.eclipse.paho.mqttv5.client.internal.CommsReceiver.run(CommsReceiver.java:196)
	at java.base/java.lang.Thread.run(Thread.java:835)

How can check my version VerneMQ docker container is enable to support MQTT ver 5.x
My main of objectivw to use Request and Repsone message that support in MQTT ver 5.x.

Note: my Java client MQTT support ver 5.x can publish to subcribe fine with Mosquito or HiveMQTT, we want would to use VerneMQ in QA, pre-prod and production environment.

Thank you for your help and support

Regards, Bao

2 Likes

Interesting.
First, check what the Verne logs say on that connection attempt.
Second, can you try setting the allowed protocols on a listener level, not on protocol (TCP) level?

That is, you should end up with a line like listener.tcp.my_listener.allowed_protocol_versions=3,4,5 in the vernemq.conf file, where my_listener is the name of your listener. (Use the same name as in the listener endpoint definition. It is named default by default.)

2 Likes

Hi Andre

I running VerneMQ docker container with setting

  docker run -p 1883:1883 -p 8888:8888  -e "LISTENER_TCP_DEFAULT=127.0.0.1:1883" -e  "LISTENER_TCP_DEFAULT_ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "LISTENER_TCP_ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" -e "SHARED_SUBSCRIPTION_POLICY=prefer_local" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS__POOL_timeout=6000" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS.pool_timeout=60000" -e DOCKER_VERNEMQ_LOG__CONSOLE=both -e "DOCKER_VERNEMQ_LOG__CONSOLE__LEVEL=debug" -e "LOG_CONSOLE_FILE=/opt/scats/log/vernemq.log" -e "LOG_ERROR_FILE=/opt/scats/log/vernemq_error.log" -d vernemq/vernemq &

I still get exception of

Connection lost (32109) - java.net.SocketException: Connection reset
	at org.eclipse.paho.mqttv5.client.internal.CommsReceiver.run(CommsReceiver.java:196)
	at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.net.SocketException: Connection reset
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:186)
	at java.base/java.net.SocketInputStream.read(SocketInputStream.java:140)
	at java.base/java.io.DataInputStream.read(DataInputStream.java:149)

my Java client MQTT support ver 5.x but my Java client MQTT support ver 3.x working fine.

Also I can not see VerneMQ log file from /var/log/vernemq/console.log
Or in the directories I specific -e “LOG_CONSOLE_FILE=/opt/scats/log/vernemq.log” -e “LOG_ERROR_FILE=/opt/scats/log/vernemq_error.log”

I am kind of block
Can please let me know what I am doing wrong.

Thank you for your help and support

2 Likes

The format is still wrong in your command. (It’s confusing, not your fault). Here’s a shortened example:

docker run -p 1883:1883 -p 8888:8888 -e "DOCKER_VERNEMQ_LISTENER__TCP__DEFAULT=127.0.0.1:1883" -e "DOCKER_VERNEMQ_LISTENER__TCP__DEFAULT__ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" -d vernemq/vernemq &

Exec into the container, then check with cat etc/vernemq.conf. Doing this should show you the last lines of the conf file. All the values between ###START### and ###END### will be the inserted ones. This way you can make sure you got the format right. All the values should have the same format as in a canonical vernemq.conf file.

EDIT: (to be explicit)

  • prefix any env var with DOCKER_VERNEMQ_
  • replace any . in the canonical format with __ (2 underscores)
  • but don’t substitute any _ that is part of the variable name, as in ALLOW_ANONYMOUS
2 Likes

Hi Andre

Thank you very for your help, I finally got my VerneMQ Docker container accept request from my Java Client MQTT 5.x and 3.x, by putting -e “DOCKER_VERNEMQ_LISTENER__TCP__ALLOWED_PROTOCOL_VERSIONS=3,4,5”

Below is the complete command

docker run -p 1883:1883 -p 8888:8888  -e "LISTENER_TCP_DEFAULT=127.0.0.1:1883" -e  "DOCKER_VERNEMQ_LISTENER__TCP__DEFAULT__ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "DOCKER_VERNEMQ_LISTENER__TCP__ALLOWED_PROTOCOL_VERSIONS=3,4,5" -e "DOCKER_VERNEMQ_LISTENER__TCP__DEFAULT__MAX_CONNECTIONS=200000" -e "DOCKER_VERNEMQ_ACCEPT_EULA=yes" -e "DOCKER_VERNEMQ_ALLOW_ANONYMOUS=on" -e "SHARED_SUBSCRIPTION_POLICY=prefer_local" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS__POOL_timeout=6000" -e "DOCKER_VERNEMQ_VMQ_WEBHOOKS.pool_timeout=60000" -e DOCKER_VERNEMQ_LOG__CONSOLE=both -e "DOCKER_VERNEMQ_LOG__CONSOLE__LEVEL=debug" -e "LOG_CONSOLE_FILE=/opt/scats/log/vernemq.log" -e "LOG_ERROR_FILE=/opt/scats/log/vernemq_error.log" -d vernemq/vernemq &
2 Likes