我在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上的套接字错误来自哪里?
9条答案
按热度按时间nx7onnlm1#
我来到这个帖子是因为我遇到了同样的错误。经过更多的故障排除,它与身份验证配置有关-客户端(Arduino)试图匿名连接(没有密码),而代理(Pi)设置为只允许经过身份验证的连接(MQTT配置中的allow_anonymous false)。
在Arduino连接代码中添加正确的密码为我解决了这个问题。
fquxozlt2#
我在Arduino连接到mosquito时遇到了类似的问题:
最初的连接可以工作,然后它会遇到频繁的套接字错误,最终完全无法工作。
经过一番挖掘,我发现我没有调用PubSubClient的
loop()
函数。没有这个函数,连接就不能正常服务,导致超时和套接字错误。尝试将client.loop()
添加到loop()
函数中。ezykj2lf3#
请注意,如果客户端由于任何原因失败,MQTT将引发此错误。我花了几个小时深入研究MQTT,以为pub/sub机制被破坏了。但实际上,问题只是我自己编写的包含python assert语句的解组过程中的一个错误。assert失败,杀死客户端,并生成MQTT错误,但是在我的控制台上没有显示assert失败的记录,这让我陷入了一段时间的困境,原因是我正在执行的sys.exit(-1)在该点,终止对控制台的通知。(即使是在原型代码中,最好是尽可能地做正确的事情,而不是像这样愚蠢的事情!)
bgtovc5b4#
我错误地在arduino上设置了
WifiSSLClient
而不是WifiClient
。更改为无SSL客户端,连接错误消失了。我的设置:
ArduinoMqttClient.h
)xriantvc5#
我也遇到了同样的问题,这可能有两个原因。
如果您的用户名和密码为空,请删除或提供正确的用户名和密码。
如果您允许匿名用户,请在mosquito.conf文件中设置以下属性,然后重新启动您的代理。
注意:允许匿名用户不是一个好主意。
syqv5f0l6#
匿名连接我遇到了一些问题。指定“”作为用户名和密码显然不够匿名。在连接语句中不要提到它会更好。
uqxowvwt7#
我有一个类似的问题,即使是正确的acl,.conf和user_password文件。问题是,在我的acl文件中,我有一个额外的空格字符后的用户名,这似乎被认为是一部分的名称,因此预期。这是很难发现,因为空间是不可见的。
ymzxtsji8#
这个问题可能是由于多种原因造成的,其中之一是,
我的MQTT代理在macOS上运行,系统防病毒防火墙阻止我连接。
禁用防病毒防火墙帮助我连接到代理没有任何问题。
ijxebb2r9#
你的意思是乌藨子是经纪人和Arduino是订户,不是吗?
我有一个类似的问题,当我想达到经纪人与我的订阅者,它不会连接在端口1883(似乎只为出版商..)。我解决了它与以下变化,
config.mk:
WITH_WEBSOCKETS:=yes
mosquito.conf:
变更:
user mosquitto by user pi
在文件末尾添加:
listener 1883 listener 9001 <Raspberry IP> protocol websockets
重新运行代理
然后我可以将我的订阅者连接到端口9001上的代理。