ํ๋ก ํธ์๋ ์น ๊ฐ๋ฐ์์ ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ง ๋ฐ ์ฅ์น ๊ธฐ๋ฅ ๋ฐ๊ฒฌ์ ์ํด WebHID API๋ฅผ ํ์ฉํ๋ ์ข ํฉ ๊ฐ์ด๋. ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํด ํน์ ํ๋์จ์ด ๊ธฐ๋ฅ์ ์๋ณํ๊ณ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
ํ๋ก ํธ์๋ WebHID ๊ธฐ๋ฅ ํ์ง: ์ฅ์น ๊ธฐ๋ฅ ๋ฐ๊ฒฌ ๋ง์คํฐํ๊ธฐ
WebHID API๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ค์ํ ํด๋จผ ์ธํฐํ์ด์ค ์ฅ์น(HID)์ ์ง์ ์ํธ์์ฉํ ์ ์๋ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค. ๊ธฐ๋ณธ์ ์ธ ํต์ ์ ๊ฐ๋จํ์ง๋ง, ์ ์ฌ๋ ฅ์ ์ง์ ์ผ๋ก ๋ฐํํ๋ ค๋ฉด ์ฅ์น ๊ธฐ๋ฅ์ ํจ๊ณผ์ ์ผ๋ก ํ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ๊ธ์ WebHID๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฅ ํ์ง์ ๋ํ ์ข ํฉ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ์ฌ, ๋ ํ๋ถํ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ ๋ง์ถคํ๋ ์น ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋๋ก ๋์ต๋๋ค.
WebHID๋ ๋ฌด์์ด๋ฉฐ ๊ธฐ๋ฅ ํ์ง๊ฐ ์ ์ค์ํ๊ฐ?
WebHID๋ ์น์ฌ์ดํธ๊ฐ ํค๋ณด๋, ๋ง์ฐ์ค๋ถํฐ ๊ฒ์ ์ปจํธ๋กค๋ฌ, ์ผ์, ๋ง์ถคํ ํ๋์จ์ด์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ HID ์ฅ์น์ ์ ๊ทผํ ์ ์๊ฒ ํด์ฃผ๋ ์น API์ ๋๋ค. ํ์คํ๋ ์ธํฐํ์ด์ค์ ์์กดํ๋ ๊ธฐ์กด ์น API์ ๋ฌ๋ฆฌ, WebHID๋ ์ฅ์น์ ์์ ๋ฐ์ดํฐ ๋ฐ ์ ์ด ๋ฉ์ปค๋์ฆ์ ์ง์ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ HID ์ฅ์น๊ฐ ๋งค์ฐ ๋ค์ํ๋ค๋ ์ ์ ๋๋ค. ํ ์ ์กฐ์ ์ฒด์ ๊ฒ์ํจ๋๋ ๋ค๋ฅธ ์ ์กฐ์ ์ฒด์ ๊ฒ๊ณผ ๋ค๋ฅธ ๋ฒํผ, ์ถ ๋๋ ์ผ์๋ฅผ ๋ ธ์ถํ ์ ์์ต๋๋ค. ๋ง์ถคํ ์ฐ์ ์ฉ ์ผ์๋ ๊ณ ์ ํ ๋ฐ์ดํฐ ํ์์ด๋ ๊ตฌ์ฑ ์ต์ ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ธฐ๋ฅ ํ์ง๋ฅผ ์ํ ๊ฒฌ๊ณ ํ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์ ์ ์์กดํ ์๋ฐ์ ์์ผ๋ฉฐ, ์ด๋ ํธํ์ฑ ๋ฌธ์ , ์ ํ๋ ๊ธฐ๋ฅ, ๊ทธ๋ฆฌ๊ณ ์ข์ง ์์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๊ธฐ๋ฅ ํ์ง๋ ์ฐ๊ฒฐ๋ HID ์ฅ์น์ ๊ธฐ๋ฅ๊ณผ ํน์ง์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์๋ณํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ ์ค์ธ ํน์ ์ฅ์น์ ๋ฐ๋ผ ๋์๊ณผ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค. ์ด๋ ์ต์ ์ ์ฑ๋ฅ, ํธํ์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฌ์ฉ์๋ฅผ ์ํ ๋ง์ถคํ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
HID ๋ณด๊ณ ์ ๋ฐ ๋์คํฌ๋ฆฝํฐ ์ดํดํ๊ธฐ
์ฝ๋๋ฅผ ์ดํด๋ณด๊ธฐ ์ ์, HID ๋ณด๊ณ ์์ ๋์คํฌ๋ฆฝํฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๊ฒ๋ค์ ์ฅ์น๊ฐ ํธ์คํธ ์์คํ ๊ณผ ํต์ ํ๋ ๋ฐฉ์์ ์ ์ํ๋ ํต์ฌ ์์์ ๋๋ค.
HID ๋ณด๊ณ ์
HID ๋ณด๊ณ ์๋ ์ฅ์น๊ฐ ํธ์คํธ๋ก ๋ณด๋ด๊ฑฐ๋ ํธ์คํธ๋ก๋ถํฐ ๋ฐ๋ ๋ฐ์ดํฐ ํจํท์ ๋๋ค. ์ธ ๊ฐ์ง ์ฃผ์ ๋ณด๊ณ ์ ์ ํ์ด ์์ต๋๋ค:
- ์ ๋ ฅ ๋ณด๊ณ ์: ์ฅ์น์์ ํธ์คํธ๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ (์: ๋ฒํผ ๋๋ฆ, ์ผ์ ํ๋ ๊ฐ).
- ์ถ๋ ฅ ๋ณด๊ณ ์: ํธ์คํธ์์ ์ฅ์น๋ก ์ ์ก๋๋ ๋ฐ์ดํฐ (์: LED ์์ ์ค์ , ๋ชจํฐ ์๋ ์ ์ด).
- ๊ธฐ๋ฅ ๋ณด๊ณ ์: ์ฅ์น ๊ธฐ๋ฅ ์กฐํ ๋ฐ ๊ตฌ์ฑ์ ์ฌ์ฉ (์: ํ์จ์ด ๋ฒ์ ๊ฒ์, ๊ฐ๋ ์์ค ์ค์ ).
HID ๋์คํฌ๋ฆฝํฐ
HID ๋์คํฌ๋ฆฝํฐ๋ ์ฅ์น์ ๊ธฐ๋ฅ์ ์ค๋ช ํ๋ ์ด์ง ๊ตฌ์กฐ๋ก, ๋ค์์ ํฌํจํฉ๋๋ค:
- ์ง์ํ๋ ๋ณด๊ณ ์ ์ ํ (์ ๋ ฅ, ์ถ๋ ฅ, ๊ธฐ๋ฅ).
- ๊ฐ ๋ณด๊ณ ์ ๋ด ๋ฐ์ดํฐ์ ํ์ (์: ํฌ๊ธฐ, ๋ฐ์ดํฐ ์ ํ, ๋นํธ ํ๋).
- ๊ฐ ๋ฐ์ดํฐ ์์์ ์๋ฏธ (์: ๋ฒํผ 1, X์ถ, ์จ๋ ์ผ์).
๋์คํฌ๋ฆฝํฐ๋ ๋ณธ์ง์ ์ผ๋ก ์ด์ ์ฒด์ (๊ทธ๋ฆฌ๊ณ ํ์ฅํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ )์๊ฒ ์ฅ์น๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํด์ผ ํ๋์ง ์๋ ค์ฃผ๋ ์ฒญ์ฌ์ง์ ๋๋ค. ์ด ๋์คํฌ๋ฆฝํฐ์ ์ ๊ทผํ๊ณ ํ์ฑํ๋ ๊ฒ์ด WebHID์์ ๊ธฐ๋ฅ ํ์ง์ ๊ธฐ์ด์ ๋๋ค.
WebHID๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ฅ ํ์ง ๋ฐฉ๋ฒ
WebHID๋ก ๊ธฐ๋ฅ ํ์ง๋ฅผ ํ๋ ๋ฐ์๋ ์ฌ๋ฌ ์ ๊ทผ ๋ฐฉ์์ด ์์ผ๋ฉฐ, ๊ฐ๊ฐ ์ฅ๋จ์ ์ด ์์ต๋๋ค:
- ์๋ ๋์คํฌ๋ฆฝํฐ ํ์ฑ: ๊ฐ์ฅ ์ง์ ์ ์ด์ง๋ง ๊ฐ์ฅ ๋ณต์กํ ๋ฐฉ๋ฒ์ ๋๋ค. ์์ HID ๋์คํฌ๋ฆฝํฐ๋ฅผ ๊ฐ์ ธ์ HID ์ฌ์์ ๋ฐ๋ผ ์๋์ผ๋ก ๊ตฌ์กฐ๋ฅผ ํด์ํด์ผ ํฉ๋๋ค.
- HID ๋ณด๊ณ ์ ID ์ฌ์ฉ: ๋ง์ ์ฅ์น๊ฐ ๋ณด๊ณ ์ ID๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ ํ์ ๋ณด๊ณ ์๋ฅผ ๊ตฌ๋ณํฉ๋๋ค. ํน์ ID๋ก ๊ธฐ๋ฅ ๋ณด๊ณ ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ํด๋น ์ฅ์น๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค.
- ๊ณต๊ธ์ ์ฒด ์ ์ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ: HID ์ฅ์น๋ ๊ณต๊ธ์ ์ฒด๋ณ ๊ธฐ๋ฅ์ ๋ํ๋ด๊ธฐ ์ํด ๋ง์ถคํ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ฟผ๋ฆฌํ๋ฉด ํน์ ๊ธฐ๋ฅ์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
- ์ฌ์ ์ ์๋ ๊ธฐ๋ฅ ์ธํธ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ณต๊ธ์ ์ฒด ID, ์ ํ ID ๋๋ ๊ธฐํ ์๋ณ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ ค์ง ์ฅ์น ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ผ๋ฐ์ ์ธ ์ฅ์น์ ๋ํ ๊ธฐ๋ฅ ํ์ง๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
1. ์๋ ๋์คํฌ๋ฆฝํฐ ํ์ฑ: ์ฌ์ธต ๋ถ์
์๋ ๋์คํฌ๋ฆฝํฐ ํ์ฑ์ ๊ธฐ๋ฅ ํ์ง์ ๋ํด ๊ฐ์ฅ ์ธ๋ถํ๋ ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค:
- ์ฅ์น ์ ๊ทผ ์์ฒญ:
navigator.hid.requestDevice()๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์๊ฒ HID ์ฅ์น๋ฅผ ์ ํํ๋ผ๋ ๋ฉ์์ง๋ฅผ ํ์ํฉ๋๋ค. - ์ฅ์น ์ด๊ธฐ:
device.open()์ ํธ์ถํ์ฌ ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค. - HID ๋์คํฌ๋ฆฝํฐ ๊ฐ์ ธ์ค๊ธฐ: ์ํ๊น๊ฒ๋ WebHID API๋ ์์ HID ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ง์ ๋
ธ์ถํ์ง ์์ต๋๋ค. ์ด๋ ์ค๋ํ ์ ํ ์ฌํญ์
๋๋ค. ์ผ๋ฐ์ ์ธ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฅ์น๊ฐ ์ง์ํ๋ ๊ฒฝ์ฐ
device.controlTransferIn()์ ํตํด "Get Descriptor" ์ ์ด ์ ์ก ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ณดํธ์ ์ผ๋ก ์ง์๋์ง๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ๋ขฐํ ์ ์์ต๋๋ค. - ๋์คํฌ๋ฆฝํฐ ํ์ฑ: ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป์๋ค๋ฉด(์ป์ ์ ์๋ค๋ฉด!), HID ์ฌ์์ ๋ฐ๋ผ ํ์ฑํด์ผ ํฉ๋๋ค. ์ด๋ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋์ฝ๋ฉํ๊ณ ๋ณด๊ณ ์ ์ ํ, ๋ฐ์ดํฐ ํฌ๊ธฐ, ์ฌ์ฉ ๋ฐ ๊ธฐํ ๊ด๋ จ ์ธ๋ถ ์ ๋ณด์ ๋ํ ์ ๋ณด๋ฅผ ์ถ์ถํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
์์ (์ค๋ช ์ ์ํ ๊ฒ์ผ๋ก, ์ง์ ์ ์ธ ๋์คํฌ๋ฆฝํฐ ์ ๊ทผ์ ์ ํ์ ์ ๋๋ค):
์ด ์์๋ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ์๋ง๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด์์ผ ๊ฒ์ ๋๋ค. ์ด ๋ถ๋ถ์ด ๊น๋ค๋ก์ด ๋ถ๋ถ์ ๋๋ค.
async function getDeviceDescriptor(device) {
// ๋ฐ๋ก ์ด ๋ถ๋ถ์ด ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป๋ ๋ฐ ์์ด ์ด๋ ค์ด ์ ์
๋๋ค.
// ์ค์ ๋ก๋ ์ด ๋ถ๋ถ์ด ์๋ต๋๊ฑฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ๋์ฒด๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
// ์ด ์์๋ ์ค๋ช
์ ์ํ ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋ฉ๋๋ค.
// ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ป๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
// ๋์คํฌ๋ฆฝํฐ ์์ ์๋ฎฌ๋ ์ด์
(์ค์ ์์ ์ฝ๋๋ก ๋์ฒด)
const descriptor = new Uint8Array([0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, 0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, 0x95, 0x03, 0x75, 0x01, 0x81, 0x02, 0x95, 0x01, 0x75, 0x05, 0x81, 0x03, 0x05, 0x01, 0x09, 0x30, 0x09, 0x31, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x02, 0x81, 0x06, 0xC0, 0xC0]);
return descriptor;
}
async function analyzeDescriptor(device) {
const descriptor = await getDeviceDescriptor(device);
// ์ด๊ฒ์ ํ์ฑ์ ๋จ์ํ๋ ์์์
๋๋ค. ์ค์ ํ์ฑ์ ๋ ๋ณต์กํฉ๋๋ค.
let offset = 0;
while (offset < descriptor.length) {
const byte = descriptor[offset];
switch (byte) {
case 0x05: // ์ฌ์ฉ ํ์ด์ง (Usage Page)
const usagePage = descriptor[offset + 1];
console.log("Usage Page:", usagePage.toString(16));
offset += 2;
break;
case 0x09: // ์ฌ์ฉ (Usage)
const usage = descriptor[offset + 1];
console.log("Usage:", usage.toString(16));
offset += 2;
break;
case 0xA1: // ์ปฌ๋ ์
(Collection)
const collectionType = descriptor[offset + 1];
console.log("Collection Type:", collectionType.toString(16));
offset += 2;
break;
// ... ๋ค๋ฅธ ์์ดํ
ํ์
์ ์ํ ์ผ์ด์ค๋ค ...
default:
console.log("Unknown Item:", byte.toString(16));
offset++;
}
}
}
์ด๋ ค์ด ์ :
- ๋ณต์ก์ฑ: HID ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ์ฑํ๋ ค๋ฉด HID ์ฌ์์ ๋ํ ๊น์ ์ดํด๊ฐ ํ์ํฉ๋๋ค.
- ์ ํ๋ ์ง์ ์ ๊ทผ: WebHID๋ HID ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ง์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ์์ ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ: ์๋ ํ์ฑ์ ๋์คํฌ๋ฆฝํฐ์ ๋ณต์กํ ๊ตฌ์กฐ๋ก ์ธํด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ๊ธฐ๋ฅ ํ์ง์ ๋ํด ๊ฐ์ฅ ์ธ๋ถํ๋ ์ ์ด๊ฐ ํ์ํ๊ณ HID ์ฌ์์ ์ดํดํ๋ ๋ฐ ์๋นํ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ผ ์ํฅ์ด ์์ ๋.
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ์ํ ํน์ ๊ธฐ๋ฅ์ ์๋ณํ๊ธฐ์ ์ถฉ๋ถํ์ง ์์ ๋.
2. HID ๋ณด๊ณ ์ ID ์ฌ์ฉ: ํน์ ๊ธฐ๋ฅ ์ฟผ๋ฆฌ
๋ง์ HID ์ฅ์น๊ฐ ๋ณด๊ณ ์ ID๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ ํ์ ๋ณด๊ณ ์๋ฅผ ๊ตฌ๋ณํฉ๋๋ค. ํน์ ID๋ก ๊ธฐ๋ฅ ๋ณด๊ณ ์ ์์ฒญ์ ๋ณด๋ด๋ฉด ์ฅ์น๊ฐ ํน์ ๊ธฐ๋ฅ์ ์ง์ํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ฅ์ด ์กด์ฌํ ๊ฒฝ์ฐ ์ฅ์น ํ์จ์ด๊ฐ ํน์ ๊ฐ์ผ๋ก ์๋ตํ๋ ๊ฒ์ ์์กดํฉ๋๋ค.
์์:
async function checkFeatureSupport(device, reportId, expectedResponse) {
try {
const data = new Uint8Array([reportId]); // ๋ณด๊ณ ์ ID๋ก ์์ฒญ ์ค๋น
await device.sendFeatureReport(reportId, data);
//์ฅ์น๋ก๋ถํฐ ์ฑ๊ณต์ ๋ํ๋ด๋ ์
๋ ฅ ๋ณด๊ณ ์๋ฅผ ์์ ๋๊ธฐํฉ๋๋ค.
device.addEventListener("inputreport", (event) => {
const { data, reportId } = event;
const value = data.getUint8(0); //๋จ์ผ ๋ฐ์ดํธ ์๋ต์ ๊ฐ์
if(value === expectedResponse){
console.log(`๋ณด๊ณ ์ ID ${reportId}๋ฅผ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์ง์๋ฉ๋๋ค.`);
return true;
} else {
console.log(`๋ณด๊ณ ์ ID ${reportId}๋ฅผ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์์์น ๋ชปํ ๊ฐ์ ๋ฐํํ์ต๋๋ค.`);
return false;
}
});
//๋๋, ์ฅ์น๊ฐ getFeatureReport์ ์ฆ์ ์๋ตํ๋ ๊ฒฝ์ฐ
// const data = await device.receiveFeatureReport(reportId);
// if (data[0] === expectedResponse) {
// console.log(`๋ณด๊ณ ์ ID ${reportId}๋ฅผ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์ง์๋ฉ๋๋ค.`);
// return true;
// } else {
// console.log(`๋ณด๊ณ ์ ID ${reportId}๋ฅผ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์ง์๋์ง ์์ต๋๋ค.`);
// return false;
// }
} catch (error) {
console.error(`๋ณด๊ณ ์ ID ${reportId}๋ฅผ ๊ฐ์ง ๊ธฐ๋ฅ ํ์ธ ์ค ์ค๋ฅ ๋ฐ์:`, error);
return false; // ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๊ธฐ๋ฅ์ด ์ง์๋์ง ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
}
return false;
}
async function detectDeviceFeatures(device) {
// ์์ 1: ํน์ LED ์ ์ด ๊ธฐ๋ฅ ํ์ธ (๊ฐ์์ ๋ณด๊ณ ์ ID)
const ledControlReportId = 0x01;
const ledControlResponseValue = 0x01; //LED ์ง์์ ๋ํ๋ด๋ ์์ ๊ฐ.
const hasLedControl = await checkFeatureSupport(device, ledControlReportId, ledControlResponseValue);
if (hasLedControl) {
console.log("์ฅ์น๊ฐ LED ์ ์ด๋ฅผ ์ง์ํฉ๋๋ค!");
} else {
console.log("์ฅ์น๊ฐ LED ์ ์ด๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.");
}
// ์์ 2: ํน์ ์ผ์ ๊ธฐ๋ฅ ํ์ธ (๊ฐ์์ ๋ณด๊ณ ์ ID)
const sensorReportId = 0x02;
const sensorResponseValue = 0x01; //์ผ์ ์ง์์ ๋ํ๋ด๋ ์์ ๊ฐ.
const hasSensor = await checkFeatureSupport(device, sensorReportId, sensorResponseValue);
if (hasSensor) {
console.log("์ฅ์น์ ์ผ์๊ฐ ์์ต๋๋ค!");
} else {
console.log("์ฅ์น์ ์ผ์๊ฐ ์์ต๋๋ค.");
}
}
์ด๋ ค์ด ์ :
- ์ฅ์น๋ณ ์ง์ ํ์: ํ์งํ๋ ค๋ ๊ธฐ๋ฅ์ ๋ํ ํน์ ๋ณด๊ณ ์ ID์ ์์ ์๋ต์ ์์์ผ ํฉ๋๋ค. ์ด ์ ๋ณด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฅ์น์ ๋ฌธ์๋ ์ฌ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
- ์ค๋ฅ ์ฒ๋ฆฌ: ์ฅ์น๊ฐ ์๋ตํ์ง ์๊ฑฐ๋ ์์์น ๋ชปํ ๊ฐ์ ๋ฐํํ๋ ๋ฑ์ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ์ฅ์น ์ผ๊ด์ฑ ๊ฐ์ : ํน์ ๋ณด๊ณ ์ ID๊ฐ ๋์ผํ ์ ํ์ ๋ค๋ฅธ ์ฅ์น์์๋ ํญ์ ๋์ผํ ๊ธฐ๋ฅ์ ํด๋นํ๋ค๋ ๊ฐ์ ์ ์์กดํฉ๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ํ์ํ ๋ณด๊ณ ์ ID์ ์์ ์๋ต์ ์ ๊ณตํ๋ ์ฅ์น ๋ฌธ์๋ ์ฌ์์ ์ ๊ทผํ ์ ์์ ๋.
- ํ์ค HID ์ฌ์ฉ์ผ๋ก ๋ค๋ฃจ์ด์ง์ง ์๋ ํน์ ๊ธฐ๋ฅ์ ํ์งํด์ผ ํ ๋.
3. ๊ณต๊ธ์ ์ฒด ์ ์ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ: ๋ง์ถค ๊ธฐ๋ฅ ์๋ณ
HID ์ฌ์์ ๊ณต๊ธ์ ์ฒด๊ฐ ๊ณต๊ธ์ ์ฒด๋ณ ๊ธฐ๋ฅ์ ๋ํ๋ด๊ธฐ ์ํด ๋ง์ถคํ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ฌ์ฉ ํ์ด์ง๋ ๊ด๋ จ ์ฌ์ฉ์ ๋ํ ๋ค์์คํ์ด์ค์ด๋ฉฐ, ์ฌ์ฉ์ ํด๋น ํ์ด์ง ๋ด์ ํน์ ๊ธฐ๋ฅ์ด๋ ์์ฑ์ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ๊ณต๊ธ์ ์ฒด ์ ์ ๊ฐ์ ์ฟผ๋ฆฌํ์ฌ ๋ง์ถคํ ๊ธฐ๋ฅ์ ์กด์ฌ๋ฅผ ์๋ณํ ์ ์์ต๋๋ค.
์์:
์ด ์์๋ ๊ฐ๋ ์ ๋ณด์ฌ์ค๋๋ค. ์ค์ ๊ตฌํ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ์ฉ์ ๊ฒฐ์ ํ๊ธฐ ์ํด ๋ณด๊ณ ์ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฝ์ด์ผ ํ ์ ์์ต๋๋ค.
// ์ด๊ฒ์ ๊ฐ๋
์ ์ธ ์ค๋ช
์
๋๋ค. WebHID๋ ์ง์ ์ ์ผ๋ก
// ์ถ๊ฐ์ ์ธ ๋์คํฌ๋ฆฝํฐ ๋ถ์ ์์ด๋ ์ฌ์ฉ ํ์ด์ง/์ฌ์ฉ์ ์ฟผ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ๋
ธ์ถํ์ง ์์ต๋๋ค.
async function checkVendorDefinedFeature(device, vendorId, featureUsagePage, featureUsage) {
// ๋จ์ํ๋ ๋ก์ง - ํฅํ WebHID ๋ฒ์ ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ค์ ๋ฉ์๋๋ก ๋์ฒดํ์ธ์
if (device.vendorId === vendorId) {
// ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ ํ์ธ์ด ๊ฐ๋ฅํ๋ค๊ณ ๊ฐ์
// if (device.hasUsage(featureUsagePage, featureUsage)) { // ๊ฐ์์ ํจ์
// console.log("์ฅ์น๊ฐ ๊ณต๊ธ์
์ฒด ์ ์ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค!");
// return true;
// }
console.log("๊ณต๊ธ์
์ฒด ์ ์ ๊ธฐ๋ฅ์ ์ง์ ํ์ธํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ธ์.");
} else {
console.log("์ฅ์น๊ฐ ์์ ๊ณต๊ธ์
์ฒด ID์ ์ผ์นํ์ง ์์ต๋๋ค.");
}
return false;
}
async function detectVendorFeatures(device) {
// ์์: ๊ณต๊ธ์
์ฒด XYZ๊ฐ ์ ์ํ ๋ง์ถค ๊ธฐ๋ฅ ํ์ธ (๊ฐ์)
const vendorId = 0x1234; // ๊ฐ์์ ๊ณต๊ธ์
์ฒด ID
const featureUsagePage = 0xF001; // ๊ฐ์์ ๊ณต๊ธ์
์ฒด ์ ์ ์ฌ์ฉ ํ์ด์ง
const featureUsage = 0x0001; // ํด๋น ๊ธฐ๋ฅ์ ์ํ ๊ฐ์์ ์ฌ์ฉ
const hasVendorFeature = await checkVendorDefinedFeature(device, vendorId, featureUsagePage, featureUsage);
// ๊ธฐ๋ฅ ๋ณด๊ณ ์๋ฅผ ์ฌ์ฉํ๋ ๋์์ ์ธ ์ ๊ทผ๋ฒ์ ์์. ์ค์ ์ฌ์ฉ์ ์ํด์๋ ๋ณด๊ณ ์ ๋์คํฌ๋ฆฝํฐ ๋ถ์์ด ํ์ํฉ๋๋ค.
if (hasVendorFeature) {
console.log("์ฅ์น๊ฐ ๊ณต๊ธ์
์ฒด XYZ์ ๋ง์ถค ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค!");
} else {
console.log("์ฅ์น๊ฐ ๊ณต๊ธ์
์ฒด XYZ์ ๋ง์ถค ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์ต๋๋ค.");
}
}
์ด๋ ค์ด ์ :
- ๊ณต๊ธ์ ์ฒด ๋ฌธ์ ํ์: ๋ง์ถคํ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ์ ์๋ฏธ๋ฅผ ์ดํดํ๋ ค๋ฉด ๊ณต๊ธ์ ์ฒด ๋ฌธ์์ ์ ๊ทผํด์ผ ํฉ๋๋ค.
- ํ์คํ ๋ถ์กฑ: ๊ณต๊ธ์ ์ฒด ์ ์ ๊ธฐ๋ฅ์ ํ์คํ๋์ด ์์ง ์์ ์ผ๋ฐ์ ์ธ ๊ธฐ๋ฅ ํ์ง ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ต์ต๋๋ค.
- ์ ํ๋ WebHID ์ง์: ํ์ฌ WebHID ๊ตฌํ์ ๋ ๊ณ ๊ธ ๋ณด๊ณ ์ ๋์คํฌ๋ฆฝํฐ ๋ถ์ ์์ด๋ ์ฌ์ฉ ํ์ด์ง ๋ฐ ์ฌ์ฉ์ ์ฟผ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์ง์ ๋ ธ์ถํ์ง ์์ ์ ์์ต๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ํน์ ๊ณต๊ธ์ ์ฒด์ ํ๋์จ์ด๋ก ์์ ํ๊ณ ํด๋น ๋ฌธ์์ ์ ๊ทผํ ์ ์์ ๋.
- ํ์ค HID ์ฌ์ฉ์ผ๋ก ๋ค๋ฃจ์ด์ง์ง ์๋ ๋ง์ถคํ ๊ธฐ๋ฅ์ ํ์งํด์ผ ํ ๋.
4. ์ฌ์ ์ ์๋ ๊ธฐ๋ฅ ์ธํธ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค: ์ฅ์น ์ธ์ ๋จ์ํ
๊ธฐ๋ฅ ํ์ง์ ๋ํ ์ค์ฉ์ ์ธ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋๋ ๊ณต๊ธ์ ์ฒด ID, ์ ํ ID ๋๋ ๊ธฐํ ์๋ณ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์๋ ค์ง ์ฅ์น ๊ธฐ๋ฅ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์ด๋ฅผ ํตํด ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ฐ์ ์ธ ์ฅ์น๋ฅผ ์ ์ํ๊ฒ ์๋ณํ๊ณ ์ฌ์ ์ ์๋ ๊ตฌ์ฑ ๋๋ ๊ธฐ๋ฅ ์ธํธ๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
์์:
const deviceDatabase = {
"046d:c52b": { // ๋ก์งํ
G502 ๊ฒ์ด๋ฐ ๋ง์ฐ์ค (๊ณต๊ธ์
์ฒด ID:์ ํ ID)
features: {
dpiAdjustment: true,
programmableButtons: 11,
rgbLighting: true
}
},
"04f3:0c4b": { // ์๊ฐํ ์คํธ๋ฆผ ๋ฑ (๊ณต๊ธ์
์ฒด ID:์ ํ ID)
features: {
lcdButtons: true,
customIcons: true,
hotkeys: true
}
}
// ... ๋ ๋ง์ ์ฅ์น ์ ์ ...
};
async function detectDeviceFeaturesFromDatabase(device) {
const deviceId = `${device.vendorId.toString(16)}:${device.productId.toString(16)}`;
if (deviceDatabase[deviceId]) {
const features = deviceDatabase[deviceId].features;
console.log("๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฅ์น๋ฅผ ์ฐพ์์ต๋๋ค!");
console.log("๊ธฐ๋ฅ:", features);
return features;
} else {
console.log("๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฅ์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.");
return null; // ์ธ์๋์ง ์์ ์ฅ์น
}
}
์ด๋ ค์ด ์ :
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ง ๊ด๋ฆฌ: ์๋ก์ด ์ฅ์น์ ๊ธฐ๋ฅ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ๋ ค๋ฉด ์ง์์ ์ธ ๋ ธ๋ ฅ์ด ํ์ํฉ๋๋ค.
- ์ ํ๋ ์ ์ฉ ๋ฒ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ชจ๋ ๊ฐ๋ฅํ HID ์ฅ์น, ํนํ ๋ ์ผ๋ฐ์ ์ด๊ฑฐ๋ ๋ง์ถคํ ํ๋์จ์ด์ ๋ํ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์์ ์ ์์ต๋๋ค.
- ๋ถ์ ํ์ฑ ๊ฐ๋ฅ์ฑ: ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฅ์น ์ ๋ณด๊ฐ ๋ถ์์ ํ๊ฑฐ๋ ๋ถ์ ํํ์ฌ ์๋ชป๋ ๊ธฐ๋ฅ ํ์ง๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ฌ์ฉ ์๊ธฐ:
- ๋ค์ํ ์ผ๋ฐ HID ์ฅ์น๋ฅผ ์ง์ํด์ผ ํ ๋.
- ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ๊ธฐ๋ฅ์ ์ค์ ํ ํ์ ์์ด ์ฅ์น๋ฅผ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ์ถ์ ๋.
- ๋ค๋ฅธ ๊ธฐ๋ฅ ํ์ง ๋ฐฉ๋ฒ์ด ์คํจํ์ ๋์ ๋์ฒด ๋ฉ์ปค๋์ฆ์ผ๋ก.
WebHID ๊ธฐ๋ฅ ํ์ง๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ ์ฐ์ : ํญ์ ์ฌ์ฉ์์๊ฒ ๋ช ์์ ์ผ๋ก ์ฅ์น ์ ๊ทผ์ ์์ฒญํ๊ณ HID ์ฅ์น์ ์ ๊ทผํด์ผ ํ๋ ์ด์ ๋ฅผ ๋ช ํํ๊ฒ ์ค๋ช ํ์ธ์.
- ๋์ฒด ๋ฉ์ปค๋์ฆ ์ ๊ณต: ๊ธฐ๋ฅ ํ์ง์ ์คํจํ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก ์ฅ์น๋ฅผ ๊ตฌ์ฑํ๊ฑฐ๋ ์ง์๋๋ ๊ธฐ๋ฅ ๋ชฉ๋ก์์ ์ ํํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ธ์.
- ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ: ์๊ธฐ์น ์์ ๋์์ด๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์.
- ๋น๋๊ธฐ ์์
์ฌ์ฉ: WebHID ์์
์ ๋น๋๊ธฐ์ ์ด๋ฏ๋ก
async์await๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ํ์ธ์. - ์ฑ๋ฅ ์ต์ ํ: ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋ฐฐํฐ๋ฆฌ ์๋ชจ๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ธฐ๋ฅ ํ์ง ์์ฒญ ์๋ฅผ ์ต์ํํ์ธ์.
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ณ ๋ ค: WebHID ๊ธฐ๋ฅ ํ์ง๋ฅผ ์ํ ๊ณ ์์ค ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋ ์ฌ์ฉ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ฒ ์ ํ ํ ์คํธ: ํธํ์ฑ๊ณผ ์ ํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ค์ํ HID ์ฅ์น๋ก ์ฝ๋๋ฅผ ํ ์คํธํ์ธ์. ํ ์คํธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ธฐ ์ํด ์๋ํ๋ ํ ์คํธ ํ๋ ์์ํฌ ์ฌ์ฉ์ ๊ณ ๋ คํ์ธ์.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
- ๊ฒ์: ํ์ง๋ ๋ฒํผ, ์ถ, ์ผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒ์ํจ๋ ๋ ์ด์์์ ๋์ ์ผ๋ก ์กฐ์ ํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ๋์ฒด ํค๋ณด๋๋ ํฌ์ธํ ์ฅ์น์ ๊ฐ์ ๋ณด์กฐ ์ฅ์น๋ฅผ ์ํด ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์กฐ์ ํฉ๋๋ค.
- ์ฐ์ ์ ์ด: ์ ์กฐ, ๋ก๋ด ๊ณตํ ๋ฐ ๊ธฐํ ์ฐ์ ์์ฉ ๋ถ์ผ์์ ์ฌ์ฉ๋๋ ๋ง์ถคํ ์ผ์ ๋ฐ ์ก์ถ์์ดํฐ์ ์ํธ ์์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์ ์ USB-HID๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ํน์ ์จ๋ ์ผ์๋ ์๋ ฅ๊ณ์ ์กด์ฌ๋ฅผ ๊ฐ์งํ ์ ์์ต๋๋ค.
- ๊ต์ก: ์ ์ ํ๋ฏธ๊ฒฝ์ด๋ ๋ฐ์ดํฐ ์์ง ์์คํ ๊ณผ ๊ฐ์ ํน์ ํ๋์จ์ด๋ฅผ ํ์ฉํ๋ ๋ํํ ํ์ต ๋๊ตฌ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
- ์๋ฃ: ์๊ฒฉ ํ์ ๋ชจ๋ํฐ๋ง์ ์ํด ๋งฅ๋ฐ ์ฐ์ ์ธก์ ๊ธฐ๋ ํ์ ๋ชจ๋ํฐ์ ๊ฐ์ ์๋ฃ ๊ธฐ๊ธฐ์ ์ฐ๊ฒฐํฉ๋๋ค.
- ๋์งํธ ์ํธ: ์๋ ฅ ๊ฐ๋ ๋ฐ ๊ธฐ์ธ๊ธฐ ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ ๋ค์ํ ๋๋ก์ ํ๋ธ๋ฆฟ๊ณผ ์คํ์ผ๋ฌ์ค๋ฅผ ์ง์ํฉ๋๋ค. ์ ์ธ๊ณ ์ํฐ์คํธ๋ค์ด ์ฌ์ฉํ๋ ์์ฝค ํ๋ธ๋ฆฟ์ ์ง์ํ์ฌ ์๋ ฅ ์์ค๊ณผ ๋ฒํผ ๊ตฌ์ฑ์ ์ ํํ๊ฒ ํด์ํ๋ ๊ฒ์ด ๊ธ๋ก๋ฒํ ์์๊ฐ ๋ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
๊ธฐ๋ฅ ํ์ง๋ WebHID๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ ฅํ๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํ ์ธก๋ฉด์ ๋๋ค. HID ๋ณด๊ณ ์, ๋์คํฌ๋ฆฝํฐ ๋ฐ ๋ค์ํ ํ์ง ๋ฐฉ๋ฒ์ ๊ฐ๋ ์ ์ดํดํจ์ผ๋ก์จ ์ด ๊ฐ๋ ฅํ API์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ ์์ต๋๋ค. ํนํ ์ง์ ์ ์ธ ๋์คํฌ๋ฆฝํฐ ์ ๊ทผ์ ์ด๋ ค์์ด ์์ง๋ง, ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ ๊ฒฐํฉํ๊ณ ์ธ๋ถ ๋ฆฌ์์ค๋ฅผ ํ์ฉํ๋ฉด ๋ ํจ๊ณผ์ ์ด๊ณ ์ ์๋ ฅ ์๋ ์๋ฃจ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. WebHID๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ธฐ๋ฅ ํ์ง ๊ธฐ๋ฅ์ด ๋์ฑ ํฅ์๋์ด ๋ค์ํ ํ๋์จ์ด ์ฅ์น์ ์ํํ๊ฒ ์ํธ ์์ฉํ๋ ๋งค๋ ฅ์ ์ธ ์น ๊ฒฝํ์ ๋ง๋๋ ๊ฒ์ด ํจ์ฌ ์ฌ์์ง ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค.
์ฌ์ฉ์ ๊ฐ์ธ์ ๋ณด ๋ณดํธ๋ฅผ ์ฐ์ ์ํ๊ณ , ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ์ฒ ์ ํ ํ ์คํธ๋ฅผ ํตํด ์ฌ์ฉ์์๊ฒ ๊ธ์ ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๊ฒ์ ์์ง ๋ง์ธ์. WebHID ๊ธฐ๋ฅ ํ์ง ๊ธฐ์ ์ ๋ง์คํฐํจ์ผ๋ก์จ ๋์งํธ ์ธ๊ณ์ ๋ฌผ๋ฆฌ์ ์ธ๊ณ ์ฌ์ด์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๋ ์ง์ ์ผ๋ก ํ์ ์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.