PubSub 如何与多个 ESP32 一起工作?

How does PubSub work with multiple ESP32s?

让我们假设:

  1. 我将“cloud:demo/INP”添加到名为 INP 的帐户主题中。
  2. 我有几个 ESP32 设备,每个设备都有一个应用程序订阅以在“云:demo/INP”上接收一些消息:
import pubsub
topic ::= "cloud:demo/INP"

main:
  print "wakeup - checking messages"
  pubsub.subscribe topic --blocking=false: | msg/pubsub.Message |
    sender := ?
    if msg.sender.is_device:
      sender = "Device($msg.sender.hardware_id)"
    else:
      sender = "ExternalSystem($msg.sender.external_name)"
    print "Received message '$msg.payload.to_string' from $sender"
  1. 我有一个用 go/java/python/c#/dart/SCALA 编写的应用程序...使用 toit api,向主题“cloud:demo/INP”发送消息. 是所有订阅接收消息的 ESP32 设备都会收到消息,还是只有其中一个设备会收到消息?我猜每个人,虽然不确定。
  2. 现在让我们再添加一个名为“cloud:demo/OUT”的主题 OUT。
  3. 让我们更改 toit 应用程序,以便当它收到有关“cloud:demo/INP”主题的消息时,它会向“cloud:demo/OUT”主题发送消息并部署此应用程序在几个 ESP32 上:
import pubsub

INCOMING_TOPIC ::= "cloud:demo/INP"
OUTGOING_TOPIC ::= "cloud:demo/OUT"

main:
  print "app is started"
  pubsub.subscribe INCOMING_TOPIC --auto_acknowledge: | msg/pubsub.Message |
    print "received: $msg.payload.to_string"
    pubsub.publish OUTGOING_TOPIC msg.payload
    print "sent: $msg.payload.to_string"
  1. 让我们更改 go/dart/python ... 使用 toit api 的应用程序,使其不仅可以发送消息,还可以接收消息。 如果我现在向主题“cloud:demo/INP”发送一些消息,我会收到来自所有 ESP32 的消息吗?如果是这样,有没有办法确定接收到的消息属于哪个ESP32设备?

提前感谢您的回复

Toit PubSub 进行广播 - 所有设备都会收到消息。

关于主题发送的每条消息都包含一个 publisher,可以是 externaldevice

发布消息的 device 将拥有 hardware_idjob_id,这是确定发送消息的设备的唯一方式。我们还向外部订阅者发送 device_id.

发布消息的 external 将包含 name,这是发布消息的外部应用程序的标识符。例如,在 CLI 中,您可以使用以下方式编写消息:toit pubsub write <topic> <external-name> -- <msg> 这里 <external-name> 将填充到 publisher.external.name 属性.