00. Liste des appareils
Recherche tous les appareils Haply connectés via l'API REST HTTP — cela fonctionne même sans WebSocket. Il s'agit d'un simple test de fonctionnement visant à vérifier que le runtime est en cours d'exécution et qu'il détecte bien le matériel.
Contenu pédagogique :
GET /devicesAppeler Inverse3 pour consulter la liste des appareils VerseGrip et VerseGrip sans fil- Lire l'identifiant de l'appareil dans la réponse JSON et le regrouper par type d'appareil
- Utilisation du sélecteur de sessionpour basculer entre les coordonnées brutes de l'appareil et la vue de l'espace applicatif de la session
Flux de travail
GET http://localhost:10001/devicesJ'envoie ma demande.- Analyse de la réponse JSON — Il y a trois tableaux de niveau supérieur :
inverse3,verse_grip,wireless_verse_grip. - Les identifiants des appareils sont affichés regroupés par type. Si le tableau est vide, cela signifie qu'aucun appareil de ce type n'a été détecté.
- Sélecteur de sessionle
?session=<selector>Pour préciser davantage, les réponses sont filtrées en fonction de l'appareil de la session concernée et les coordonnées sont converties dans l'espace applicatif de la session (en tenant compte des bases « basis », « mount » et « workspace »). L'exemple en Python illustre cela--session SELECTORDisponible via l'interface CLI (:profile:instance,#id,:-1,:0, … autorisé). Ce drapeau et le texte d'aide sont Tutoriel n° 8 (Configuration à distance via HTTP)Comme il s'agit du même sélecteur que celui utilisé là-bas, vous pouvez copier-coller tel quel le sélecteur trouvé ici. L'exemple en C++ effectue la requête sans sélecteur.
Paramètres
| Paramètres | Valeur par défaut | Utilisation |
|---|---|---|
| URL du service | http://localhost:10001 | URL HTTP par défaut |
| point d'extrémité | /devices | Point de terminaison de recherche d'appareils |
| Sélecteur de session | (aucun) | ?session=:0, ?session=:-1, ?session=:my_profile:0, ?session=co.haply.hub::*:0 (Prise en charge des caractères génériques « * ») — Sélecteur Remarque : dans l'exemple Python, --session SELECTORest visible (Tutoriel n° 08(avec le même indicateur). |
Code principal
- Python
- C++ (nlohmann)
- C++ (Glaze)
L'exemple Python utilise le sélecteur de session --session SELECTOR est exposé en tant qu’argument de `argparse`. En l’absence de cet argument, le périphérique est renvoyé sous forme de coordonnées brutes dans l’espace du périphérique ; si l’argument est spécifié, le périphérique est filtré en fonction de la session sélectionnée et converti dans l’espace de l’application. Le texte d’aide est Tutoriel n° 8 (Configuration à distance via HTTP)Comme c'est identique, vous pouvez copier-coller tel quel le sélecteur trouvé ici à cet endroit.
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"))
Les types C++ dans les communications HTTP libhvet utilise nlohmann/json pour l'analyse syntaxique. Chaque clé de niveau supérieur est contains()Vérifiez-le individuellement, et si le tableau n'est pas vide, parcourez-le. L'exemple en C++ n'expose pas les arguments CLI du sélecteur de session — si vous avez besoin des coordonnées de l'espace applicatif, ajoutez-les à l'URL ?session=<selector>Veuillez ajouter ceci.
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
La variante Glaze déclare des structures génériques qui reflètent fidèlement le format JSON — Glaze remplit ces structures via la réflexion à la compilation. contains() Il n'est pas nécessaire de vérifier. Les tableaux manquants sont vides. std::vector<>est renvoyé.
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());
}
Le tutoriel 00 est installé localement avec le SDK — dans le répertoire d'installation du service, sous tutorials/00-haply-inverse-device-list/Veuillez consulter cette page.
Source : Python · C++ · C++ Glaze
Documents associés : Conventions JSON · Sélecteurs · Session