Paho MQTT客户端本地地址和端口

时间:2018-05-15 11:12:50

标签: java mqtt paho

我的问题很简单。 我想知道如何修复端口客户端。

根据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 Layer上,所以我认为可以修复端口。

如果您有想法,请告诉我。 感谢

2 个答案:

答案 0 :(得分:0)

没有指定客户端的端口,因为它是由操作系统选择的,就像任何客户端到服务器的连接一样,就像你没有&#39 ; t需要使用HTTP连接。

您在tcp://<address>:<port>表单中传递的URL中指定MQTT代理的IP地址和端口,例如tcp://localhost:4922

下面的代码显示了我如何在OSGi上下文中连接Paho客户端,其中所有连接参数都是从bundle上下文中检索的。

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);
    }
}

答案 1 :(得分:0)

在正常情况下,您没有为TCP连接设置源端口,只需让操作系统选择一个随机空闲端口。

如果您修复了源端口,那么您只能在给定计算机上一次运行1个客户端实例,如果连接失败,则必须等待TCP堆栈再次释放该套接字。可以重新连接。

如果由于某种原因你真的需要来修复源端口,那么你可能会编写一个自定义javax.net.SocketFactory实现,你可以对源端口进行硬编码。然后将其作为MQTTConnectOptions对象的一部分传递进去,但我再次努力想出一个理由这是一个好主意。