我无法连接到 mqtt 中的代理,我想知道为什么?
I cannot connect to a broker in mqtt and I would like to know why?
共有三个文件:broker.py; sub.py; pub.py;
broker.py:
import logging
import asyncio
from hbmqtt.broker import Broker
logger = logging.getLogger(__name__)
config = {
'listeners': {
'default':{
'type': 'tcp',
'bind': 'localhost:9999'
}
},
'sys_interval': 10,
'topic-check':{
'enabled': False
}
}
broker = Broker(config)
@asyncio.coroutine
def startBroker():
yield from broker.start()
if __name__ == '__main__':
formatter = "[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s"
logging.basicConfig(level=logging.INFO, format=formatter)
asyncio.get_event_loop().run_until_complete(startBroker())
asyncio.get_event_loop().run_forever()
sub.py:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('localhost', 9999)
def on_connect(client, userdata, flags, rc):
print("Connected to a broker!")
client.subscribe("LINTANGtopic/test")
def on_message(client, userdata, message):
print(message.payload.decode())
while True:
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever
pub.py:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('localhost', 9999)
while True:
client.publish("LINTANGtopic/test", input('Message: '))
所以我首先打开了三个终端:
在第一个终端输入“py broker.py”,运行良好;
在第二个终端中,我输入了“py sub.py”,它不起作用并且在第二个终端中没有显示任何内容,应该显示“已连接到经纪人”,尽管它使第一个终端显示:
[2020-07-29 14:01:41,925] :: INFO :: hbmqtt.broker :: Listener 'default': 1 connections acquired
[2020-07-29 14:01:41,926] :: INFO :: hbmqtt.broker :: Connection from ::1:50450 on listener 'default'
[2020-07-29 14:01:41,937] :: INFO :: transitions.core :: Exited state new
[2020-07-29 14:01:41,937] :: INFO :: transitions.core :: Entered state connected
在第三个终端输入“py pub.py”,显示如下:
D:\MQTT>py pub.py
Message:
我需要让订阅者连接到代理,我想知道为什么会这样?
sub.py 将无法正常工作。
首先 client.loop_forever
是一个函数,因此需要用 ()
调用。
其次,while True:
循环是多余的,您不应该重复设置回调。
尝试以下操作:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected to a broker!")
client.subscribe("LINTANGtopic/test")
def on_message(client, userdata, message):
print(message.payload.decode())
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 9999)
client.loop_forever()
共有三个文件:broker.py; sub.py; pub.py;
broker.py:
import logging
import asyncio
from hbmqtt.broker import Broker
logger = logging.getLogger(__name__)
config = {
'listeners': {
'default':{
'type': 'tcp',
'bind': 'localhost:9999'
}
},
'sys_interval': 10,
'topic-check':{
'enabled': False
}
}
broker = Broker(config)
@asyncio.coroutine
def startBroker():
yield from broker.start()
if __name__ == '__main__':
formatter = "[%(asctime)s] :: %(levelname)s :: %(name)s :: %(message)s"
logging.basicConfig(level=logging.INFO, format=formatter)
asyncio.get_event_loop().run_until_complete(startBroker())
asyncio.get_event_loop().run_forever()
sub.py:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('localhost', 9999)
def on_connect(client, userdata, flags, rc):
print("Connected to a broker!")
client.subscribe("LINTANGtopic/test")
def on_message(client, userdata, message):
print(message.payload.decode())
while True:
client.on_connect = on_connect
client.on_message = on_message
client.loop_forever
pub.py:
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect('localhost', 9999)
while True:
client.publish("LINTANGtopic/test", input('Message: '))
所以我首先打开了三个终端: 在第一个终端输入“py broker.py”,运行良好; 在第二个终端中,我输入了“py sub.py”,它不起作用并且在第二个终端中没有显示任何内容,应该显示“已连接到经纪人”,尽管它使第一个终端显示:
[2020-07-29 14:01:41,925] :: INFO :: hbmqtt.broker :: Listener 'default': 1 connections acquired
[2020-07-29 14:01:41,926] :: INFO :: hbmqtt.broker :: Connection from ::1:50450 on listener 'default'
[2020-07-29 14:01:41,937] :: INFO :: transitions.core :: Exited state new
[2020-07-29 14:01:41,937] :: INFO :: transitions.core :: Entered state connected
在第三个终端输入“py pub.py”,显示如下:
D:\MQTT>py pub.py
Message:
我需要让订阅者连接到代理,我想知道为什么会这样?
sub.py 将无法正常工作。
首先 client.loop_forever
是一个函数,因此需要用 ()
调用。
其次,while True:
循环是多余的,您不应该重复设置回调。
尝试以下操作:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected to a broker!")
client.subscribe("LINTANGtopic/test")
def on_message(client, userdata, message):
print(message.payload.decode())
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect('localhost', 9999)
client.loop_forever()