Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
允许访问Azure上运行的Ubuntu服务器上的MQTT_Mqtt_Esp8266 - Fatal编程技术网

允许访问Azure上运行的Ubuntu服务器上的MQTT

允许访问Azure上运行的Ubuntu服务器上的MQTT,mqtt,esp8266,Mqtt,Esp8266,我有一台运行在Azure机器上的Ubuntu服务器14.04。我已经在这个Ubuntu服务器上安装了MQTT代理。此外,我有多个ESP8266设备,它们被假定通过这个代理订阅和发布到不同的MQTT主题。现在我的问题是,当我将两个设备连接到代理时,一个用于接收数据,另一个用于发布,它们工作正常,但当我尝试将另一个设备连接到代理时,所有设备都停止工作,我的ESP只是一遍又一遍地显示此消息“正在尝试连接代理”。 (在我的机器的端点中,我为HTTP添加了1883,为HTTPS添加了443,为SSH添加了

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


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

所有客户端设备都需要具有唯一的客户端ID。您描述的情况听起来与如果您的所有esp8266设备都具有相同的硬编码客户机id时发生的情况完全相同,MQTT客户机在连接之前获取clientID作为参数以提供唯一性。ESP8266具有独特的芯片。所以用它来解决问题。 以下是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);

那么,我怎样才能拥有唯一的客户端ID呢?在我的例子中,我为每个设备使用一个独特的主题。例如,home/room1/device1,home/room1/device2。客户端ID与主题是完全独立的,您可以通过连接传递它们details@NaumanShakir将ESP的唯一设备标识符传递给MQTT客户机,如下所示。正如hardillb所指出的,它们需要具有唯一的客户端ID,可能您正在传递一个常量。我发送了一个常量值来代替clientID,这就是问题的原因。现在我有一个小问题,即clientID和username是否以任何方式相互关联?用户名和密码在MQTT broker数据库中注册,不能使用不在broker数据库中的用户名,但clientId呢?在使用之前是否需要在broker中注册clientId?是否可以为所有ESP8266设备(但使用不同的clientId)提供一个用户名和密码?它会工作吗?客户端id用于在代理端处理通信和qos。它与真实性和用户名无关。用户名和密码用于验证通信以更正主题。客户端id不需要注册,但用户名是。第二个问题,是的,您可以在项目中的所有esp通信中使用相同的用户名和密码。注意你发送数据和订阅健康通讯的主题。