< >
Home » Farmbot开发入门教程 » farmbot开发入门教程-追踪运动

farmbot开发入门教程-追踪运动

说明:

  • 实时跟踪设备位置的各种方法

  • 一些第三方应用程序需要能够实时跟踪 FarmBot 的 XYZ 位置。Web App 中就是一个示例,其中浏览器快速重绘屏幕以显示设备移动的动画。

  • 不幸的是,您无法通过 Lua 或序列编辑器实时跟踪设备位置:

  • 除了SEND MESSAGE中的简单模板变量之外,序列编辑器没有跟踪位置的功能。
    由于 Lua 环境不支持并发操作,因此无法轻松地在 Lua 中跟踪位置。可以通过read_status()或get_xyz()读取机器人位置,但不是实时的。也就是说,您无法同时发送命令和读取位置。

  • 因此,如果您想实时跟踪 FarmBot 的位置,您必须编写使用MQTT、FarmBot.JS或FarmBot.py在设备外运行的软件。

使用 MQTT

  • FarmBot 使用MQTT传输有关其内部状态的数据。此数据包括位置信息。每次位置发生变化时都会重新广播。读取此信息的最基本方法是使用 MQTT 客户端(如MQTTx)或 MQTT 库(如Paho MQTT)。

  • 在第一个示例中,我们将尝试使用 MQTT 客户端直接连接到 FarmBot。这种方法的主要优点是它可以在任何支持 MQTT 的编程语言中工作。主要缺点是这种方法比 FarmBot.js 或 FarmBot.py 更难设置。

步骤 1:通过(或类似方式)生成令牌

  • FarmBot MQTT 需要身份验证才能读取或写入 MQTT 主题。在访问设备之前,我们必须创建一个访问令牌。

  • 现在让我们使用Curl HTTP 库创建一个令牌:

curl -H "Content-Type: application/json" \
     -X POST \
     -d '{"user":{"email":"test123@test.com","password":"password123"}}' \
     https://my.farm.bot/api/tokens
  • 这将生成一个类似以下示例的令牌

  • 请特别注意mqtt、bot和encoded属性——您需要这些属性才能登录到服务器!

{
  "token": {
    "unencoded": {
      "aud": "unknown",
      "sub": 123,
      "iat": 1639316558,
      "jti": "123456789",
      "iss": "//my.farm.bot:443",
      "exp": 1644500558,
      // IMPORTANT: This is the URL to the MQTT server:
      "mqtt": "clever-octopus.rmq.cloudamqp.com",
      // IMPORTANT: This is your username for logging on to
      //            the MQTT server:
      "bot": "device_456",
      "vhost": "xiconfum",
      "mqtt_ws": "wss://clever-octopus.rmq.cloudamqp.com:443/ws/mqtt"
    },
    // IMPORTANT: This is your password for the MQTT server.
    //            The real version will be much longer.
    "encoded": "02a87204c263427b994d772a52ab2ba9"
  },
  "user": {
    "id": 123,
    "device_id": 456,
    "name": "example",
    "email": "example@example.com",
    "created_at": "2020-06-23T15:31:34.499Z",
    "updated_at": "2021-12-10T21:48:01.446Z",
    "agreed_to_terms_at": "2020-06-23T15:31:34.381Z",
    "inactivity_warning_sent_at": null
  }
}

步骤 2:连接到 MQTT

  • 现在我们有了访问令牌,我们可以连接到 MQTT 服务器。

  • 使用您选择的 MQTT 客户端或库连接到服务器:

    • mqtt服务器 URL 是身份验证令牌属性中的 URL 。clever-octopus.rmq.cloudamqp.com如上例所示。
    • 非安全 MQTT 的端口是 1883。安全 MQTT 使用端口 8883。
    • 您的用户名是bot您的身份验证令牌的属性。device_456如上例所示。
    • 您的密码是encoded来自身份验证令牌的属性。如上02a87204c263427b994d772a52ab2ba9例所示。注意:如果您使用的是基于浏览器的 MQTT 客户端,则必须使用属性mqtt_ws而不是mqtt。
  • MQTTx 中看到的 MQTT 设置的屏幕截图如下所示:

请输入图片描述

步骤 3:订阅“状态”主题

  • FarmBot 将通过各种 MQTT 主题发送和接收信息。我们在本例中关注的主题是“状态”主题,它在一个大型 JSON 对象中广播有关设备的所有信息。主题名称取决于您的设备 ID。如果您的设备 ID 是device_456,那么您将订阅:
bot/device_456/status
  • 每次机器人的内部状态发生变化时,您的 MQTT 客户端现在都会收到一个新的状态对象。

  • 关于设备状态更新需要注意以下几点:

    • 状态对象被编码为 JSON。
    • 设备状态可能因多种原因而改变。设备移动只是其中一个原因,尽管还有许多其他可能的原因触发状态广播(例如引脚值变化)。
    • 最后广播的状态消息始终是最有效的。
    • 设备永远不会广播状态更新的原因。编写良好的基于​​事件的应用程序不需要知道状态更新的原因。您可以通过将上次状态更新与当前状态更新进行比较来跟踪更改。

步骤 4:解析传入数据

  • 现在您的 MQTT 客户端已连接,您将开始看到状态对象。它们看起来如下所示:

  • 对于我们的用例来说,最重要的属性是location_data.position对象:

{
  "mcu_params": { /* Redacted for clarity */ },
  "process_info": { /* Redacted for clarity */ },
  "user_env": { /* Redacted for clarity */ },
  "jobs": { /* Redacted for clarity */ },
  "pins": { /* Redacted for clarity */ },
  "configuration": { /* Redacted for clarity */ },
  "informational_settings": { "busy": false },
  // IMPORTANT: The data below shows the bot's XYZ position.
  //            a new object will be sent every time the bot
  //            moves.
  "location_data": {
    "position": {
      "x": 358.0,
      "y": 540.8,
      "z": 0.0
    }
  },
}
  • 还有许多有用的状态属性可用,例如informational_settings.busy。

使用 FarmBotJS

  • 对于不熟悉该协议的用户来说,处理原始 MQTT 连接很困难。我们编写了一个 Javascript 和 Python 包装器库。FarmBotJS是支持 FarmBot Web App 的库。它非常稳定和成熟。对于 2022 年及以后构建新项目的开发人员来说,FarmBotJS 是一个绝佳的首选。

  • 下面提供了一个用 Javascript 编写的示例。请参阅官方 FarmBotJS 文档了解更多详细信息。

const Farmbot = require("farmbot").Farmbot;

const fb = new Farmbot({ token: "---REDACTED---" });

// IMPORTANT: The `status` object has the same shape as in
//            the MQTT version.
//            This function is called every time the device
//            state changes.
fb.on("status", (status) => {
  const pos = status.location_data.position;
  console.log(`FarmBot Position: (${pos.x}, ${pos.y}, ${pos.z})`);
});

// IMPORTANT: FBJS will not connect to the MQTT client automatically.
fb.connect();
  • 在 NodeJS 中运行上述代码后,你应该看到以下输出:
FarmBot Position: (358, 540.8, 0)
FarmBot Position: (358, 540.8, 0)
FarmBot Position: (358, 540.8, 0)

使用 FarmBotPy

  • FarmBot, Inc. 还提供了 Python 包装器库。您可以在Python 库页面上了解有关 Python 版本的更多信息
from farmbot import Farmbot, FarmbotToken

raw_token = FarmbotToken.download_token("test@example.com",
                                        "password",
                                        "https://my.farm.bot")

fb = Farmbot(raw_token)

class MyHandler:
    def on_connect(self, bot, mqtt_client):
        pass

    def on_response(self, bot, response):
        pass

    def on_error(self, bot, response):
        pass

    def on_log(self, bot, log):
        pass

    def on_change(self, bot, state):
        print("NEW BOT STATE TREE AVAILABLE:")
        print(state)
        print("Current position: (%.2f, %.2f, %.2f)" % bot.position())

fb.connect(MyHandler())
  • 运行上述代码后你应该看到以下输出:
NEW BOT STATE TREE AVAILABLE:
{...}
Current position: (358.00, 540.80, 0.00)

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

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


标签: none