00. Geräteliste
Erkennt alle verbundenen Haply über die HTTP-REST-API – kein WebSocket erforderlich. Ein einfacher Funktionstest, um zu überprüfen, ob die Laufzeitumgebung läuft und Hardware erkennt.
Was Sie lernen werden:
- Abfragen
GET /devicesum die Geräte Inverse3, VerseGrip und Wireless VerseGrip aufzulisten - Auslesen der Geräte-IDs aus der JSON-Antwort, gruppiert nach Gerätetyp
- Verwendung eines Sitzungsselektors zum Wechseln zwischen den Rohkoordinaten des Geräts und der Ansicht im Anwendungsraum einer Sitzung
Arbeitsablauf
- Senden
GET http://localhost:10001/devices. - Die JSON-Antwort analysieren – drei Arrays auf oberster Ebene:
inverse3,verse_grip,wireless_verse_grip. - Gib die Geräte-IDs nach Typ gruppiert aus. Leere Arrays bedeuten, dass kein Gerät dieses Typs erkannt wurde.
- Wenn ein Sitzungsauswahl wird angehängt als
?session=<selector>Die Antwort wird auf die Geräte dieser Sitzung gefiltert, und die Koordinaten werden in den Anwendungsraum dieser Sitzung umgewandelt (Basis, Mount, Arbeitsbereich angewendet). Das Python-Beispiel stellt dies als CLI-Argument bereit; die C++-Beispiele führen die Abfrage ohne Selektor durch.
Parameter
| Parameter | Standard | Zweck |
|---|---|---|
| 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 — siehe Auswahlkriterien. Wird im Python-Beispiel als CLI-Argument bereitgestellt. |
Schlüsselcode
- Python
- C++ (nlohmann)
- C++ (Glaze)
Das Python-Beispiel stellt den Sitzungsselektor als CLI-Argument bereit. Ohne dieses Argument werden Geräte in rohen Koordinaten des Geräteraums zurückgegeben; mit diesem Argument werden sie auf die ausgewählte Sitzung gefiltert und in den Anwendungsraum konvertiert.
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"))
Die C++-Variante verwendet libhv für HTTP und nlohmann/json für die Analyse. Es überprüft jeden Schlüssel der obersten Ebene manuell mit contains() und durchläuft das Array, sofern es nicht leer ist. In den C++-Beispielen wird das CLI-Argument für die Sitzungsauswahl nicht bereitgestellt – anhängen ?session=<selector> zur URL, falls Sie Koordinaten im Anwendungsbereich 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-Struktur widerspiegeln – Glaze füllt sie mittels Reflection zur Kompilierungszeit. Nein contains() Zu überprüfende Punkte: Fehlende Arrays werden als leer zurückgegeben 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());
}
Quelle: Python · C++ · C++ Glaze
Siehe auch: JSON-Konventionen · Selektoren · Sitzungen