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

rwk*_*iii 11 linux mqtt raspberry-pi

我在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.
Run Code Online (Sandbox Code Playgroud)

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

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

我尝试在本地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.
Run Code Online (Sandbox Code Playgroud)

这是/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
Run Code Online (Sandbox Code Playgroud)

sudo服务mosquitto停止sudo服务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.
Run Code Online (Sandbox Code Playgroud)

我的接口配置可能存在问题.这是/ 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
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我在MQTT上发生套接字错误的位置吗?

Bog*_*ogd 7

我来到这个线程是因为我面临同样的错误。经过更多的故障排除后,它与身份验证配置有关 - 客户端(Arduino)试图匿名连接(没有密码),而代理(Pi)被设置为只允许经过身份验证的连接(MQTT配置中的allow_anonymous false )。

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


小智 6

请注意,如果客户端因任何原因失败,MQTT 将引发此错误。我花了几个小时研究 MQTT,认为发布/订阅机制已经失效。但问题只是我自己手写的包含 python 断言语句的解组过程中的错误。断言失败,杀死了客户端,并生成 MQTT 错误,但我的控制台上没有显示断言失败的记录,这让我在花园小路上走了一段时间。原因是我当时执行 sys.exit(-1) ,终止了控制台的通知。(即使在原型代码中,最好尽可能做正确的事情,而不是像这样愚蠢的事情!)


小智 5

我在 Arduino 连接到 mosquitto 时遇到了类似的问题:

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.
Run Code Online (Sandbox Code Playgroud)

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

经过一番挖掘,我发现我没有调用loop()PubSubClient的函数。没有这个,连接就不会得到正确的服务,导致超时和套接字错误。尝试添加client.loop()到您的loop()函数中。


小智 -3

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

当我想与订阅者联系经纪人时,我遇到了类似的问题,它无法连接到端口 1883(似乎仅适用于发布者..)。我通过以下更改解决了这个问题,

配置.mk

WITH_WEBSOCKETS:=yes

蚊子.conf

改变 :

user mosquitto by user pi

在文件末尾添加:

listener 1883 listener 9001 <Raspberry IP> protocol websockets

重新运行代理

mosquitto -c mosquitto.conf
Run Code Online (Sandbox Code Playgroud)

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

  • 这是完全错误的。1883端口可以被发布者和订阅者使用(它们在连接时没有真正的区别,同一个客户端可以同时是发布者和订阅者)。 (3认同)