MQTT在同一客户端发布订阅

时间:2018-03-26 05:40:34

标签: mqtt

我的要求如下:

有多个客户端物联网设备。他们将数据发送到服务器,从服务器接收消息并更改其行为。有各种各样的前端想要监控设备中的数据并向设备发送命令。

我正在阅读有关MQTT的内容,并了解其中包含订阅者,发布者和经纪人。

我的问题是,我可以将我的设备注册为同一经纪商的发布商和订阅者吗?这是可取的吗?感谢。

3 个答案:

答案 0 :(得分:1)

我没有看到问题。

为了保持分离,您可能希望使用不同的通道来传输数据和控制消息。

答案 1 :(得分:1)

是的,MQTT在同一客户端发布和订阅应该没有问题。

以下是发布和订阅的MQTT客户端的示例Java代码:

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class MQTTClient {

    private static final Logger logger = LoggerFactory.getLogger(MQTTClient.class);

    public static void main(String[] args) {
        MqttClient mqttClient;
        String tmpDir = System.getProperty("java.io.tmpdir");
        String subscribeTopicName = "echo";
        String publishTopicName = "thing";
        String payload;
        MqttDefaultFilePersistence dataStore = new MqttDefaultFilePersistence(tmpDir);
        try {
            mqttClient = new MqttClient("tcp://localhost:1883", "thing1", dataStore);
            MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();
            mqttConnectOptions.setUserName("/:guest");
            mqttConnectOptions.setPassword("guest".toCharArray());
            mqttConnectOptions.setCleanSession(false);
            mqttClient.connect(mqttConnectOptions);
            logger.info("Connected to Broker");
            mqttClient.subscribe(subscribeTopicName);
            logger.info(mqttClient.getClientId() + " subscribed to topic: {}", subscribeTopicName);
            mqttClient.setCallback(new MqttCallback() {
                @Override
                public void connectionLost(Throwable throwable) {
                    logger.info("Connection lost to MQTT Broker");
                }

                @Override
                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    logger.info("-------------------------------------------------");
                    logger.info("| Received ");
                    logger.info("| Topic: {}", topic);
                    logger.info("| Message: {}", new String(message.getPayload()));
                    logger.info("| QoS: {}", message.getQos());
                    logger.info("-------------------------------------------------");

                }

                @Override
                public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
                    logger.info("Delivery Complete");
                }
            });
            MqttMessage message = new MqttMessage();
            for (int i = 1; i < 6; i++) {
                payload = "Message " + i + " from Thing";
                message.setPayload(payload
                        .getBytes());
                logger.info("Set Payload: {}", payload);
                logger.info(mqttClient.getClientId() + " published to topic: {}", publishTopicName);
                //Qos 1
                mqttClient.publish(publishTopicName, message);
            }
        } catch (MqttException me) {
            logger.error("reason: {}", me.getReasonCode());
            logger.error("msg: {}", me.getMessage());
            logger.error("loc: {} ", me.getLocalizedMessage());
            logger.error("cause: {}", me.getCause());
            logger.error("excep: {}", me);
            me.printStackTrace();
        }
    }
}

在上面的代码中,请检查 mqttClient.subscribe 是否订阅, mqttClient.publish 进行发布。 我已经解释了如何在博客中将RabbitMQ作为MQTT代理端到端工作,我使用的示例工作代码可以在GitHub上获得。请检查:http://softwaredevelopercentral.blogspot.com/2017/12/iot-internet-of-things-tutorial.html

答案 2 :(得分:0)

整体设置中应该只有一个代理。出于可扩展性原因,我们可能会将多个可以协同工作的代理放在一起,并且整体上总是代表单个代理。在多个代理设置中,边缘客户端将仅连接到单个代理。

确保为每个设备保留一个唯一的发布主题和一个唯一的订阅主题,以实现设备的可扩展性,下边缘处理和对人类的轻松理解。

同样总是基于用例进行权衡。

干杯, Ranjith