#python #mqtt #paho
#python #mqtt #пау
Вопрос:
Я успешно запустил приложение на основе MQTT.
Со временем я перенес версии компонентов w.r.t. SW и переместил передачу сообщений MQTT в фоновые потоки APScheduler. Экземпляр клиента передается в планирование заданий посредством внедрения зависимостей.
Теперь я использую mosquitto eclipse mqtt broker docker image eclipse-mosquitto:1.6.10
и клиент Python paho paho-mqtt = "1.5.0"
.
Теперь, если я пытаюсь подключиться с клиентом к брокеру, соединение прерывается, и я получаю сообщение об ошибке Connection Refused: unacceptable protocol version.
, которое выдается в исходном коде клиента версии v1.5.
Клиент подключается следующим образом:
def on_disconnect(client, userdata, rc): # pylint: disable=invalid-name,unused-argument
print(mqtt.connack_string(rc))
client = mqtt.Client(
client_id="mvp-end-device-agent",
clean_session=False,
protocol=mqtt.MQTTv311,
)
client.on_disconnect = on_disconnect
user = "mvp-end-device-agent"
pwd = "some-string"
client.username_pw_set(user, pwd)
client.connect(host, port) # implicit timeout of 60 seconds
def on_disconnect(client, userdata, rc): # pylint: disable=invalid-name,unused-argument
Они все mosquitto/config/acl
равно должны совпадать:
user mvp-end-device-agent
topic write ...
А также mosquitto/config/passwd
конфигурация:
mvp-end-device-agent:<HASHEDPWD>
И mosquitto/config/mosquitto.conf
конфигурация:
password_file /mosquitto/config/passwd
acl_file /mosquitto/config/acls
Наиболее вероятные, соответствующие записи журнала ( mqtt-explorer-31e2d891
предназначены для отладки, mvp-end-device-agent
являются фактическим клиентом):
1603891749: New connection from 172.18.0.6 on port 1883.
1603891749: New client connected from 172.18.0.6 as mvp-end-device-agent (p2, c0, k1, u'mvp-end-device-agent').
1603891749: No will message specified.
1603891749: Sending CONNACK to mvp-end-device-agent (1, 0)
1603891750: Received PINGREQ from mqtt-explorer-31e2d891
1603891750: Sending PINGRESP to mqtt-explorer-31e2d891
1603891751: Received PINGREQ from mvp-end-device-agent
1603891751: Sending PINGRESP to mvp-end-device-agent
1603891752: Received PINGREQ from mvp-end-device-agent
1603891752: Sending PINGRESP to mvp-end-device-agent
1603891753: Received PINGREQ from mvp-end-device-agent
1603891753: Sending PINGRESP to mvp-end-device-agent
1603891754: Received PINGREQ from mvp-end-device-agent
1603891754: Sending PINGRESP to mvp-end-device-agent
1603891755: Received PINGREQ from mvp-end-device-agent
1603891755: Sending PINGRESP to mvp-end-device-agent
1603891755: Received DISCONNECT from mvp-end-device-agent
1603891755: Client mvp-end-device-agent disconnected.
Мне трудно понять основную причину этой проблемы. Каковы возможные причины возникновения этой ошибки?
РЕДАКТИРОВАТЬ: я передал клиент mqtt через внедрение зависимостей в задание APScheduler для запланированной передачи сообщения MQTT как часть выполнения задания. Каждое задание выполняется в потоке. Оказалось, что основной причиной Connection Refused: unacceptable protocol version.
было то, что после выполнения потока клиент отключается неявно, что имеет полный смысл.
Комментарии:
1. Что произойдет, если вы удалите
protocol=mqtt.MQTTv311,
из конструктора клиента?2. Не имеет значения.
3. Затем включите подробный вывод журнала mosquito и посмотрите, какую версию протокола запрашивает клиент.
4. Я добавил, вероятно, наиболее релевантный вывод журнала к вопросу.
5. В этом журнале отображается чистое отключение, инициированное клиентом, а не сбой подключения, вызванный ошибкой версии протокола.