Paho MQTT клиент локальный адрес и порт - PullRequest
0 голосов
/ 15 мая 2018

Мой вопрос прост.Я хочу знать, как исправить порт клиента.

Согласно документам Eclipse и IBM, Пользователь должен исправить адрес брокера (это абсолютно естественно).Но нет никаких упоминаний о том, как исправить порт сайта клиента.https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.javadoc.doc/WMQMQxrClasses/com/ibm/micro/client/mqttv3/MqttClient.html

MQTT также должен быть на уровне TCP, поэтому я думаю, что можно исправить порт.

Если у вас есть идеи, дайте мне знать.Спасибо

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

При нормальных обстоятельствах вы не устанавливаете исходный порт для TCP-соединений, вы просто позволяете ОС выбирать произвольно свободный порт.

Если вы исправите исходный порт, то вы можете запускать только 1 экземпляр клиента за раз на данном компьютере, и если вы получаете ошибку соединения, вам придется ждать, пока стек TCP снова не освободит этот сокет, прежде чем вы можно восстановить.

Если по какой-то причине вам ДЕЙСТВИТЕЛЬНО НУЖНО исправить исходный порт, то вы, вероятно, могли бы написать собственную реализацию javax.net.SocketFactory , в которой вы можете жестко кодировать исходный порт. Затем передайте это как часть объекта MQTTConnectOptions , но я снова изо всех сил пытаюсь найти причину, по которой это хорошая идея.

0 голосов
/ 15 мая 2018

Вы не указываете порт клиента, так как он выбирается ОС, как и при любом соединении клиента с сервером, как вам не нужно делать это с HTTPлибо соединение.

IP-адрес и порт брокера MQTT указываются в URL-адресе, который вы передаете в виде tcp://<address>:<port>, например tcp://localhost:4922.

Приведенный ниже код показывает, как я подключаю Paho-клиент в контексте OSGi, где все параметры соединений извлекаются из контекста пакета.

private void configureMqtt(BundleContext context) throws IOException, MqttException {
    String broker = context.getProperty("mqtt.broker");

    if (broker == null) {
        throw new ServiceException("Define mqtt.broker");
    }

    String client = context.getProperty("mqtt.clientname");

    if (client == null) {
        throw new ServiceException("Define mqtt.clientname");
    }

    String dir = context.getProperty("mqtt.persistence");

    if (dir == null) {
        dir = "mqtt";
    };

    File directory = context.getDataFile(dir);
    directory.mkdirs();

    logger.config(() -> String.format("MQTT broker: %s, clientname: %s persistence: %s", broker, client, directory.getAbsolutePath()));
    connectOptions = new MqttConnectOptions();
    connectOptions.setWill(GARAGE + "/door", new byte[0], 0, true);

    String ka = context.getProperty("mqtt.keepalive");
    if (ka != null) {
        connectOptions.setKeepAliveInterval(Integer.valueOf(ka));
    }

    persistence = new MqttDefaultFilePersistence(directory.getCanonicalPath());
    mqttClient = new MqttAsyncClient(broker, client, persistence);
    mqttClient.setCallback(this);
    connect();
}

private void connect() {
    logger.fine("Connecting to MQTT broker");

    try {
        IMqttToken token = mqttClient.connect(connectOptions);

        IMqttActionListener listener = new IMqttActionListener() {
            @Override
            public void onSuccess(IMqttToken asyncActionToken) {
                logger.log(Level.INFO, "Connected to MQTT broker");
            }

            @Override
            public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                logger.log(Level.WARNING, "Could not connect to MQTT broker, retrying in 3 seconds", exception);
                service.schedule(this::connect, 3, TimeUnit.SECONDS);
            }
        };

        token.setActionCallback(listener);
    } catch (MqttException e) {
        logger.log(Level.SEVERE, "Cannot reconnect to MQTT broker, giving up", e);
    }
}
...