我的要求如下:
有多个客户端物联网设备。他们将数据发送到服务器,从服务器接收消息并更改其行为。有各种各样的前端想要监控设备中的数据并向设备发送命令。
我正在阅读有关MQTT的内容,并了解其中包含订阅者,发布者和经纪人。
我的问题是,我可以将我的设备注册为同一经纪商的发布商和订阅者吗?这是可取的吗?感谢。
答案 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