00. 기기 목록
WebSocket 없이 HTTP REST API를 통해 연결된 모든 Haply 기기를 확인해 보세요. 실행 환경이 정상적으로 작동하고 하드웨어를 감지하는지 확인하기 위한 기본 테스트입니다.
이 강좌에서 배우게 될 내용:
- 심문하다
GET /devicesInverse3, VerseGrip 및 무선 VerseGrip 기기를 확인하려면 - JSON 응답에서 기기 유형별로 분류된 기기 식별자를 확인합니다.
- 세션 선택기를 사용하여 기기의 원시 좌표와 세션의 애플리케이션 공간 보기 간을 전환하기
진행 과정
- 보내기
GET http://localhost:10001/devices. - JSON 응답 분석 — 최상위 레벨의 세 가지 테이블:
inverse3,verse_grip,wireless_verse_grip. - 기기 유형별로 분류된 기기 식별자를 표시합니다. 표가 비어 있다면 해당 유형의 기기가 감지되지 않았음을 의미합니다.
- 만약 한 세션 선택기 다음과 같은 형식으로 추가됩니다.
?session=<selector>, 응답은 해당 세션의 장치에 따라 필터링되며, 좌표는 해당 적용 공간(적용된 기저 공간, 조립 공간 및 작업 공간)으로 변환됩니다. Python 예제에서는 이를 CLI 인수 형태로 보여줍니다.--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 (지원되는 와일드카드) — 참조 선택기. 다음 형식으로 공개됨 --session SELECTOR Python 예제에서 (와 동일한 지표인 튜토리얼 08). |
비밀번호
- 파이썬
- C++ (nlohmann)
- C++ (Glaze)
이 Python 예제는 세션 선택기를 argparse 인자로 노출합니다. --session SELECTOR. 이 옵션이 없으면 데이터는 기기 좌표계의 원시 좌표로 반환되지만, 이 옵션을 사용하면 선택한 세션에 따라 필터링되어 애플리케이션 좌표계로 변환됩니다. 도움말 문구는 다음의 내용과 동일합니다. 튜토리얼 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++ 예제에는 세션 선택기의 CLI 인수가 포함되어 있지 않습니다. 다음을 추가하세요. ?session=<selector> 애플리케이션 공간의 연락처 정보가 필요하시면 해당 URL을 참조하십시오.
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/ 서비스 설치 디렉터리에서.