00. 장비 목록
HTTP REST API를 통해 연결된 모든 Haply 기기를 확인합니다. WebSocket은 필요하지 않습니다. 이는 런타임이 시작되었고 하드웨어를 감지할 수 있는지 확인하기 위한 간단한 초기 테스트입니다.
다음 내용을 배우게 됩니다:
- 조회
GET /devicesInverse3, VerseGrip 및 무선 VerseGrip 기기를 나열합니다. - JSON 응답에서 기기 ID를 읽어와 기기 유형별로 그룹화합니다.
- 세션 선택기를사용하여 원본 장비 좌표계와 세션의 적용 공간 뷰 간을 전환합니다.
업무 흐름
- 보내기
GET http://localhost:10001/devices。 - JSON 응답 분석 — 세 개의 최상위 배열이 포함되어 있습니다:
inverse3、verse_grip、wireless_verse_grip。 - 장치 ID를 유형별로 출력합니다. 특정 배열이 비어 있다면, 해당 유형의 장치가 감지되지 않았음을 의미합니다.
- 만약 ~라면
?session=<selector>형식 추가대화 선택기,반환된 결과에는 해당 세션의 기기만 필터링되며, 좌표는 해당 애플리케이션 공간으로 변환됩니다(basis, mount, workspace 변환이 이미 적용된 상태). Python 예제는--session SELECTOR이 기능은 명령줄 인자 형식으로 제공됩니다(다음과 같은 형식을 지원함:profile:instance、#id、:-1、:0、…)——와튜토리얼 08 (HTTP 원격 구성)사용된 매개변수가 동일하고 도움말 텍스트도 일치하므로, 여기에서 찾은 선택기를 그대로 거기에 붙여넣을 수 있습니다. C++ 예제에서는 쿼리 시 선택기를 사용하지 않습니다.
매개변수
| 매개변수 | 기본값 | 용도 |
|---|---|---|
| 서비스 URL | http://localhost:10001 | HTTP 기본 URL |
| 단말점 | /devices | 장치 탐지 엔드포인트 |
| 대화 선택기 | (없음) | ?session=:0、?session=:-1、?session=:my_profile:0、?session=co.haply.hub::*:0(glob 와일드카드 지원) — 참조:선택기。Python 예제에서는 --session SELECTOR ~의 형태로 제공됩니다 (~와튜토리얼 08(동일한 매개변수). |
핵심 코드
- 파이썬
- C++ (nlohmann)
- C++ (Glaze)
이 파이썬 예제에서는 세션 선택기를 --session SELECTOR argparse 매개변수를 통해 제공됩니다. 이 매개변수를 지정하지 않으면 장치는 원본 장치 공간 좌표로 반환되며, 지정할 경우 장치는 선택된 세션으로 필터링되어 애플리케이션 공간으로 변환됩니다. 도움말 텍스트는튜토리얼 08 (HTTP 원격 구성)일치하므로, 여기서 찾은 선택기를 그대로 그곳에 붙여넣을 수 있습니다.
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"))
C++ 변형체 사용 libhv HTTP를 처리하고 nlohmann/json을 사용하여 파싱합니다. 이는 contains() 각 최상위 키를 수동으로 확인하고, 배열이 비어 있지 않으면 해당 배열을 순회합니다. C++ 예제에서는 세션 선택기 명령줄 인수를 제공하지 않습니다. 공간 좌표를 적용하려면 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
Glaze 변형은 JSON 구조와 일치하는 일반 구조체를 선언하며, Glaze는 컴파일 시점 리플렉션을 통해 이러한 구조체를 자동으로 채웁니다. 별도의 작업이 필요하지 않습니다. contains() 검증: 누락된 배열은 빈 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());
}
튜토리얼 00도 SDK와 함께 로컬에 설치됩니다. 서비스 설치 디렉터리에서 찾아보시기 바랍니다. tutorials/00-haply-inverse-device-list/。