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

bq9c1y66  于 2023-03-22  发布在  Linux
关注(0)|答案(9)|浏览(471)

我在Raspberry Pi上设置了MQTT,并将Arduino Uno配置到代理,但我在/var/log/mosquito/mosquito. 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/mosquito/mosquito.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 mosquito停止sudo service mosquito启动:

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上的套接字错误来自哪里?

nx7onnlm

nx7onnlm1#

我来到这个帖子是因为我遇到了同样的错误。经过更多的故障排除,它与身份验证配置有关-客户端(Arduino)试图匿名连接(没有密码),而代理(Pi)设置为只允许经过身份验证的连接(MQTT配置中的allow_anonymous false)。
在Arduino连接代码中添加正确的密码为我解决了这个问题。

fquxozlt

fquxozlt2#

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

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()函数中。

ezykj2lf

ezykj2lf3#

请注意,如果客户端由于任何原因失败,MQTT将引发此错误。我花了几个小时深入研究MQTT,以为pub/sub机制被破坏了。但实际上,问题只是我自己编写的包含python assert语句的解组过程中的一个错误。assert失败,杀死客户端,并生成MQTT错误,但是在我的控制台上没有显示assert失败的记录,这让我陷入了一段时间的困境,原因是我正在执行的sys.exit(-1)在该点,终止对控制台的通知。(即使是在原型代码中,最好是尽可能地做正确的事情,而不是像这样愚蠢的事情!)

bgtovc5b

bgtovc5b4#

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

  • 客户端:运行在Arduino wifi rev.2上的Arduino MQTT库(ArduinoMqttClient.h
  • MQTT经纪人:mosquito runing on raspberry Pi 3
xriantvc

xriantvc5#

我也遇到了同样的问题,这可能有两个原因。

1. Username and password is empty.
2. While allowing anonymous user.

如果您的用户名和密码为空,请删除或提供正确的用户名和密码。
如果您允许匿名用户,请在mosquito.conf文件中设置以下属性,然后重新启动您的代理。

allow_anonymous true

注意:允许匿名用户不是一个好主意。

syqv5f0l

syqv5f0l6#

匿名连接我遇到了一些问题。指定“”作为用户名和密码显然不够匿名。在连接语句中不要提到它会更好。

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

uqxowvwt7#

我有一个类似的问题,即使是正确的acl,.conf和user_password文件。问题是,在我的acl文件中,我有一个额外的空格字符后的用户名,这似乎被认为是一部分的名称,因此预期。这是很难发现,因为空间是不可见的。

ymzxtsji

ymzxtsji8#

这个问题可能是由于多种原因造成的,其中之一是,
我的MQTT代理在macOS上运行,系统防病毒防火墙阻止我连接。
禁用防病毒防火墙帮助我连接到代理没有任何问题。

ijxebb2r

ijxebb2r9#

你的意思是乌藨子是经纪人和Arduino是订户,不是吗?
我有一个类似的问题,当我想达到经纪人与我的订阅者,它不会连接在端口1883(似乎只为出版商..)。我解决了它与以下变化,

config.mk

WITH_WEBSOCKETS:=yes

mosquito.conf

变更:
user mosquitto by user pi
在文件末尾添加:
listener 1883 listener 9001 <Raspberry IP> protocol websockets
重新运行代理

mosquitto -c mosquitto.conf

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

相关问题