#python #python-3.x #mqtt #mosquitto #paho
#python #python-3.x #mqtt #mosquitto #paho
Вопрос:
Я пытаюсь подключиться из скрипта python (paho.mqtt.python) к mosquitto broker. Я могу подключиться с терминала, используя эту команду:
mosquitto_sub -h localhost -p 8883 -v -t 'owntracks/#' -u owntracks -P 12qwaszx
Но когда я пытаюсь подключиться через скрипт python, я получаю ошибку:
Socket error on client <unknown>, disconnecting.
Сценарий, который я использую, является примером:
(отсюда: https://owntracks.org/booklet/tech/program /)
import paho.mqtt.client as mqtt
import json
# The callback for when the client successfully connects to the broker
def on_connect(client, userdata, rc):
''' We subscribe on_connect() so that if we lose the connection
and reconnect, subscriptions will be renewed. '''
client.subscribe("owntracks/ / ")
#tried also: client.subscribe("owntracks/#")
# The callback for when a PUBLISH message is received from the broker
def on_message(client, userdata, msg):
topic = msg.topic
try:
data = json.loads(str(msg.payload))
print "TID = {0} is currently at {1}, {2}".format(data['tid'], data['lat'], data['lon'])
except:
print "Cannot decode data on topic {0}".format(topic)
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("localhost", 8883, 60)
# Blocking call which processes all network traffic and dispatches
# callbacks (see on_*() above). It also handles reconnecting.
client.loop_forever()
Вот содержимое моего конфигурационного файла (я изменил «localhost» с моего реального IP-адреса — попробовал оба из них):
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
pid_file /var/run/mosquitto.pid
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
listener 8883 "localhost"
persistence true
persistence_location /var/lib/mosquitto/
persistence_file mosquitto.db
log_dest syslog
log_dest stdout
log_dest topic
log_type error
log_type warning
log_type notice
log_type information
connection_messages true
log_timestamp true
allow_anonymous false
password_file /etc/mosquitto/pwfile
Любая помощь была бы высоко оценена.
Комментарии:
1. Какую версию mosquitto вы используете и как она настроена (в частности, порт 8883 настроен для websockets?)
2. версия 1.5.8. она настроена с использованием этой конфигурации: digitalocean.com/community/questions /…
3. Вместо localhost или вашего IP-адреса попробуйте удалить его (по умолчанию mosquitto будет прослушивать все доступные IP / интерфейсы)
4. Изменено, и я также удалил пароль, поэтому я могу подключаться с терминала без указания IP и пароля, но по-прежнему имею ту же ошибку, что и раньше.
Ответ №1:
Ваш скрипт python пытается подключиться к тому, что выглядит как защищенная настройка TLS, без подготовки метода клиентского подключения для применения этих сведений к транзакции. Попробуйте следующее:
def ssl_prep():
ssl_context = ssl.create_default_context()
ssl_context.load_verify_locations(cafile=ca)
ssl_context.load_cert_chain(certfile=mycert, keyfile=priv)
return ssl_context
ca = "PATH_TO_YOUR_CA_FILE"
priv = "PATH_TO_YOUR_PEM_FILE"
mycert = "PATH_TO_YOUR_CERT_FILE"
topics = "YOUR_TOPICS"
broker = "BROKER_URL"
client = mqtt.Client()
ssl_context= ssl_prep()
client.tls_set_context(context=ssl_context)
client.username_pw_set(username="UNAME",password="PASS")
client.connect(broker, port=8883)
Предоставляя контекст ssl для попытки подключения до того, как попытка будет предпринята, это должно сработать при условии, что у вас есть все детали, относящиеся к вашей собственной настройке.
Ответ №2:
Попробуйте сократить время ожидания с 1 минуты до 30 секунд или ниже:
client.connect("localhost", 8883, 30)
//Default: connect(host, port=1883, keepalive=60, bind_address=””)