00. Geräteliste
Sucht alle über die HTTP-REST-API verbundenen Haply -Geräte – auch ohne WebSocket. Dies ist ein einfacher Smoke-Test, um zu überprüfen, ob die Laufzeitumgebung läuft und die Hardware erkannt wird.
Lerninhalte:
GET /devicesAufruf von Inverse3, VerseGrip, Abfrage der Liste der drahtlosen VerseGrip-Geräte- Aus der JSON-Antwort die Geräte-ID auslesen und nach Gerätetyp gruppieren
- Mit dem Sitzungsselektorzwischen den Rohkoordinaten des Geräts und der Ansicht im Anwendungsraum der Sitzung wechseln
Workflow
GET http://localhost:10001/devicesIch sende die Anfrage.- Die JSON-Antwort wird geparst – es gibt drei Arrays auf oberster Ebene:
inverse3,verse_grip,wireless_verse_grip. - Die Geräte-IDs werden nach Typ gruppiert und ausgegeben. Ist das Array leer, wurden keine Geräte dieses Typs erkannt.
- Sitzungsauswahl를
?session=<selector>Was das Format betrifft, so werden die Antworten auf die Geräte der jeweiligen Sitzung gefiltert und die Koordinaten in den Anwendungsraum der Sitzung (unter Berücksichtigung von Basis, Mount und Arbeitsbereich) umgewandelt. Das Python-Beispiel veranschaulicht dies--session SELECTORWird über die Befehlszeile bereitgestellt (:profile:instance,#id,:-1,:0, … zulässig). Dieses Flag und der Hilfetext lauten Tutorial 08 (HTTP-Fernkonfiguration)Da es sich um dasselbe handelt wie das dort verwendete, können Sie den hier gefundenen Selektor unverändert dort einfügen. Das C++-Beispiel führt die Abfrage ohne Selektor durch.
Parameter
| Parameter | Standardwert | Verwendungszweck |
|---|---|---|
| Service-URL | http://localhost:10001 | HTTP-Standard-URL |
| Endpunkt | /devices | Endpunkt für die Gerätesuche |
| Sitzungsauswahl | (keine) | ?session=:0, ?session=:-1, ?session=:my_profile:0, ?session=co.haply.hub::*:0 (Unterstützung für Glob-Wildcards) — Selektor Hinweis: Im Python-Beispiel --session SELECTORwird angezeigt (Tutorial 08(dasselbe Flag). |
Kerncode
- Python
- C++ (nlohmann)
- C++ (Glaze)
Das Python-Beispiel verwendet den Session-Selektor --session SELECTOR wird als „argparse“-Argument bereitgestellt. Fehlt dieses Argument, wird das Gerät in den Rohkoordinaten des Geräteraums zurückgegeben; wird das Argument angegeben, wird das Ergebnis auf das Gerät der ausgewählten Sitzung gefiltert und in den Anwendungsraum umgewandelt. Der Hilfetext lautet Tutorial 08 (HTTP-Fernkonfiguration)Da dies identisch ist, können Sie den hier gefundenen Selektor dort unverändert einfügen.
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++-Varianten für die HTTP-Kommunikation libhvwird verwendet, und zum Parsen kommt nlohmann/json zum Einsatz. Jeder oberste Schlüssel wird contains()… einzeln überprüft und, sofern das Array nicht leer ist, durchlaufen. Das C++-Beispiel macht die CLI-Argumente des Session-Selektors nicht sichtbar – falls Koordinaten im Anwendungsraum benötigt werden, müssen diese in der URL angegeben werden ?session=<selector>Fügen Sie dies hinzu.
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-Varianten deklarieren allgemeine Strukturen, die das JSON-Format unverändert widerspiegeln – Glaze füllt diese Strukturen mittels Reflection zur Kompilierungszeit aus. contains() Eine Überprüfung ist nicht erforderlich. Fehlende Arrays sind leer. std::vector<>wird zurückgegeben.
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());
}
Das Tutorial 00 ist zusammen mit dem SDK lokal installiert – im Installationsverzeichnis des Dienstes unter tutorials/00-haply-inverse-device-list/Bitte sehen Sie dort nach.
Quelle: Python · C++ · C++ Glaze
Verwandte Dokumente: JSON-Konventionen · Selektoren · Sitzungen