00. 设备列表
通过 HTTP REST API 发现所有已连接的Haply ——无需 WebSocket。这是一个简单的初步测试,用于验证运行时是否正常运行并能检测到硬件。
您将学到:
- 查询
GET /devices列出Inverse3、VerseGrip 和 Wireless VerseGrip 设备 - 从 JSON 响应中读取设备 ID,并按设备类型分组
- 使用会话选择器在原始设备坐标与会话的应用空间视图之间切换
工作流程
- 发送
GET http://localhost:10001/devices. - 解析 JSON 响应——包含三个顶级数组:
inverse3,verse_grip,wireless_verse_grip. - 按类型分组打印设备 ID。空数组表示未检测到该类型的设备。
- 如果一个 会话选择器 作为附件附上
?session=<selector>,响应会被过滤为该会话的设备,坐标会被转换为该会话的应用空间(应用了基面、安装面和工作空间)。Python 示例将此功能作为命令行参数提供;C++ 示例则不使用选择器进行查询。
参数
| 参数 | 默认 | 目的 |
|---|---|---|
| 服务网址 | http://localhost:10001 | HTTP 基础 URL |
| 端点 | /devices | 设备发现端点 |
| 会话选择器 | (无) | ?session=:0, ?session=:-1, ?session=:my_profile:0 — 参见 选择器. 在 Python 示例中作为 CLI 参数提供。 |
密钥代码
- Python
- C++ (nlohmann)
- C++ (Glaze)
该 Python 示例将会话选择器作为命令行参数提供。如果不指定该参数,返回的设备坐标为原始设备空间坐标;如果指定了该参数,则会将设备过滤为所选会话中的设备,并转换为应用程序空间坐标。
def main():
session = sys.argv[1] if len(sys.argv) > 1 else None
url = f"{BASE_URL}/devices"
if session:
url += f"?session={session}"
print(f"Querying devices for session '{session}' (application space)\n")
else:
print("Querying all detected devices (device space)\n")
r = requests.get(url, timeout=3)
r.raise_for_status()
data = r.json()
print_devices("Inverse3", data.get("inverse3"))
print_devices("Wired Verse Grip", data.get("verse_grip"))
print_devices("Wireless Verse Grip", data.get("wireless_verse_grip"))
C++ 版本使用 libhv 用于 HTTP,nlohmann/json 用于解析。它会手动检查每个顶级键,并使用 contains() 并遍历该数组(如果数组不为空)。C++ 示例未公开会话选择器 CLI 参数——append ?session=<selector> 如需应用程序空间坐标,请访问该网址。
HttpResponsePtr resp = requests::get("localhost:10001/devices");
if (resp == nullptr) { /* ... error ... */ return 1; }
json data = json::parse(resp->body);
if (data.contains("inverse3") && !data["inverse3"].empty()) {
printf("Inverse3 found:\n");
for (auto &element : data["inverse3"]) {
printf(" (id: %s)\n", element["device_id"].get<std::string>().c_str());
}
}
// ... same pattern for verse_grip and wireless_verse_grip
Glaze 变体声明了与 JSON 结构相匹配的普通结构体——Glaze 通过编译时反射来填充它们。不 contains() 需要检查:缺失的数组会被返回为空 std::vector<>.
static constexpr glz::opts glz_settings{.error_on_unknown_keys = false};
struct device_entry { std::string device_id; };
struct devices_response {
std::vector<device_entry> inverse3;
std::vector<device_entry> verse_grip;
std::vector<device_entry> wireless_verse_grip;
};
// In main():
HttpResponsePtr resp = requests::get("localhost:10001/devices");
devices_response data;
if (auto err = glz::read<glz_settings>(data, resp->body)) {
printf("JSON parse error: %s\n", glz::format_error(err, resp->body).c_str());
return 1;
}
for (const auto &dev : data.inverse3) {
printf(" (id: %s)\n", dev.device_id.c_str());
}