< >
Home » Farmbot开发入门教程 » farmbot开发入门教程-识别成功与失败

farmbot开发入门教程-识别成功与失败

说明:

  • 想象一下编写一个软件包,rpc_request每五分钟发送一次单个节点。您只需等待设备的下rpc_ok一个节点,即可轻松跟踪 RPC 请求的状态。rpc_error

  • 但是,如果我们需要在一分钟内发送 100 个请求怎么办?识别成功或失败不再是一项简单的任务。对于导致部分失败的操作尤其如此,其中只有一部分请求成功。

  • 使用 HTTP 协议时,解决方案很简单 - 打开连接,启动请求,然后在完成后关闭连接。使用 MQTT 时情况会更复杂,MQTT 是一种持久的、基于会话的协议,其中许多请求通过同一个 TCP 套接字发送。

  • CeleryScript 作者可以通过为每个出站请求添加唯一的label参数来解决这个问题。您可以将其视为一种请求 ID

带标签 arg 的多路复用请求

  • FarmBot 能够通过单个 MQTT 通道发送许多命令。消息不遵循 HTTP 服务器的调用/响应周期。与 HTTP 不同,MQTT 连接是持久的全双工连接。如果您向 FarmBot 发送三个命令,它们可能不会按照收到的顺序返回。

  • 请求顺序 != 响应顺序:

     | BROWSER  Request "ABC"             DEVICE
     |        ------------------------->
     |          Request "DEF"
Time |        ------------------------->
     |          Request "GHI"
     |        ------------------------->
     |          Response to "DEF"
     |        <-------------------------
     v          Response to "ABC"
              <-------------------------
                Response to "GHI"
              <-------------------------
  • 为了弄清哪些消息已被确认,rpc_request、rpc_ok和rpc_error节点都包含一个label参数。label用作消息的唯一标识符。 为每个 RPC 消息分配唯一 ID 允许在到达时重新组合消息顺序

  • 对于rpc_error,它不仅允许我们指定发生了错误,还可以指定导致错误发生的命令。

例子

  • move_relative以下是通过 MQTT 向设备发送命令的示例。首先,将消息发布到 MQTT 通道/bot/device_123/from_clients:
{
  "kind": "rpc_request",
  "args": { "label": "adslkjhfalskdha" },
  "body": [
    { "kind": "move_relative", "args": { "x": 0, "y": 0, "z": 0, "speed": 100 } }
  ]
}
  • 一段时间后,机器人将在 MQTT 通道上响应/bot/device_123/from_device:
{
  "kind": "rpc_ok",
  "args": { "label": "adslkjhfalskdha" }
}
  • 请注意,label响应中的 与请求中的标签相匹配。发送请求时,任何唯一标识符都可以用作标签。强烈建议使用 UUID。

带外响应

  • FarmBot 处理的数据并非全部都可以作为 CeleryScript 传输。当 RPC 创建的数据格式不是 CeleryScript 时,响应被称为“带外响应”,这意味着它通过不支持 CeleryScript 的通道(通常是 REST API或消息代理上的状态通道)中继信息。

    take_photo 在REST API中创建图像资源。
    read_pin 更新机器人状态树并通过消息代理上的相应状态通道进行广播。
    read_status 强制机器人通过消息代理上的适当通道重新传输整个状态树。
    sync 使机器人在REST API上上传和下载新创建的资源。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: none