Как я могу передавать сообщения MQTT в запланированных фоновых потоках?

#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. В этом журнале отображается чистое отключение, инициированное клиентом, а не сбой подключения, вызванный ошибкой версии протокола.