如何发送对MQTT消息的响应?

时间:2018-06-26 17:46:03

标签: python mqtt

我希望一个RaspberryPi-A向RaspberryPi-B发送按摩,而RaspberryPI-B应该自动将按摩发送回去。我知道这是一个初学者的问题,但是我是一个,而且我整天都在努力寻找答案。

这是我客户的代码

import paho.mqtt.client as mqtt

MQTT_SERVER = "localhost"
MQTT_PATH = "test_channel"


def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))


client.subscribe(MQTT_PATH)

# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    # more callbacks, etc

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(MQTT_SERVER, 1883, 60)


client.loop_forever()

这是我发布者的代码

import paho.mqtt.publish as publish

MQTT_SERVER = "192.168.1.5"
MQTT_PATH = "test_channel"

publish.single(MQTT_PATH, "Hello World!", hostname=MQTT_SERVER)

我应该如何以不同的方式编写代码,以便客户返回例如“ Hello back”的消息?

1 个答案:

答案 0 :(得分:1)

有两种消息传递模型:

  • 点对点(一对一)-消息通过队列从一个应用程序发送到另一个应用程序。可以有超过1个正在使用的(接收方)应用程序,但只有其中一个会接收到消息。

  • 发布/订阅-将消息发布到某个主题,多个使用者(订户)将每个接收消息的副本。可以有1个或多个应用程序将消息发布到同一主题,并且有1个或多个应用程序使用(接收)消息。

MQTT建立在发布/订阅消息传递模型上。

您的描述听起来像您想要点对点消息传递。是的,您可以将MQTT弯曲为点对点的行为,但是请注意,如果您有多个将消息发布到同一主题的应用程序,您可能会感到困惑。

MQTT_PATH = "test_channel"
publish.single(MQTT_PATH, "Hello World!", hostname=MQTT_SERVER)

MQTT中没有“通道”之类的东西。您的代码正在将消息发布到名为test_channel的主题。

最好在主题名称中使用一些层次结构。

  • pivk95 / food /汉堡
  • pivk95 / food / fries
  • pivk95 / food / pizza
  • pivk95 / food /墨西哥卷饼
  • pivk95 / drink / shakes
  • pivk95 / drink / soft_drink

请记住,任何数量的应用程序都可以将消息发布到给定的主题,并且任何数量的应用程序都可以订阅给定的主题并接收消息的副本。