00. Geräteliste
Erkennen Sie alle verbundenen „ Haply “-Geräte über die HTTP-REST-API – ganz ohne WebSocket. Dies ist ein einfacher „Smoke Test“, mit dem überprüft wird, ob die Laufzeitumgebung gestartet wurde und die Hardware erkannt werden kann.
Sie werden Folgendes lernen:
- Abfrage
GET /devicesAuflistung der Geräte „ Inverse3“, „VerseGrip“ und „Wireless VerseGrip“ - Die Geräte-IDs aus der JSON-Antwort auslesen und nach Gerätetyp gruppieren
- VerwendenSie den Sitzungswähler, um zwischen den Koordinaten des Originalgeräts und der Ansicht des Anwendungsraums der Sitzung zu wechseln.
Arbeitsablauf
- Senden
GET http://localhost:10001/devices。 - Analyse der JSON-Antwort – enthält drei Arrays auf oberster Ebene:
inverse3、verse_grip、wireless_verse_grip。 - Geräte-IDs nach Typ auflisten. Ist ein Array leer, bedeutet dies, dass keine Geräte dieses Typs erkannt wurden.
- Wenn man
?session=<selector>Formular hinzufügenSitzungsauswahl… Die Antwort filtert nur die Geräte dieser Sitzung heraus und wandelt die Koordinaten in deren Anwendungsraum um (wobei die Transformationen „basis“, „mount“ und „workspace“ bereits angewendet wurden). Ein Python-Beispiel finden Sie unter--session SELECTORDiese Funktion wird über Befehlszeilenargumente bereitgestellt (akzeptiert:profile:instance、#id、:-1、:0、…)——mitTutorial 08 (HTTP-Fernkonfiguration)Die verwendeten Parameter sind identisch, und auch die Hilfetexte stimmen überein, sodass der hier gefundene Selektor direkt dort eingefügt werden kann. Im C++-Beispiel wird bei der Abfrage kein Selektor verwendet.
Parameter
| Parameter | Standardwert | Verwendungszweck |
|---|---|---|
| Dienst-URL | http://localhost:10001 | HTTP-Basis-URL |
| Endpunkt | /devices | Endpunkte für die Geräteerkennung |
| Sitzungsauswahl | (keine) | ?session=:0、?session=:-1、?session=:my_profile:0、?session=co.haply.hub::*:0(Unterstützt „glob“-Platzhalter) – sieheSelektor。Im Python-Beispiel mit --session SELECTOR in Form von (im Vergleich zuTutorial 08(gleiche Parameter). |
Wichtiger Code
- Python
- C++ (nlohmann)
- C++ (Glaze)
Python-Beispiel: Verwendung des Sitzungsselektors als --session SELECTOR argparse-Parameter. Wird dieser Parameter nicht angegeben, gibt das Gerät die Koordinaten im ursprünglichen Geräteraum zurück; bei Angabe wird das Gerät auf die ausgewählte Sitzung gefiltert und in den Anwendungsraum umgewandelt. Hilfetexte undTutorial 08 (HTTP-Fernkonfiguration)Da es sich um denselben Selektor handelt, kann der hier gefundene Selektor direkt dort eingefügt werden.
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"))
Verwendung von Varianten in C++ libhv Verarbeitet HTTP und parst die Daten mit nlohmann/json. Dies geschieht über contains() Überprüfen Sie jeden Schlüssel der obersten Ebene manuell; wenn das Array nicht leer ist, durchlaufen Sie das Array. Das C++-Beispiel bietet keine Befehlszeilenargumente für den Sitzungsselektor – um Raumkoordinaten anzuwenden, fügen Sie bitte am Ende der URL Folgendes hinzu: ?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-Varianten definieren einfache Strukturen, die mit der JSON-Struktur übereinstimmen – Glaze füllt diese Strukturen automatisch mittels Reflection zur Kompilierungszeit aus. Es ist keine contains() Prüfung: Fehlende Arrays werden durch leere std::vector<> Zurück.
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 wird ebenfalls zusammen mit dem SDK lokal installiert – bitte suchen Sie es im Installationsverzeichnis des Dienstes. tutorials/00-haply-inverse-device-list/。
Quellcode: Python · C++ · C++ Glaze
Verwandte Themen: JSON-Konventionen · Selektoren · Sitzungen