web-dev-qa-db-fra.com

Erreur de socket MQTT sur le client <inconnu>

J'ai installé MQTT sur un Raspberry Pi et configuré un Arduino Uno au courtier, mais je vois l'entrée suivante dans le fichier /var/log/mosquitto/mosquitto.log:

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

Le Pi est configuré avec ETH0 câblé à mon réseau local et a une adresse IP de 192.168.1.50

Il existe également une configuration WiFi AP sur le Pi. L'Arduino Uno se connecte via WiFi pour envoyer/recevoir des messages MQTT. Le WiFi AP a une adresse IP de 192.168.10.1 et fournit des baux DHCP via dnsmasq.

J'ai essayé le test de publication et d'abonnement sur le serveur de courtier MQTT local (le Pi) et j'obtiens la même erreur:

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.

Voici /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

Arrêt du moustique du service Sudo Début du moustique du service Sudo:

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.

Il pourrait y avoir un problème dans la configuration de mes interfaces. Voici/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

Quelqu'un peut-il m'indiquer d'où vient l'erreur de socket sur MQTT?

13
rwkiii

Je rencontrais des problèmes similaires d'un Arduino se connectant à un moustique:

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.

La connexion initiale fonctionnerait, puis elle rencontrerait de fréquentes erreurs de socket, échouant finalement totalement.

Après quelques recherches, j'ai découvert que je n'appelais pas la fonction loop() de PubSubClient. Sans cela, la connexion n'est pas correctement entretenue, ce qui entraîne des délais d'attente et des erreurs de socket. Essayez d'ajouter client.loop() à votre fonction loop().

3
madleech

Je suis venu sur ce sujet car je faisais face à la même erreur. Après quelques problèmes supplémentaires, cela était lié à la configuration d'authentification - le client (Arduino) essayait de se connecter de manière anonyme (sans mot de passe), tandis que le courtier (Pi) était configuré pour n'autoriser que les connexions authentifiées (allow_anonymous false dans la configuration MQTT ).

L'ajout du mot de passe correct au code de connexion Arduino a résolu le problème pour moi.

2
Bogd

Notez que cette erreur sera déclenchée par MQTT si le client échoue pour une raison quelconque. J'ai passé plusieurs heures à fouiller dans MQTT en pensant que le mécanisme pub/sub a été détruit. Mais à la place, le problème était simplement une erreur dans ma propre procédure de désarchivage manuscrite qui contenait une instruction assertion python. L'assertion a échoué, tuant le client et générant l'erreur MQTT, mais aucun enregistrement de l'échec de l'assertion est apparu sur ma console, ce qui m'a conduit sur le chemin du jardin pendant un certain temps. La cause était mon exécution de sys.exit (-1) à ce stade, tuant la notification à la console. (Même dans le code de prototypage, il vaut mieux faites la bonne chose quand vous le pouvez, et pas des trucs idiots comme ça!)

1
Anthony Tomasic

Pour me connecter de manière anonyme, j'ai rencontré des problèmes. Spécifier "" comme nom d'utilisateur et mot de passe n'est apparemment pas assez anonyme. Il suffit de ne pas le mentionner dans la déclaration de connexion qui fonctionne mieux.

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