00. Geräteliste
Alle angeschlossenen Haply-Geräte werden über die HTTP-REST-API erkannt (WebSocket ist nicht erforderlich). Dies ist ein einfacher Smoke-Test, um sicherzustellen, dass die Laufzeitumgebung gestartet ist und die Hardware erkannt wird.
Lerninhalte:
GET /devicesEine Abfrage durchführen, um eine Liste der Geräte „Inverse3“, „VerseGrip“ und „Wireless VerseGrip“ anzuzeigen- Die Geräte-ID aus der JSON-Antwort auslesen und nach Gerätetyp gruppieren
- Mit dem Sitzungsselektorzwischen den rohen Gerätekordinaten und der Ansicht im Anwendungsraum der Sitzung umschalten
Workflow
GET http://localhost:10001/devicessenden.- Die JSON-Antwort wird analysiert. 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, bedeutet dies, dass keine Geräte dieses Typs erkannt wurden.
- Sitzungsauswahlを
?session=<selector>Wenn man dies hinzufügt, wird die Antwort auf das Gerät dieser Sitzung eingegrenzt, und die Koordinaten werden in den Anwendungsraum (unter Anwendung von „basis“, „mount“ und „workspace“) umgewandelt. Im Python-Beispiel wird dies--session SELECTORals CLI-Argument veröffentlicht (:profile:instance、#id、:-1、:0(… werden entgegengenommen). Dies istTutorial 08 (HTTP-Fernkonfiguration)Da es sich um dieselben Flags und denselben Hilfetext handelt wie dort, können Sie die hier gefundenen Selektoren direkt in das entsprechende Tutorial einfügen. Das C++-Beispiel führt die Abfrage ohne Angabe eines Selektors durch.
Parameter
| Parameter | Standard | Verwendungszweck |
|---|---|---|
| Service-URL | 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ützt die Wildcards von glob) — SelektorSiehe dazu. Im Python-Beispiel gilt: --session SELECTOR wurde veröffentlicht als (Tutorial 08(mit demselben Flag). |
Wichtige Codes
- Python
- C++ (nlohmann)
- C++ (Glaze)
Im Python-Beispiel wird der Session-Selektor --session SELECTOR wird als argparse-Argument bereitgestellt. Wird dieses nicht angegeben, werden die Geräte in ihren rohen Geräteraumkoordinaten zurückgegeben. Bei Angabe wird die Ausgabe auf die Geräte der ausgewählten Sitzung eingegrenzt und in den Anwendungsraum umgewandelt. Der Hilfetext lautetTutorial 08 (HTTP-Fernkonfiguration)Da es sich um dasselbe handelt, können Sie den hier gefundenen Selektor unverändert in dasselbe Tutorial 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"))
In der C++-Variante wird für die HTTP-VerarbeitunglibhvZur Analyse von JSON verwenden wir nlohmann/json.contains() Mit dieser Funktion werden die Schlüssel der obersten Ebene manuell überprüft, und wenn das Array nicht leer ist, wird es durchlaufen. Im C++-Beispiel sind die CLI-Argumente des Session-Selektors nicht veröffentlicht. Wenn Koordinaten im Anwendungsraum benötigt werden, muss in der URL ?session=<selector> Bitte 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
In der Glaze-Variante wird eine einfache Struktur deklariert, die die Form von JSON widerspiegelt. Glaze setzt die Werte mithilfe von Reflection zur Kompilierungszeit.contains() Eine Überprüfung ist nicht erforderlich. Falls das Array nicht vorhanden ist, wird ein leeres 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());
}
Auch das Tutorial 00 ist zusammen mit dem SDK lokal installiert. Im Installationsverzeichnis des Dienstes unter tutorials/00-haply-inverse-device-list/ Bitte überprüfen Sie dies.
Quelle: Python · C++ · C++ Glaze
Siehe auch: JSON-Spezifikation · Selektoren · Sitzung