我在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上发生套接字错误的位置吗?
答案 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 客户端,连接错误消失。
我的设置:
ArduinoMqttClient.h
)。 2答案 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上的代理。