00. Liste des équipements
Répertorier tous les appareils connectés à Haply via l'API REST HTTP — sans avoir recours à WebSocket. Il s'agit d'un simple test de fonctionnement visant à vérifier que l'environnement d'exécution est bien lancé et capable de détecter le matériel.
Vous apprendrez :
- Recherche
GET /devicespour répertorier les appareils Inverse3, VerseGrip et VerseGrip sans fil - Lire les identifiants des appareils à partir de la réponse JSON et les regrouper par type d'appareil
- Utilisezle sélecteur de sessionpour basculer entre les coordonnées de l'équipement d'origine et la vue de l'espace d'application de la session
Processus de travail
- Envoyer
GET http://localhost:10001/devices。 - Analyse de la réponse JSON — Elle contient trois tableaux de niveau supérieur :
inverse3,verse_grip,wireless_verse_grip。 - Affiche les identifiants des périphériques d'impression par type. Si un tableau est vide, cela signifie qu'aucun périphérique de ce type n'a été détecté.
- Si l'on considère que
?session=<selector>Ajout d'un formatSélecteur de session, la réponse ne filtrera que les appareils de cette session et convertira les coordonnées dans leur espace d'application (après application des transformations « basis », « mount » et « workspace »). Exemple en Python :--session SELECTORCette fonctionnalité est disponible sous forme d'arguments de ligne de commande (les arguments acceptés sont:profile:instance,#id,:-1,:0, …) —— etTutoriel 08 (Configuration à distance via HTTP)Les paramètres utilisés sont identiques et les textes d'aide sont identiques ; par conséquent, le sélecteur trouvé ici peut être copié-collé directement là-bas. L'exemple en C++ n'utilise pas de sélecteur lors de la requête.
Paramètres
| Paramètres | Valeur par défaut | Utilisation |
|---|---|---|
| URL du service | http://localhost:10001 | URL de base HTTP |
| point d'extrémité | /devices | Détection des terminaux |
| 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 « glob ») — VoirSélecteur。Dans l'exemple Python, avec --session SELECTOR sous la forme de (par rapport àTutoriel n° 08(avec les mêmes paramètres). |
Code clé
- Python
- C++ (nlohmann)
- C++ (Glaze)
Exemple Python utilisant le sélecteur de session comme --session SELECTOR argparse. Si ce paramètre n'est pas spécifié, l'appareil renvoie ses coordonnées dans l'espace natif ; s'il est spécifié, l'appareil est filtré selon la session sélectionnée et converti dans l'espace de l'application. Le texte d'aide etTutoriel 08 (Configuration à distance via HTTP)C'est identique ; par conséquent, le sélecteur trouvé ici peut être copié-collé directement à 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"))
Utilisation des variantes en C++ libhv Traite les requêtes HTTP et utilise nlohmann/json pour les analyser. Il le fait via contains() Vérifiez manuellement chaque clé de niveau supérieur ; si le tableau n'est pas vide, parcourez-le. L'exemple en C++ ne fournit pas de paramètre de ligne de commande pour le sélecteur de session. Si vous souhaitez appliquer des coordonnées spatiales, ajoutez à la fin de l'URL ?session=<selector>。
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
Les variantes Glaze définissent des structures génériques conformes à la structure JSON — Glaze remplit automatiquement ces structures via la réflexion à la compilation. Il n'est pas nécessaire de contains() Vérification : les tableaux manquants seront remplacés par des tableaux vides std::vector<> Retour.
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 — vous le trouverez dans le répertoire d'installation du service tutorials/00-haply-inverse-device-list/。
Code source : Python · C++ · C++ Glaze
Contenu associé : Conventions JSON · Sélecteurs · Session