00. Liste des appareils
Détecte tous Haply connectés via l'API REST HTTP — aucun WebSocket n'est nécessaire. Un simple test de fonctionnement permettant de vérifier que l'environnement d'exécution est opérationnel et détecte le matériel.
Ce que vous apprendrez :
- Interrogation
GET /devicespour répertorier les appareils Inverse3, VerseGrip et Wireless VerseGrip - Lecture des identifiants des appareils dans la réponse JSON, regroupés par type d'appareil
- Utilisation d'un sélecteur de session pour basculer entre les coordonnées brutes du périphérique et la vue dans l'espace applicatif d'une session
Flux de travail
- Envoyer
GET http://localhost:10001/devices. - Analyser la réponse JSON — trois tableaux de niveau supérieur :
inverse3,verse_grip,wireless_verse_grip. - Affichez les identifiants des périphériques regroupés par type. Les tableaux vides indiquent qu'aucun périphérique de ce type n'a été détecté.
- Si un sélecteur de session est joint en annexe sous la forme
?session=<selector>, la réponse est filtrée pour les appareils de cette session et les coordonnées sont converties dans son espace d'application (base, montage, espace de travail appliqués). L'exemple Python expose cela sous la forme d'un--session SELECTORArgument de ligne de commande (accepte:profile:instance,#id,:-1,:0, …) — le même indicateur avec le même texte d'aide que Tutoriel 08 (Configuration à distance HTTP) utilisations ; ainsi, un sélecteur trouvé ici peut être copié-collé directement là-bas. Les exemples en C++ effectuent la requête sans sélecteur.
Paramètres
| Paramètres | Par défaut | Objectif |
|---|---|---|
| URL du service | http://localhost:10001 | URL de base HTTP |
| Point d'extrémité | /devices | Point de terminaison de détection des périphériques |
| Sélecteur de session | (aucun) | ?session=:0, ?session=:-1, ?session=:my_profile:0, ?session=co.haply.hub::*:0 (caractères génériques « * » pris en charge) — voir Sélecteurs. Dévoilé comme --session SELECTOR dans l'exemple Python (même indicateur que Tutoriel 08). |
Code d'accès
- Python
- C++ (nlohmann)
- C++ (Glaze)
L'exemple Python expose le sélecteur de session sous la forme d'un --session SELECTOR argument argparse. Sans cet argument, les périphériques sont renvoyés sous forme de coordonnées brutes dans l'espace périphérique ; avec cet argument, ils sont filtrés en fonction de la session sélectionnée et convertis dans l'espace applicatif. Le texte d'aide correspond à Tutoriel 08 (Configuration à distance HTTP) ainsi, un sélecteur trouvé ici peut être collé directement là-bas.
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"))
La variante C++ utilise libhv pour HTTP et nlohmann/json pour l'analyse. Il vérifie manuellement chaque clé de premier niveau avec contains() et parcourt le tableau s'il n'est pas vide. Les exemples en C++ ne prennent pas en charge l'argument CLI « session-selector » — ajouter ?session=<selector> à l'URL si vous avez besoin des coordonnées de l'espace d'application.
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 simples qui reflètent la structure JSON — Glaze les remplit par réflexion à la compilation. Non contains() Vérifications nécessaires : les tableaux manquants sont renvoyés comme vides 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());
}
Le didacticiel 00 est également installé localement avec le SDK — consultez le répertoire tutorials/00-haply-inverse-device-list/ dans le répertoire d'installation du service.
Source : Python · C++ · C++ Glaze
À lire également : Conventions JSON · Sélecteurs · Sessions