WebHID APIã䜿ã£ãŠãWebãã©ãŠã¶ããçŽæ¥ãã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ïŒHIDïŒã®å¯èœæ§ãè§£ãæŸã¡ãŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãAPIããã®æ©èœãå®è£ ãã»ãã¥ãªãã£ããããŠå°æ¥æ§ã«ã€ããŠè§£èª¬ããŸãã
ããã³ããšã³ã WebHID APIïŒãã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ãžã®æ¶ãæ©
WebHID APIã¯ããã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ïŒHIDïŒãšã®çŽæ¥éä¿¡ãå¯èœã«ããããšã§ãWebã¢ããªã±ãŒã·ã§ã³ã«æ°ããªå¯èœæ§ã®äžçãéããŸãããã®APIã«ãããWebãµã€ãã¯æšæºçãªWeb APIã§ã¯éåžžã¢ã¯ã»ã¹ã§ããªãå¹ åºãããã€ã¹ãšå¯Ÿè©±ã§ããWebããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã®èœåãæ¡å€§ãã驿°çãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµåºããŸãããã®ã¬ã€ãã§ã¯ãWebHID APIããã®å¿çšãå®è£ ã®è©³çްããããŠéèŠãªã»ãã¥ãªãã£äžã®èæ ®äºé ã«ã€ããŠå æ¬çã«æŠèª¬ããŸãã
WebHIDãšã¯ïŒ
WebHIDïŒWeb Human Interface Device APIïŒã¯ãWebããŒãžãHIDããã€ã¹ã«ã¢ã¯ã»ã¹ãã察話ã§ããããã«ããWeb APIã§ããHIDã¯ã人éãã³ã³ãã¥ãŒã¿ãšå¯Ÿè©±ããããã«äœ¿çšããå¹ åºãã«ããŽãªã®ããã€ã¹ã§ããã以äžã®ãããªãã®ãå«ãŸããŸãã
- ããŒããŒã
- ããŠã¹
- ã²ãŒã ããããšãžã§ã€ã¹ãã£ãã¯
- ç¹æ®ãªå ¥åããã€ã¹ïŒäŸïŒããŒã³ãŒãã¹ãã£ããŒãç§åŠæ©åšãã«ã¹ã¿ã ã³ã³ãããŒã©ãŒïŒ
åŸæ¥ãWebã¢ããªã±ãŒã·ã§ã³ã¯ãããã®ããã€ã¹ãšçŽæ¥å¯Ÿè©±ããèœåã«å¶éããããŸãããWebHID APIã¯ãWebããŒãžãJavaScriptãéããŠHIDãšå®å šãã€å¶åŸ¡ãããæ¹æ³ã§éä¿¡ããææ®µãæäŸããããšã§ããã®ã®ã£ãããåããŸãã
ãªãWebHIDã䜿çšããã®ãïŒ
WebHID APIã¯ãHIDããã€ã¹ãšå¯Ÿè©±ããåŸæ¥ã®æ¹æ³ã«æ¯ã¹ãŠãããã€ãã®å©ç¹ãæäŸããŸãã
- çŽæ¥ã¢ã¯ã»ã¹ïŒæšæºçãªãã©ãŠã¶APIã®å¶éãåé¿ããããã€ã¹ãšã®çŽæ¥éä¿¡ãå¯èœã«ããŸãã
- æ©èœã®æ¡åŒµïŒæšæºAPIã§ã¯èªèãããªãå¯èœæ§ã®ããç¹æ®ãªããŒããŠã§ã¢ãå«ããããåºç¯ãªããã€ã¹ããµããŒãããŸãã
- ã«ã¹ã¿ãã€ãºå¯èœãªå¯Ÿè©±ïŒéçºè ãç¹å®ã®ããã€ã¹ãšå¯Ÿè©±ããããã®ã«ã¹ã¿ã ãããã³ã«ãšããŒã¿åœ¢åŒãå®çŸ©ã§ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒãŠãŒã¶ãŒå ¥åããã詳现ã«å¶åŸ¡ããããšã§ãããæ²¡å ¥æã®ããå¿çæ§ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
- ã¯ãã¹ãã©ãããã©ãŒã äºææ§ïŒWebHIDã¯ãAPIããµããŒãããããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã©ãŠã¶ã§äžè²«ãããšã¯ã¹ããªãšã³ã¹ãæäŸããããšãç®æããŠããŸãã
WebHIDã®ãŠãŒã¹ã±ãŒã¹
WebHID APIã«ã¯ãããŸããŸãªæ¥çã«ãããå¹ åºãæœåšçãªå¿çšåéããããŸãã
ã²ãŒã
WebHIDã¯ãWebããŒã¹ã®ã²ãŒã åãã«é«åºŠãªã²ãŒã ããããšãžã§ã€ã¹ãã£ãã¯ã®ãµããŒããå¯èœã«ãããã粟å¯ãªå¶åŸ¡ãšæ²¡å ¥æã®ããã²ãŒã ãã¬ã€ãå®çŸããŸããäŸãã°ããã©ãŠã¶å ã§å®å šã«åäœãããã©ã€ãã·ãã¥ã¬ãŒã¿ãŒãããªã¢ã«ãªæçžŠã®ããã«å°çšã®ãã©ã€ãã¹ãã£ãã¯ãå©çšãããããªç¶æ³ãæ³åããŠã¿ãŠãã ãããäžè¬çãªã²ãŒã ãããã®ãµããŒãã«éå®ããã代ããã«ãã·ãã¥ã¬ãŒã¿ãŒã¯ãã©ã€ãã¹ãã£ãã¯ã®å軞ããã¿ã³ããã®å ¥åãçŽæ¥èªã¿åãããšãã§ããŸãã
ã¢ã¯ã»ã·ããªãã£
ãã®APIã¯ãé害ãæã€ãŠãŒã¶ãŒãWebã³ã³ãã³ããšãã广çã«å¯Ÿè©±ã§ããããã«ããæ¯æŽæè¡ã®äœæã«äœ¿çšã§ããŸããããããã©ãã«ãŒãã·ããã¢ã³ãããã¹ã€ãããªã©ã®ç¹æ®ãªå ¥åããã€ã¹ãWebã¢ããªã±ãŒã·ã§ã³ã«çŽæ¥çµ±åããã«ã¹ã¿ãã€ãºãããå ¥åæ¹æ³ãæäŸã§ããŸããããã«ãããéåé害ã®ãããŠãŒã¶ãŒãããç°¡åã«Webãµã€ããããã²ãŒãããWebã¢ããªã±ãŒã·ã§ã³ãšå¯Ÿè©±ã§ããããã«ãªããŸãã
ç§åŠããã³ç£æ¥å¿çš
WebHIDã¯ãç§åŠæ©åšãç£æ¥æ©åšãå¶åŸ¡ããã³ç£èŠããããã®WebããŒã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ãå¯èœã«ããŸããããã«ãããç ç©¶è ããšã³ãžãã¢ã¯é éå°ããããŒã¿ã«ã¢ã¯ã»ã¹ããåæããããšãã§ããŸããæž©åºŠãšå§åãæž¬å®ããå®éšæ©åšãèããŠã¿ãŸããããWebHIDã䜿çšãããšãWebã¢ããªã±ãŒã·ã§ã³ã¯æ©åšããçŽæ¥ããŒã¿ãèªã¿åãããªã¢ã«ã¿ã€ã ã§è¡šç€ºã§ãããããããŒã«ã«ã³ã³ãã¥ãŒã¿ã«å°çšãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿ èŠããªããªããŸãã
æè²
WebHIDã¯ãå®è·µçãªåŠç¿ã®ããã«ç¹æ®ãªå ¥åããã€ã¹ãå©çšããã€ã³ã¿ã©ã¯ãã£ããªæè²ããŒã«ã®äœæã«äœ¿çšã§ããŸããäŸãã°ãä»®æ³è§£åããŒã«ã¯ãè§ŠèŠãã£ãŒãããã¯ããã€ã¹ã䜿çšããŠããŸããŸãªçµç¹ã®æè§Šãã·ãã¥ã¬ãŒãããåŠçã«ããçŸå®çã§é åçãªåŠç¿äœéšãæäŸã§ããŸãã
ã«ã¹ã¿ã ããŒããŠã§ã¢ã€ã³ã¿ãŒãã§ãŒã¹
ãã®APIã¯ãèªäœã®ããŒããŠã§ã¢ããã€ã¹ãšWebãã©ãŠã¶ããçŽæ¥å¯Ÿè©±ããæ¹æ³ãæäŸããŸããããã«ããããã€ã¯ãã³ã³ãããŒã©ãŒãã»ã³ãµãŒããã®ä»ã®é»åéšåãå«ã驿°çãªãããžã§ã¯ãã®å¯èœæ§ãåºãããŸãããã€ã¯ãã³ã³ãããŒã©ãŒã«æ¥ç¶ãããã«ã¹ã¿ã LEDç §æã·ã¹ãã ãå¶åŸ¡ããWebã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ããããã®ã¢ããªã±ãŒã·ã§ã³ã¯WebHIDã䜿çšããŠãã€ã¯ãã³ã³ãããŒã©ãŒã«ã³ãã³ããéä¿¡ããã©ã€ãã®è²ã匷床ãå¶åŸ¡ã§ããŸãã
WebHIDã®ä»çµã¿ïŒæè¡çæŠèŠ
APIã®æ§é
WebHID APIã¯ãããã€ãã®äž»èŠãªã€ã³ã¿ãŒãã§ãŒã¹ãšã¡ãœããã§æ§æãããŠããŸãã
navigator.hid: WebHID APIãžã®ãšã³ããªãã€ã³ãã§ããHID.requestDevice(): ãŠãŒã¶ãŒã«æ¥ç¶ããHIDããã€ã¹ã®éžæãä¿ããŸããHIDDevice: æ¥ç¶ãããHIDããã€ã¹ã衚ããŸããHIDDevice.open(): ããã€ã¹ãžã®æ¥ç¶ãéããŸããHIDDevice.close(): ããã€ã¹ãžã®æ¥ç¶ãéããŸããHIDDevice.addEventListener('inputreport', ...): ããã€ã¹ããã®çä¿¡ããŒã¿ãåŸ ã¡åããŸããHIDDevice.sendReport(): ããã€ã¹ã«ããŒã¿ãéä¿¡ããŸããHIDDevice.sendFeatureReport(): ããã€ã¹ã«æ©èœã¬ããŒããéä¿¡ããŸããHIDDevice.getFeatureReport(): ããã€ã¹ããæ©èœã¬ããŒããååŸããŸãã
HIDããã€ã¹ãžã®æ¥ç¶
HIDããã€ã¹ãžã®æ¥ç¶ããã»ã¹ã«ã¯ã以äžã®æé ãå«ãŸããŸãã
- ã¢ã¯ã»ã¹èŠæ±ïŒ
navigator.hid.requestDevice()ãåŒã³åºãããŠãŒã¶ãŒã«ããã€ã¹ã®éžæãä¿ããŸãããã®ã¡ãœããã¯ãé¢å¿ã®ããããã€ã¹ã®çš®é¡ãæå®ã§ãããªãã·ã§ã³ã®ãã£ã«ã¿ãŒåŒæ°ãåããŸãã - ããã€ã¹éžæïŒãã©ãŠã¶ãããã€ã¹ããã«ãŒã衚瀺ãããŠãŒã¶ãŒãHIDããã€ã¹ãéžæã§ããããã«ããŸãã
- æ¥ç¶ãéãïŒãŠãŒã¶ãŒãããã€ã¹ãéžæãããã
HIDDevice.open()ãåŒã³åºããŠæ¥ç¶ã確ç«ããŸãã - ããŒã¿åä¿¡ïŒ
HIDDeviceãªããžã§ã¯ãã®'inputreport'ã€ãã³ããåŸ ã¡åããããã€ã¹ããããŒã¿ãåä¿¡ããŸãã - ããŒã¿éä¿¡ïŒãªãã·ã§ã³ïŒïŒ
HIDDevice.sendReport()ãŸãã¯HIDDevice.sendFeatureReport()ãåŒã³åºããŠãããã€ã¹ã«ããŒã¿ãéä¿¡ããŸãã - æ¥ç¶ãéããïŒçµäºãããã
HIDDevice.close()ãåŒã³åºããŠæ¥ç¶ãéããŸãã
ã³ãŒãã¹ããããã®äŸ
以äžã¯ãHIDããã€ã¹ã«æ¥ç¶ããŠããŒã¿ãåä¿¡ããåºæ¬çãªäŸã§ãã
async function connectToHIDDevice() {
try {
const devices = await navigator.hid.requestDevice({
filters: [{
usagePage: 0x0001, // æ±çšãã¹ã¯ãããã³ã³ãããŒã«
usage: 0x0004 // ãžã§ã€ã¹ãã£ãã¯
}]
});
if (devices.length > 0) {
const device = devices[0];
device.addEventListener('inputreport', event => {
const { data, reportId } = event;
const bytes = new Uint8Array(data.buffer);
console.log(`ã¬ããŒã ${reportId} ããããŒã¿ãåä¿¡:`, bytes);
// ããã§ããŒã¿ãåŠçããŸã
});
await device.open();
console.log(`ããã€ã¹ã«æ¥ç¶ããŸãã: ${device.productName}`);
} else {
console.log('HIDããã€ã¹ãéžæãããŸããã§ããã');
}
} catch (error) {
console.error('HIDããã€ã¹ãžã®æ¥ç¶äžã«ãšã©ãŒãçºçããŸãã:', error);
}
}
connectToHIDDevice();
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
ã»ãã¥ãªãã£ã¯WebHID APIã®éèŠãªåŽé¢ã§ããAPIã¯ããŒããŠã§ã¢ãžã®çŽæ¥ã¢ã¯ã»ã¹ãèš±å¯ãããããæªæã®ããã³ãŒããè匱æ§ãæªçšããã®ãé²ãããã®ã»ãã¥ãªãã£å¯Ÿçãå®è£ ããããšãéèŠã§ãã
- ãŠãŒã¶ãŒã®èš±å¯ïŒWebãµã€ããHIDããã€ã¹ã«ã¢ã¯ã»ã¹ããåã«ãAPIã¯æç€ºçãªãŠãŒã¶ãŒã®èš±å¯ãå¿ èŠãšããŸãããã©ãŠã¶ã¯ããã€ã¹ããã«ãŒã衚瀺ãããŠãŒã¶ãŒãæ¥ç¶ããããã€ã¹ãéžæã§ããããã«ããŸãã
- HTTPSã®ã¿ïŒWebHID APIã¯å®å šãªïŒHTTPSïŒæ¥ç¶ã§ã®ã¿å©çšå¯èœã§ããããã«ãããäžéè æ»æãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ãªãªãžã³åé¢ïŒAPIã¯åäžãªãªãžã³ããªã·ãŒã®å¯Ÿè±¡ã§ãããç°ãªããã¡ã€ã³ããã®ãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶éããŸãã
- å ¥åã®ãµãã¿ã€ãºïŒã€ã³ãžã§ã¯ã·ã§ã³æ»æãé²ãããã«ãHIDããã€ã¹ããåä¿¡ããå ¥åã¯åžžã«ãµãã¿ã€ãºããŠãã ããã
- æå°æš©éã®ååïŒã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªç¹å®ã®HIDããã€ã¹ãšæ©èœãžã®ã¢ã¯ã»ã¹ã®ã¿ãèŠæ±ããŠãã ããã
- 宿çãªæŽæ°ïŒãã©ãŠã¶ãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãææ°ã®ç¶æ ã«ä¿ã¡ãææ°ã®ã»ãã¥ãªãã£ããããé©çšãããŠããããšã確èªããŠãã ããã
WebHIDéçºã®ãã¹ããã©ã¯ãã£ã¹
以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãå ç¢ã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªWebHIDã¢ããªã±ãŒã·ã§ã³ãäœæããã®ã«åœ¹ç«ã¡ãŸãã
- æç¢ºãªæç€ºã®æäŸïŒã¢ããªã±ãŒã·ã§ã³ããªãHIDããã€ã¹ãžã®ã¢ã¯ã»ã¹ãå¿ èŠãšããã®ãããããŠããã€ã¹ãã©ã®ããã«äœ¿çšãããã®ãããŠãŒã¶ãŒã«æç¢ºã«èª¬æããŠãã ããã
- ãšã©ãŒã®äžå¯§ãªåŠçïŒããã€ã¹ãèŠã€ãããªãããŸãã¯æ¥ç¶ã§ããªãå Žåã«åããŠããšã©ãŒãã³ããªã³ã°ãå®è£ ããŠãã ããã
- ããã©ãŒãã³ã¹ã®æé©åïŒé å»¶ãæå°éã«æããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã確ä¿ããããã«ã³ãŒããæé©åããŠãã ããã
- 培åºçãªãã¹ãïŒäºææ§ã確ä¿ããããã«ãããŸããŸãªHIDããã€ã¹ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ã®èæ ®ïŒé害ãæã€ãŠãŒã¶ãŒã䜿çšã§ããããã«ãã¢ã¯ã»ã·ããªãã£ã念é ã«çœ®ããŠã¢ããªã±ãŒã·ã§ã³ãèšèšããŠãã ããã
- ã»ãã¥ãªãã£ã®ãã¹ããã©ã¯ãã£ã¹ã®éµå®ïŒãŠãŒã¶ãŒãšã¢ããªã±ãŒã·ã§ã³ãä¿è·ããããã«ãäžèšã®ã»ãã¥ãªãã£ã¬ã€ãã©ã€ã³ã«åŸã£ãŠãã ããã
ãã©ãŠã¶ã®ãµããŒãç¶æ³
WebHID APIã¯çŸåšã以äžã®ãã©ãŠã¶ã§ãµããŒããããŠããŸãã
- Google ChromeïŒããŒãžã§ã³89以éïŒ
- Microsoft EdgeïŒããŒãžã§ã³89以éïŒ
ä»ã®ãã©ãŠã¶ã§ã®ãµããŒãã¯éçºäžã§ããWebHIDã®ãµããŒãã«é¢ããææ°æ å ±ã«ã€ããŠã¯ããã©ãŠã¶ã®å ¬åŒããã¥ã¡ã³ãã確èªããŠãã ããã
WebHIDã®æªæ¥
WebHID APIã¯æ¥éã«é²åããŠããæè¡ã§ãããææãªæªæ¥ããããŸãããã©ãŠã¶ã®ãµããŒããæ¡å€§ããæ°æ©èœã远å ãããã«ã€ããŠãAPIã¯WebããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠããã«å€ãã®å¯èœæ§ãåãéãã§ãããã
å°æ¥ã®æœåšçãªéçºã«ã¯ã以äžã®ãããªãã®ããããŸãã
- ããã€ã¹æ€åºã®æ¹åïŒãŠãŒã¶ãŒãHIDããã€ã¹ãç°¡åã«èŠã€ããŠæ¥ç¶ã§ããããã«ããããã®ããã€ã¹ããã«ãŒã®æ©èœåŒ·åã
- æšæºåãããããŒã¿åœ¢åŒïŒéçºãç°¡çŽ åããçžäºéçšæ§ãåäžãããããã®äžè¬çãªHIDããã€ã¹åãã®æšæºåãããããŒã¿åœ¢åŒã®éçºã
- 匷åãããã»ãã¥ãªãã£æ©èœïŒãŠãŒã¶ãŒãæªæã®ããã³ãŒãããããã«ä¿è·ããããã®è¿œå ã®ã»ãã¥ãªãã£å¯Ÿçã®å®è£ ã
- BluetoothãµããŒãïŒBluetooth HIDããã€ã¹ããµããŒãããããã®APIã®æ¡åŒµã
çµè«
WebHID APIã¯ãWebã¢ããªã±ãŒã·ã§ã³ã®èœåã«ããã倧ããªåé²ã衚ããŠããŸãããã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ãžã®çŽæ¥ã¢ã¯ã»ã¹ãæäŸããããšã§ããã®APIã¯é©æ°çã§æ²¡å ¥æã®ãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåµé ããããã®å¯èœæ§ã®äžçãéããŸããWebããŒã¹ã®ã²ãŒã ãæ¯æŽæè¡ãç§åŠæ©åšããŸãã¯ã«ã¹ã¿ã ããŒããŠã§ã¢ã€ã³ã¿ãŒãã§ãŒã¹ãéçºããŠããå Žåã§ããWebHID APIã¯ä»¥åã¯äžå¯èœã ã£ãWebã¢ããªã±ãŒã·ã§ã³ã®äœæãå¯èœã«ããŸããAPIããã®ã»ãã¥ãªãã£äžã®èæ ®äºé ãããã³ãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã§ãWebHIDã®åãæŽ»çšããŠæ¬¡äžä»£ã®Webãšã¯ã¹ããªãšã³ã¹ãæ§ç¯ã§ããŸãã