客户端<unknown>上的MQTT套接字错误

时间:2016-02-29 16:32:09

标签: linux raspberry-pi mqtt

我在Raspberry Pi上设置了MQTT,并为代理配置了Arduino Uno,但我在/var/log/mosquitto/mosquitto.log文件中看到以下条目:

New connection from 192.168.10.114 on port 1883.
Socket error on client <unknown>, disconnecting.

Pi设置为ETH0连接到我的本地LAN,IP地址为192.168.1.50

Pi上还有一个WiFi AP设置。 Arduino Uno通过WiFi连接发送/接收MQTT消息。 WiFi AP的IP地址为192.168.10.1,并通过dnsmasq提供DHCP租约。

我尝试在本地MQTT代理服务器(Pi)上发布和订阅测试并得到相同的错误:

Command:
mosquitto_sub -h 192.168.10.1 -t topic

mosquitto.log:
New connection from 192.168.10.1 on port 1883.
New client connected from 192.168.10.1 as mosqsub/1837-raspberryp (cl, k60).
Socket error on client <unknown>, disconnecting.

这是/etc/mosquitto/mosquitto.conf:

pid_file /var/run/mosquitto.pid

persistence true
log_dest file /var/log/mosquitto/mosquitto.log

allow_anonymous true

include_dir /etc/mosquitto/conf.d
sudo service mosquitto停止 sudo service mosquitto开始:

mosquitto version 1.4.8 terminating
mosquitto version 1.4.8 (build date Sun, 14 Feb 2016 15:06:55 +0000) starting
Config loaded from /etc/mosquitto/mosquitto.conf.
Opening ipv4 listen socket on port 1883.
Opening ipv6 listen socket on port 1883.

我的界面配置可能存在问题。这是/ etc / network / interfaces:

source-directory /etc/network/interfaces.d

auto lo
iface lo inet loopback

iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.10.1
    netmask 255.255.255.0

有人能指出我在MQTT上发生套接字错误的位置吗?

9 个答案:

答案 0 :(得分:2)

我从连接到mosquitto的Arduino遇到类似的问题:

mosquitto_1  | 1551412354: New connection from 10.0.3.9 on port 1883.
mosquitto_1  | 1551412354: New client connected from 10.0.3.9 as weather-station (c1, k15).
mosquitto_1  | 1551412376: Client weather-station has exceeded timeout, disconnecting.
mosquitto_1  | 1551412376: Socket error on client weather-station, disconnecting.
mosquitto_1  | 1551412402: New connection from 10.0.3.9 on port 1883.
mosquitto_1  | 1551412402: New client connected from 10.0.3.9 as weather-station (c1, k15).
mosquitto_1  | 1551412424: Client weather-station has exceeded timeout, disconnecting.
mosquitto_1  | 1551412424: Socket error on client weather-station, disconnecting.

最初的连接会工作,然后会遇到频繁的套接字错误,最终完全无法工作。

经过一番挖掘,我发现我没有调用PubSubClient的loop()函数。否则,将无法正确维护连接,从而导致超时和套接字错误。尝试将client.loop()添加到您的loop()函数中。

答案 1 :(得分:2)

请注意,如果客户端由于任何原因失败,那么MQTT将引发此错误。我花了几个小时研究MQTT,以为pub / sub机制被破坏了。但是相反,问题仅是我自己的包含python assert语句的手写解组过程中的错误。断言失败,杀死客户端,并生成MQTT错误,但是在我的控制台上未显示断言失败的记录,这使我暂时走下了花园的道路。原因是此时我正在执行sys.exit(-1),从而终止了向控制台的通知。 (即使是在原型代码中,也最好在可能的时候做正确的事情,而不要像这样愚蠢的事情!)

答案 2 :(得分:1)

我错误地在 arduino 上设置了 WifiSSLClient 而不是 WifiClient。 改为无 SSL 客户端,连接错误消失。

我的设置:

  • 客户端:在 Arduino wifi 版本上运行的 arduino MQTT 库 (ArduinoMqttClient.h)。 2
  • MQTT 代理:mosquitto 在 raspberry Pi 3 上运行

答案 3 :(得分:0)

我来到这个主题是因为我遇到了同样的错误。经过一些更多的故障排除后,它与身份验证配置相关 - 客户端(Arduino)尝试匿名连接(没有密码),而代理(Pi)设置为仅允许经过身份验证的连接(MQTT配置中的allow_anonymous为false) )。

为Arduino连接代码添加正确的密码解决了我的问题。

答案 4 :(得分:0)

对于匿名连接,我遇到了问题。将“”指定为用户名和密码显然还不够匿名。只是不要在连接语句中提及它会更好。

//mqtt_user = ""
//mqtt_password =""
//if (client.connect(mqtt_clientid, mqtt_user, mqtt_password)) {
if (client.connect(mqtt_clientid)) {

答案 5 :(得分:0)

即使使用正确的 acl、.conf 和 user_password 文件,我也遇到了类似的问题。问题是在我的 acl 文件中,我在用户名后面有一个额外的空格字符,这似乎被视为名称的一部分,因此是意料之中的。由于空间是隐形的,因此很难发现。

答案 6 :(得分:0)

这个问题可能是由多种原因造成的,其中之一是,

我的 MQTT 代理在 macOS 上运行,系统防病毒防火墙阻止我连接。

禁用防病毒防火墙帮助我毫无问题地连接到代理。

答案 7 :(得分:-1)

#mqtt #linux

我为我决定是: 每10秒循环添加$mqtt->ping()

答案 8 :(得分:-2)

你的意思是Raspberry是经纪人而arduino是订阅者,不是吗?

当我想与我的订户联系到经纪人时,我遇到了类似的问题,它不会连接到端口1883(似乎只适用于发布商..)。 我通过以下变化解决了这个问题,

config.mk

WITH_WEBSOCKETS:=yes

<强> mosquitto.conf

更改:

user mosquitto by user pi

在文件末尾添加:

listener 1883 listener 9001 <Raspberry IP> protocol websockets

重新运行经纪人

mosquitto -c mosquitto.conf

然后我可以将我的订户连接到端口9001上的代理。