00. Geräteliste
Entdecke alle über die HTTP-REST-API verbundenen „ Haply “-Geräte – ganz ohne WebSocket. Ein Basistest, um zu überprüfen, ob die Laufzeitumgebung betriebsbereit ist und die Hardware erkennt.
Was Sie lernen werden:
- Befragen
GET /devicesUm die Geräte „ Inverse3 “, „VerseGrip“ und „VerseGrip kabellos“ aufzulisten - Die Gerätekennungen in der JSON-Antwort nach Gerätetyp gruppiert auslesen
- Verwenden Sie einen Sitzungsumschalter, um zwischen den Rohkoordinaten der Geräte und der Ansicht des Anwendungsraums einer Sitzung zu wechseln
Ablauf
- Senden
GET http://localhost:10001/devices. - Analysieren Sie die JSON-Antwort – drei Tabellen der obersten Ebene:
inverse3,verse_grip,wireless_verse_grip. - Zeigen Sie die Geräte-IDs nach Gerätetyp geordnet an. Eine leere Tabelle bedeutet, dass kein Gerät dieses Typs erkannt wurde.
- Wenn ein Sitzungsauswahl wird in folgender Form hinzugefügt:
?session=<selector>, wird die Antwort nach den Geräten dieser Sitzung gefiltert und die Koordinaten werden in den jeweiligen Anwendungsraum (angewandte Basis, Montage und Arbeitsraum) umgerechnet. Das Python-Beispiel stellt dies in Form eines CLI-Arguments dar--session SELECTOR(akzeptiert:profile:instance,#id,:-1,:0, …) — derselbe Indikator mit demselben Hilfetext wie der im Tutorial 08 (HTTP: Fernkonfiguration), sodass ein hier gefundener Selektor direkt dort eingefügt werden kann. Die C++-Beispiele führen die Abfrage ohne Selektor durch.
Einstellungen
| Parameter | Standardmäßig | Rolle |
|---|---|---|
| URL des Dienstes | http://localhost:10001 | HTTP-Basis-URL |
| Endpunkt | /devices | Endpunkt für die Geräteerkennung |
| Sitzungsauswahl | (keine) | ?session=:0, ?session=:-1, ?session=:my_profile:0, ?session=co.haply.hub::*:0 (unterstützte Platzhalterzeichen) — siehe Wahlschalter. Vortrag in Form von --session SELECTOR im Python-Beispiel (derselbe Indikator wie der Tutorial 08). |
Schlüsselcode
- Python
- C++ (nlohmann)
- C++ (Glaze)
Das Python-Beispiel stellt den Sitzungsselektor als Argparse-Argument dar. --session SELECTOR. Ohne ihn werden die Geräte an die Rohkoordinaten des Geräteraums zurückgegeben; mit ihm werden sie entsprechend der ausgewählten Sitzung gefiltert und in den Anwendungsraum konvertiert. Der Hilfetext entspricht dem des Tutorial 08 (HTTP: Fernkonfiguration), sodass ein hier gefundener Selektor direkt dort eingefügt werden kann.
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"))
Die C++-Variante verwendet libhv pour HTTP und nlohmann/json für die Analyse. Sie überprüft jeden Schlüssel der ersten Ebene manuell mit contains() und durchläuft das Array, sofern es nicht leer ist. In den C++-Beispielen wird das CLI-Argument des Session-Selektors nicht aufgeführt – fügen Sie ?session=<selector> unter der URL, falls Sie die Kontaktdaten des Anwendungsbereichs benötigen.
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
Die Glaze-Variante definiert einfache Strukturen, die die JSON-Form nachbilden – Glaze füllt diese zur Kompilierungszeit durch Reflexion aus. Keine Überprüfung contains() ist nicht erforderlich: Fehlende Tabellen werden leer in Form von 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());
}
Das Tutorial 00 wird ebenfalls lokal mit dem SDK installiert – siehe tutorials/00-haply-inverse-device-list/ im Installationsverzeichnis des Dienstes.
Quelle: Python · C++ · C++ Glaze
Siehe auch: JSON-Konventionen · Selektoren · Sitzungen