00. 機器一覧
HTTP-REST-API を通じて、接続済みのすべてのHaply デバイスを検出します。WebSocket は必要ありません。ランタイム環境がアクティブであるか、およびハードウェアが認識されているかを確認する、簡単なスモークテストです。
学習内容:
- からの照会
GET /devices、えーと、Inverse3 —、VerseGripおよびワイヤレスVerseGripデバイスの一覧を表示する - JSONレスポンスからデバイスIDを読み取り、デバイスタイプごとにグループ化する
- セッションセレクタを使用して、セッションの生のデバイス座標とアプリケーション空間ビューを切り替える
手順
- 送信してください
GET http://localhost:10001/devices. - JSONのレスポンスを解析します。最上位レベルには3つの配列があります:
inverse3,verse_grip,wireless_verse_grip. - デバイスIDをタイプ別にグループ分けして表示してください。空の配列は、そのタイプのデバイスが検出されなかったことを意味します。
- もしあるなら セッションセレクター als
?session=<selector>が指定されると、そのセッションのデバイスへの応答がフィルタリングされ、座標はそのアプリケーション空間に変換されます(基底、取り付け、およびワークスペースが適用されます)。Pythonのサンプルでは、これをCLI引数として指定しています。--session SELECTOR準備完了(承認済み):profile:instance,#id,:-1,:0, …) — これと同じフラグとヘルプテキストを使用し、 チュートリアル 08(HTTP リモート設定) が使用されているため、ここで見つかったセレクタをそのままそこに挿入することができます。C++のサンプルでは、セレクタを指定せずにクエリを実行しています。
パラメータ
| パラメータ | 標準 | Zweck |
|---|---|---|
| サービスURL | http://localhost:10001 | HTTPのベースURL |
| エンドポイント | /devices | デバイス検出のエンドポイント |
| セッションセレクター | (keiner) | ?session=:0, ?session=:-1, ?session=:my_profile:0, ?session=co.haply.hub::*:0 (グローバルプレースホルダーに対応) — 参照 セレクター. Pythonの例では、次のように --session SELECTOR 利用可能(同じフラグとして チュートリアル 08). |
重要なコード
- Python
- C++ (nlohmann)
- C++ (Glaze)
このPythonの例では、セッションセレクタをargparseの引数として指定しています --session SELECTOR bereit。この引数を指定しない場合、デバイスは生のデバイス座標で返されます。引数を指定すると、選択されたセッションに基づいてフィルタリングされ、アプリケーション空間に変換されます。ヘルプテキストは、 チュートリアル 08(HTTP リモート設定), そのため、ここで見つかったセレクタをそのままそこに挿入することができます。
def parse_args():
parser = argparse.ArgumentParser(
description="List connected Haply Inverse devices via the HTTP API.")
parser.add_argument(
"--session", type=str, default="",
help=(
"Session selector. Formats:\n"
" :profile:instance by profile name (e.g. ':my_profile:0')\n"
" pattern:instance glob wildcard in profile (e.g. 'co.haply.hub::*:0')\n"
" '*' matches any sequence, '?' one character\n"
" #session_id by numeric id (e.g. '#42' — quote in shells to escape '#')\n"
" :-1 the last active session\n"
" :0 the first session"
))
return parser.parse_args()
def main():
args = parse_args()
session = args.session or 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 引数は提供されていません。 ?session=<selector> アプリケーション空間での座標が必要な場合は、このURLを参照してください。
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の形式を反映した単純な構造体(Struct)が定義されており、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());
}
また、チュートリアル 00 は SDK とともにローカルにインストールされています。サービスのインストールディレクトリ内の tutorials/00-haply-inverse-device-list/ nach.