как исправить отключение phao.mqtt, а при повторном подключении больше не отвечать? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий код:

def on_connect(client, userdata, flags, rc):
    if not rc:
        print("mqtt connected")
        print(f"c:{client}, ud:{userdata}, flags:{flags}, rc:{rc}")
        log.info("mqtt connected")
    else:
        log.info("mqtt connected not ok")


def on_disconnect(client, userdata, rc):
    print("dis")
    log.info("mqtt disconnected" + str(rc))


def on_publish(client, userdata, mid):
    print("publish")
    log.info("mqtt published")


def on_log(client, userdata, level, buf):
    print(f"log {level}:{buf}")

def on_message_comp(client, userdata, msg):
    print("on msg comp")
    log.info("\n\n")
    log.info("received  request")

def on_message_cali(client, userdata, msg):
    print("on_msg_cali")
    log.info("\n\n")
    log.info("received")


def ssl_alpn():
        ...ssl stuff
        return ssl_context

try:
    cali_subscription = os.getenv("MQTT_CALI_SUBSCRIPTION")
    comp_subscription = os.getenv("MQTT_COMP_SUBSCRIPTION")
    mqttc = mqtt.Client(os.getenv("MQTT_CLIENT_NAME"))
    print(f"calibration subscription: '{cali_subscription}'")
    print(f"computation subscription: '{comp_subscription}'")
    mqttc.on_connect = on_connect
    mqttc.on_log = on_log
    mqttc.on_disconnect = on_disconnect
    mqttc.on_publish = on_publish
    mqttc.on_message = on_message_comp
    mqttc.message_callback_add(cali_subscription, on_message_cali)
    ssl_context = ssl_alpn()
    mqttc.tls_set_context(context=ssl_context)
    mqttc.connect(aws_iot_endpoint, port=443)
    mqttc.subscribe(comp_subscription)
    mqttc.subscribe(cali_subscription)
    mqttc.loop_forever()
except KeyboardInterrupt:
    mqttc.disconnect()
    mqttc.loop_stop()
except:
    log.info("Exception connecting to mqtt clients: \n", exc_info=True)
    mqttc.loop_stop()

Моя проблема в том, что через какое-то случайное время клиент отключается, чем, как ожидалось, клиент снова подключается, но проблема сценарий не получает триггер В моих журналах я вижу следующее:

log 16:Received PINGRESP
log 16:Sending PINGREQ
<paho.mqtt.client.Client object at 0x7fbfef2cddd0> None 1 0
dis #print this when i am disconnecting 
log 16:Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k60) client_id=b'myClientName'
log 16:Received CONNACK (0, 0)
<paho.mqtt.client.Client object at 0x7fbfef2cddd0> None {'session present': 0} 0
connected OK #print when i am connecting
log 16:Sending PINGREQ
log 16:Received PINGRESP

Так что я вижу, что он отключен (не до конца понятно, почему keep_alive по умолчанию 60 от того, что Я знаю) в какой-то момент времени, а затем, когда он снова подключается, я больше не могу его запустить.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

0 голосов
/ 18 марта 2020

При отключении необходимо явно переподписаться на ваши темы, ie. поместите вызовы mqtt c .subscribe в on_disconnect.

...