Я тестирую сервер Mosquitto, используя две программы Python. Брокер Mosquitto — это докер на машине с Linux, программы Python работают на моей машине с Windows. Один подписан на тему «Тест» и постоянно слушает и выводит все полученные сообщения на стандартный вывод + добавляет их в лог-файл. Второй отправляет указанное количество сообщений в тему «Тест» так быстро, как только возможно.
Это отлично работает, когда издатель и подписчик используют QoS 0. Однако при использовании QoS 1 для издателя, по-прежнему все сообщения передаются, но только 60-90% сообщений принимаются при использовании ~ 50 сообщений и более. Я также тестировал это со 100, 1000 и 10 000 сообщений - всегда получается около 2/3 сообщений, независимо от количества отправленных сообщений. Кроме того, никакие промежуточные сообщения не отбрасываются, а только те, которые находятся в конце.
Это становится еще хуже при изменении издателя на QoS 2, тогда только 30-50% моих сообщений принимаются абонента.
Уровень QoS моего абонента установлен на 0, изменение его на 1 или 2 ничего не меняет.
Оба скрипта подключены одинаково пользователь.
Я думаю, что система, возможно, не сможет обработать все сообщения так быстро, но почему она не отбрасывает сообщения между ними, а только обрезает их в конец, независимо от количества сообщений?
Вот программа-издатель:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, reason_code, properties):
print(f"Connected with result code {reason_code}")
broker_hostname = "myhost"
port = 1883
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(username="user", password="password")
client.on_connect = on_connect
client.connect(broker_hostname, port)
client.loop_start()
topic = "Test"
msg_count = 0
try:
while msg_count < 1000:
msg_count += 1
result = client.publish(topic, msg_count, qos=1)
status = result[0]
if status == 0:
print("Message " + str(msg_count) + " is published to topic " + topic)
else:
print("Failed to send message to topic " + topic)
if not client.is_connected():
print("Client not connected, exiting...")
break
finally:
client.disconnect()
client.loop_stop()
и программа подписки:
import paho.mqtt.client as mqtt
import logging
logging.basicConfig(filename="log.txt", level=logging.INFO)
def on_connect(client, userdata, flags, reason_code, properties):
print(f"Connected with result code {reason_code}")
client.subscribe("Test", qos=0) # also tested with qos=2, no difference in behaviour
def on_message(client, userdata, msg):
print(msg.topic + " " + str(msg.payload))
logging.info(msg.payload)
broker_hostname = "myhost"
port = 1883
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
client.username_pw_set(username="user", password="password")
client.on_connect = on_connect
client.on_message = on_message
client.connect(broker_hostname, port)
client.loop_forever()
Моя информация о комарах:
persistence true
persistence_location /mosquitto/data/
log_type subscribe
log_type unsubscribe
log_type websockets
log_type error
log_type warning
log_type notice
log_type information
log_dest file /mosquitto/log/mosquitto.log
log_dest stdout
password_file /mosquitto/passwd_file
allow_anonymous false
# MQTT Default listener
listener 1883 0.0.0.0
# MQTT over WebSockets
listener 9001 0.0.0.0
protocol websockets
Подробнее здесь: https://stackoverflow.com/questions/792 ... ng-qos1-or
Подписчик получает только первые 2/3 сообщений от издателя при использовании QoS1 или выше для публикации. ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Подписчик клиента MQTT: как разорвать цикл, получив новое сообщение от издателя?
Anonymous » » в форуме Python - 0 Ответы
- 56 Просмотры
-
Последнее сообщение Anonymous
-