允许在Azure上运行的Ubuntu Server上访问MQTT

时间:2016-12-27 03:06:18

标签: mqtt esp8266

我在Azure计算机上运行了Ubuntu Server 14.04。我在这个Ubuntu服务器上安装了MQTT代理。此外,我有多个ESP8266设备,假设通过此代理订阅和发布到不同的MQTT主题。现在我的问题是,当我将两个设备连接到Broker,一个用于接收数据而另一个用于发布时,它们工作正常,但是当我尝试连接另一个设备到代理时,所有设备都停止工作,我的ESP只显示此消息“试图连接经纪人“一遍又一遍。 (在我的机器的端点,我为HTTP添加了1883,为HTTPS添加了443,为SSH增加了22)

我的问题是我如何允许多个设备与在Azure代理上运行的MQTT代理进行通信?

2 个答案:

答案 0 :(得分:2)

所有客户端设备都需要具有唯一的客户端ID。您描述的情况与您所有esp8266设备具有相同的硬编码客户端ID的情况完全相同

答案 1 :(得分:1)

MQTT客户端在连接之前将clientID作为参数提供,以提供唯一性。 ESP8266拥有独特的ChipID。所以用它来解决这个问题。 这里是Arduino固件的例子:

WiFiClient wifiClient;
PubSubClient mqttClient(wifiClient);
mqttClient.setServer(MQTT_BROKER, MQTT_BROKER_PORT);

String clientId = "IoTDevice-" + String(ESP.getChipId());
mqttClient.connect(clientId.c_str(), MQTT_USERNAME, MQTT_KEY);

这是NodeMCU固件示例:

mqtt_cli:connect(MQTT_BROKER, MQTT_BROKER_PORT, 0, CALLBACK_FN);

mqtt_cli = mqtt.Client("IoTDevice-"..node.chipid(), 120, MQTT_USERNAME, MQTT_KEY);