簡體   English   中英

MQTT訂閱者與MQTT發布者訂閱同一主題失敗

[英]MQTT Subscriber Failed to Subscribe to the Same Topic With MQTT Publisher

我正在嘗試使用 python MQTT 制作一個簡單的“中轉時間表更改”程序,發布者可以在其中輸入航班號(將用作主題)和新的航班時間,而中轉位置將從給定列表中隨機選擇。

訂戶還必須輸入將用作主題的航班號。 但是在我的代碼中,訂閱者似乎無法將消息發布到同一主題,因為它一直在打印Connected Successfully (我正在使用client.loop_forever() )。 有人可以幫我弄清楚我的代碼有什么問題嗎?

這是我第一次提問,所以如果我的解釋中有什么不清楚的地方請問我。 太感謝了:)

出版商:

import paho.mqtt.client as mqtt
import time
from datetime import datetime, date
import random

def on_connect(client, userdata, flags, rc):
    if (rc==0):
        global connected
        connected = True
        #print("Successfully Connected.")
        client.on_publish = on_publish
    else:
        print("Failed to connect.")
        
def on_publish(client, userdata, mid):
    print("Published successfully. MID: "+str(mid))
    

listTransit = ["Singapura", "Qatar", "Korea Selatan", "Turki", "Republik Tiongkok",
                "Amerika Serikat", "Jepang", "Uni Emirat Arab", "Oman", "Islandia"]
                
broker_address="broker.emqx.io"

client = mqtt.Client("Publisher")
client.on_connect = on_connect
client.connect(broker_address, port=1883)

client.loop_start()

topic = input("Masukkan nomor penerbangan: ")
negaraTujuan = input("negara tujuan: ")
print("Masukkan waktu penerbangan baru (Format: [jam::menit::detik])")
str_time = input()

Date = date.today()
Time = datetime.strptime(str_time, '%H::%M::%S').time()
Location = random.randrange(0,len(listTransit))

if (listTransit[Location] != negaraTujuan):
    message = Date.strftime("%Y/%m/%d")+"\nTujuan: "+negaraTujuan+"\nLokasi Transit  : "+listTransit[Location]+"\nJam terbang    : "+Time.strftime("%H:%M:%S")
    client.publish(topic, message)
    print("Topic: ",topic)
    print(message)
else:
    while listTransit[Location] == negaraTujuan:
        Location = random.randrange(0,len(listTransit))
    message = Date.strftime("%Y/%m/%d")+"\nTujuan: "+negaraTujuan+"\nLokasi Transit  : "+listTransit[Location]+"\nJam terbang    : "+Time.strftime("%H:%M:%S")
    client.publish(topic, message)
    print(message)
    
client.loop_stop()

訂戶:

import paho.mqtt.client as mqtt
import time
from datetime import datetime, datetime
import re

def on_connect(client, userdata, flags, rc):
    if (rc == 0):
        print("Connected successfully.")
        #global topic
        #topic = input("Masukkan nomor penerbangan anda: ")
        #client.subscribe(topic)
    else:
        print("Connection failed.")
        
def on_message(client, userdata, msg):
    print("on_message callback function activated.")
    sched = str(msg.payload.decode("utf-8"))
    print(sched)
    
def on_subscribe(client, userdata, mid, granted_qos):
    print("Subscribed to "+topic+" successfully")
    
    
broker_address="broker.emqx.io"
topic = input("Masukkan nomor penerbangan anda: ")
negaraTujuan = input("negara tujuan: ")

client = mqtt.Client("Subscriber")
client.subscribe(topic)
client.on_connect = on_connect
client.on_message = on_message
client.on_subscribe = on_subscribe
client.connect(broker_address, port=1883)

client.loop_forever()

我從運行這兩個代碼得到的是

Masukkan nomor penerbangan: YT05TA
negara tujuan: Australia
Masukkan waktu penerbangan baru (Format: [jam::menit::detik])
12::50::00
Topic:  YT05TA
2023/01/03
Tujuan: Australia
Lokasi Transit  : Amerika Serikat
Jam terbang    : 12:50:00
Published successfully. MID: 1

來自出版商

Masukkan nomor penerbangan anda: YT05TA
negara tujuan: Australia
Connected successfully.
Connected successfully.
Connected successfully.
Connected successfully.

來自訂戶。 它甚至不打印print("on_message callback function activated.")

您使用的是公共經紀人,這意味着它可能有很多超額客戶。

每個客戶端都必須有一個唯一的客戶端 ID,因此使用Publisher者和Subscriber很可能會與其他客戶端發生沖突。

MQTT 規范規定,當新客戶端使用相同的客戶端 ID 連接時,代理必須斷開當前連接的客戶端。 由於大多數客戶端庫在斷開連接時會嘗試重新連接,這會導致兩個客戶端之間為保持連接而進行的戰斗。

將它們都更改為隨機值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM