00. Liste des appareils
Détecte tous les appareils Haply connectés via l'API REST HTTP (WebSocket n'est pas nécessaire). Il s'agit d'un test de fonctionnement simple permettant de vérifier que l'environnement d'exécution est lancé et que le matériel est bien détecté.
Contenu pédagogique :
GET /devicesEffectuer une requête pour afficher la liste des appareils «Inverse3», « VerseGrip » et « VerseGrip sans fil »- Lire l'identifiant de l'appareil à partir de la réponse JSON et regrouper les appareils par type.
- Utiliser le 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/devicesJe vais l'envoyer.- Nous analysons la réponse JSON. Il y a trois tableaux de niveau supérieur :
inverse3,verse_grip,wireless_verse_grip。 - Les identifiants des périphériques sont regroupés par type et affichés. Si le tableau est vide, cela signifie qu'aucun périphérique de ce type n'a été détecté.
- Sélecteur de sessionを
?session=<selector>Lorsqu'on l'ajoute, la réponse est limitée à l'appareil de cette session, et les coordonnées sont converties dans l'espace de l'application (en appliquant les systèmes de référence « basis », « mount » et « workspace »). Dans l'exemple Python, cela se traduit par--session SELECTORNous le proposons en tant qu'argument de ligne de commande (CLI) (:profile:instance,#id,:-1,:0(… sont acceptées). Il s'agit deTutoriel n° 8 (Configuration à distance via HTTP)Comme il s'agit des mêmes indicateurs et des mêmes textes d'aide que ceux utilisés dans ce tutoriel, vous pouvez copier-coller tels quels les sélecteurs que vous trouverez ici dans ce même tutoriel. L'exemple en C++ effectue la requête sans spécifier de sélecteur.
Paramètres
| Paramètres | Par défaut | Utilisation |
|---|---|---|
| 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(Compatible avec les caractères génériques de glob) — SélecteurVeuillez vous y référer. Dans l'exemple en Python, --session SELECTOR est publié sous le titre (Tutoriel n° 08(avec le même indicateur). |
Code principal
- Python
- C++ (nlohmann)
- C++ (Glaze)
Dans l'exemple Python, le sélecteur de session est --session SELECTOR est disponible en tant qu'argument argparse. Si ce paramètre n'est pas spécifié, le périphérique est renvoyé avec ses coordonnées brutes dans l'espace du périphérique. S'il est spécifié, le résultat est limité aux périphériques de la session sélectionnée et converti dans l'espace de l'application. Le texte d'aide estTutoriel n° 8 (Configuration à distance via HTTP)Comme c'est identique, vous pouvez copier-coller tel quel le sélecteur trouvé ici dans ce tutoriel.
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"))
Dans la variante C++, pour le traitement HTTP,libhvPour l'analyse JSON, nous utilisons nlohmann/json.contains() Vérifiez manuellement chaque clé de premier niveau et, si le tableau n'est pas vide, parcourez-le. Dans l'exemple en C++, les arguments CLI du sélecteur de session ne sont pas exposés. Si vous avez besoin des coordonnées de l'espace d'application, ajoutez à l'URL ?session=<selector> Veuillez l'ajouter.
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
Dans la variante Glaze, on déclare une structure simple qui reflète la structure JSON. Glaze utilise la réflexion à la compilation pour attribuer les valeurs.contains() Il n'est pas nécessaire de vérifier cela. Si le tableau n'existe pas, un tableau vide 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 également installé localement avec le SDK. Dans le répertoire d'installation du service, sous tutorials/00-haply-inverse-device-list/ Veuillez vérifier.
Source : Python · C++ · C++ Glaze
Voir aussi : Spécifications JSON · Sélecteurs · Session