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)
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号