Web USB APIã®åãæ¢æ±ããWebã¢ããªã±ãŒã·ã§ã³ã§USBããã€ã¹ã«ã·ãŒã ã¬ã¹ã«ã¢ã¯ã»ã¹ã»å¶åŸ¡ããæ¹æ³ã解説ãã°ããŒãã«ãªéçºè åãã
ããã³ããšã³ãWeb USB APIïŒãã©ãŠã¶ãšç©çããã€ã¹ã®ã®ã£ãããåãã
ãŸããŸãæ¥ç¶æ§ãé«ãŸãçŸä»£ã®äžçã«ãããŠãWebã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ãéçãªæ å ±ã衚瀺ããããçŽç²ã«ãªã³ã©ã€ã³ã®ã¿ã¹ã¯ãå®è¡ãããããã ãã«ãšã©ãŸããŸããããã©ãŠã¶ããçŽæ¥ãç©ççãªäžçãšå¯Ÿè©±ããããšããæ¬²æ±ã¯ããã€ãŠãªãã»ã©åŒ·ããªã£ãŠããŸããç§åŠèšæž¬æ©åšããã¹ããŒãããŒã ããã€ã¹ãç£æ¥çšå¶åŸ¡ã·ã¹ãã ããããŒãœãã©ã€ãºãããã¬ãžã§ãããŸã§ãWebããŒã¹ã®ããŒããŠã§ã¢å¶åŸ¡ã®å¯èœæ§ã¯åºå€§ã§ããã®å€ãã¯æªéæã§ããããã§èå°ã«ç»å Žããã®ãããã³ããšã³ãWeb USB APIã§ãããéçºè ã«Webãã©ãŠã¶ãéããŠçŽæ¥USBããã€ã¹ãšéä¿¡ããããã®åŒ·åã§æšæºåãããæ¹æ³ãæäŸããŸãã
äžçäžã®éçºè ã«ãšã£ãŠãWeb USB APIãçè§£ãæŽ»çšããããšã¯ãã€ãããŒã·ã§ã³ã®æ°ããªããã³ãã£ã¢ãåãéãããšã«ã€ãªãããŸãããã€ããã®åŠçãUSBã§ã©ãããããã«æ¥ç¶ãããé¡åŸ®é¡ã«ã¢ã¯ã»ã¹ããŠå¶åŸ¡ãããœãŠã«ã®å·¥å Žé·ãWebããã·ã¥ããŒããä»ããŠæ©æ¢°ããã®ã»ã³ãµãŒããŒã¿ããªã¢ã«ã¿ã€ã ã§ç£èŠãããã«ãªã³ã®ããã€ã¹ããUSBå¶åŸ¡ã®LEDã¹ããªããã§ãããžã§ã¯ãã®ã«ã¹ã¿ã ç §æå¹æããã¶ã€ã³ãããããããã¹ãŠããç¹å¥ãªãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããããšãªãå®çŸã§ãããšæ³åããŠã¿ãŠãã ãããWeb USB APIã¯ããããã®ã·ããªãªããã®ä»ç¡æ°ã®ã·ããªãªãå ·äœçãªçŸå®ã«ããŸãã
Web USB APIãšã¯äœãïŒ
Web USB APIã¯ãWebã¢ããªã±ãŒã·ã§ã³ãUSBïŒãŠãããŒãµã«ã»ã·ãªã¢ã«ã»ãã¹ïŒããã€ã¹ãšéä¿¡ã§ããããã«ããJavaScript APIã§ããWebUSB仿§ã®äžéšãšããŠéçºãããWebããŒãžãUSBåšèŸºæ©åšãçºèŠãæ¥ç¶ããããŒã¿ãéåä¿¡ããããã®å®å šã§æšæºåãããæ¹æ³ãæäŸããããšãç®çãšããŠããŸããæŽå²çã«ãWebãã©ãŠã¶ããã®çŽæ¥çãªUSBã¢ã¯ã»ã¹ã¯äžå¯èœã§ãããããããã¯ç¬èªã®ãã©ã°ã€ã³ããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããåå ¥éå£ãèããé«ããã¯ãã¹ãã©ãããã©ãŒã ã®äºææ§ãå¶éããŠããŸããã
Web USB APIã¯ãããŒããŠã§ã¢ãšã®å¯Ÿè©±ããã©ãŠã¶ç°å¢ã«çŽæ¥æã¡èŸŒãããšã§ããã®æ°äž»åãç®æããŠããŸããããã«ãããéçºè ã¯ããŠãŒã¶ãŒã«å¥éè€éãªå¯èœæ§ã®ããã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒãã»ã€ã³ã¹ããŒã«ãããããšãªããç©çããã€ã¹ã®èœåãæŽ»çšãããªããã§ã€ã³ã¿ã©ã¯ãã£ããªWebäœéšãæ§ç¯ã§ããŸããããã¯ãã€ã³ã¿ãŒãããé床ãããã€ã¹ã®æ§èœããŸãã¯ç®¡çè æš©éã®å¶éã«ããããœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãéå£ãšãªãåŸãã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠç¹ã«æçã§ãã
äž»èŠãªæŠå¿µãšæ©èœ
Web USB APIã广çã«å©çšããããã«ã¯ããã®ã³ã¢ã³ã³ããŒãã³ããšããããã©ã®ããã«çžäºäœçšããããçè§£ããããšãäžå¯æ¬ ã§ãã
1. ããã€ã¹ã®æ€åºãšéžæ
USBããã€ã¹ãšéä¿¡ããæåã®ã¹ãããã¯ãããã€ã¹ãæ€åºããŠéžæããããšã§ããWeb USB APIã¯ããã©ãŠã¶ãæ¥ç¶ãããŠããUSBããã€ã¹ãåæãããŠãŒã¶ãŒãã¢ã¯ã»ã¹ãèš±å¯ããããã€ã¹ãéžæã§ããã¡ã«ããºã ãæäŸããŸãã
navigator.usb.getDevices(): ãã®ã¡ãœããã¯ãçŸåšã®ãªãªãžã³ã以åã«ã¢ã¯ã»ã¹èš±å¯ãäžãããããã¹ãŠã®USBããã€ã¹ã®ãªã¹ããååŸããŸããããã¯ä»¥åã«äœ¿çšããããã€ã¹ã«åæ¥ç¶ããã®ã«äŸ¿å©ã§ããnavigator.usb.requestDevice(options): ããã¯æ°ããæ¥ç¶ãéå§ããããã®äž»èŠãªã¡ãœããã§ãããŠãŒã¶ãŒã«ããã€ã¹éžæãã€ã¢ãã°ã衚瀺ããå©çšå¯èœãªUSBããã€ã¹ã®äžããéžæãããŸããoptionsãã©ã¡ãŒã¿ã¯ããã§éåžžã«éèŠã§ããã³ããŒIDïŒVIDïŒãšãããã¯ãIDïŒPIDïŒããŸãã¯USBã¯ã©ã¹ããµãã¯ã©ã¹ããããã³ã«ã«åºã¥ããŠãã£ã«ã¿ãæå®ããŸããããã«ãããé¢é£ããããã€ã¹ã®ã¿ããŠãŒã¶ãŒã«æç€ºãããã»ãã¥ãªãã£ãšãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžããŸãã
äŸïŒæŠå¿µïŒ:
ç¹å®ã®ArduinoããŒãã«æ¥ç¶ããããšããŸããéåžžããã®ãã³ããŒIDïŒäŸïŒArduinoã®å Žåã¯0x2341ïŒãšãããã¯ãIDïŒäŸïŒArduino Unoã®å Žåã¯0x0043ïŒãç¥ã£ãŠããŸããrequestDeviceã®åŒã³åºãã¯æ¬¡ã®ããã«ãªããŸãã
async function connectArduino() {
try {
const device = await navigator.usb.requestDevice({
filters: [{ vendorId: 0x2341, productId: 0x0043 }]
});
console.log("Connected to Arduino:", device);
// Proceed with communication
} catch (error) {
console.error("Error connecting to device:", error);
}
}
async/awaitã®äœ¿çšã¯ãçŸä»£ã®JavaScriptã§éåææäœãåŠçããããã®æšæºçãªææ³ã§ããããã€ã¹éžæã®ããã®æç€ºçãªãŠãŒã¶ãŒããã³ããã¯ãæªæã®ãããŠã§ããµã€ããæ¥ç¶ãããããŒããŠã§ã¢ã«éãã«ã¢ã¯ã»ã¹ããã®ãé²ãããã®éèŠãªã»ãã¥ãªãã£æ©èœã§ãã
2. ããã€ã¹ã®è¡šçŸãšæ å ±
ããã€ã¹ãéžæããããšããã©ãŠã¶ã¯USBDeviceãªããžã§ã¯ããæäŸããŸãããã®ãªããžã§ã¯ãã¯ãéžæãããããã€ã¹ãšå¯Ÿè©±ããããã«å¿
èŠãªãã¹ãŠã®æ
å ±ãšã¡ãœãããã«ãã»ã«åããŠããŸãã
USBDeviceããããã£:USBDeviceãªããžã§ã¯ãã«ã¯ãvendorIdãproductIdãproductNameãmanufacturerNameãserialNumberãªã©ã®ããããã£ãããã®configurationãinterfacesãopenedã¹ããŒã¿ã¹ã«é¢ããæ å ±ãå«ãŸããŸããopen(): ãã®ã¡ãœããã¯ããã€ã¹ãžã®æ¥ç¶ãéããããŒã¿è»¢éã®æºåãããŸããclose(): ãã®ã¡ãœããã¯ããã€ã¹ãžã®æ¥ç¶ãéããŸããselectConfiguration(configurationValue): USBããã€ã¹ã¯è€æ°ã®ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ãæã€ããšãã§ããŸãããã®ã¡ãœããã¯äœ¿çšããç¹å®ã®ã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ãéžæããŸããclaimInterface(interfaceNumber): Webã¢ããªã±ãŒã·ã§ã³ãããã€ã¹äžã®ç¹å®ã®USBã€ã³ã¿ãŒãã§ãŒã¹ãšéä¿¡ããåã«ããã®ã€ã³ã¿ãŒãã§ãŒã¹ãèŠæ±ïŒclaimïŒããå¿ èŠããããŸããããã«ãããä»ã®ã¢ããªã±ãŒã·ã§ã³ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãå¹²æžããã®ãé²ããŸããreleaseInterface(interfaceNumber): 以åã«èŠæ±ããã€ã³ã¿ãŒãã§ãŒã¹ãè§£æŸããŸãã
äŸïŒããã€ã¹æ å ±ã®ååŸïŒ:
async function getDeviceInfo(device) {
if (device.opened) {
console.log(`Device already open: ${device.productName}`);
} else {
await device.open();
console.log(`Device opened successfully: ${device.productName}`);
}
if (device.configuration === null) {
// If no configuration is selected, select the first one
await device.selectConfiguration(1);
}
console.log("Vendor ID:", device.vendorId);
console.log("Product ID:", device.productId);
console.log("Product Name:", device.productName);
console.log("Manufacturer Name:", device.manufacturerName);
console.log("Serial Number:", device.serialNumber);
// You can also list interfaces if needed
console.log("Interfaces:", device.interfaces);
}
ãã®ãã§ãŒãºã¯ãå®å®ããéä¿¡ãã£ãã«ã確ç«ããããã«äžå¯æ¬ ã§ããã³ã³ãã£ã®ã¥ã¬ãŒã·ã§ã³ãéžæããã€ã³ã¿ãŒãã§ãŒã¹ãèŠæ±ãããšããæŠå¿µã¯ãUSBããã€ã¹ãã©ã®ããã«åäœãããã®åºæ¬ã§ãããWeb USB APIã«çŽæ¥åæ ãããŠããŸãã
3. ããŒã¿è»¢é
ã€ã³ã¿ãŒãã§ãŒã¹ãèŠæ±ããããšãããã€ã¹ãšã®éã§ããŒã¿ãéåä¿¡ã§ããŸããããã¯ãã€ã³ã¿ãŒãã§ãŒã¹å ã®è«ççãªéä¿¡ãã£ãã«ã§ãããšã³ããã€ã³ããä»ããŠè¡ãããŸãã
- ãšã³ããã€ã³ã: USBããã€ã¹ã«ã¯å ¥åïŒINïŒãšåºåïŒOUTïŒã®ãšã³ããã€ã³ãããããŸããããŒã¿ã¯OUTãšã³ããã€ã³ãã«éä¿¡ãããINãšã³ããã€ã³ãããåä¿¡ãããŸããåãšã³ããã€ã³ãã«ã¯äžæã®ã¢ãã¬ã¹ãšæ¹åããããŸãã
transferOut(endpointNumber, data): æå®ãããOUTãšã³ããã€ã³ãã«ããŒã¿ãéä¿¡ããŸããdataã¯BufferSourceïŒäŸïŒArrayBufferãUint8ArrayïŒã§ããtransferIn(endpointNumber, length): æå®ãããINãšã³ããã€ã³ãããæå®ããããã€ãæ°ã®ããŒã¿ãåä¿¡ããããšãèŠæ±ããŸããããã¯ãåä¿¡ããããŒã¿ãå«ãUSBInTransferResultãªããžã§ã¯ãã§è§£æ±ºãããPromiseãè¿ããŸããclearHalt(direction, endpointNumber): æå®ããããšã³ããã€ã³ãã®åæ¢ç¶æ ãã¯ãªã¢ããŸããisochronousTransferIn(...),isochronousTransferOut(...): ãªãŒãã£ãªããããªã®ãããªãªã¢ã«ã¿ã€ã ã®ããŒã¿ã¹ããªãŒã ã«ã¯ãä¿èšŒããã垯åå¹ ãæäŸããããšã©ãŒèšæ£ã¯ãªãã¢ã€ãœã¯ããã¹è»¢éã䜿çšãããŸãã
äŸïŒããŒã¿ã®éåä¿¡ïŒ:
async function sendAndReceive(device) {
// Assuming interface 0, endpoint 1 is an OUT endpoint and endpoint 2 is an IN endpoint
const OUT_ENDPOINT = 1;
const IN_ENDPOINT = 2;
const BYTES_TO_READ = 64; // Example: Read up to 64 bytes
// Sending data
const dataToSend = new Uint8Array([0x01, 0x02, 0x03, 0x04]); // Example data
await device.transferOut(OUT_ENDPOINT, dataToSend);
console.log("Data sent successfully.");
// Receiving data
const result = await device.transferIn(IN_ENDPOINT, BYTES_TO_READ);
if (result.data && result.data.byteLength > 0) {
const receivedData = new Uint8Array(result.data);
console.log("Received data:", receivedData);
} else {
console.log("No data received or transfer incomplete.");
}
}
ãããå¯Ÿè©±ã®æ žå¿ã§ããä»»æã®ããŒã¿ãéåä¿¡ã§ããèœåã«ãããæ¥ç¶ãããUSBããã€ã¹ãå®å šã«å¶åŸ¡ã§ããŸãããã ããããã¯ããã€ã¹ã®ãã¡ãŒã ãŠã§ã¢ãšããããµããŒããããããã³ã«ã«ãã£ãŠã®ã¿å¶éãããŸãã
4. ã³ã³ãããŒã«è»¢é
æšæºçãªããŒã¿è»¢éã«å ããŠãWeb USB APIã¯ã³ã³ãããŒã«è»¢éããµããŒãããŠããŸããããã¯ããã€ã¹ã®æ§æãã¹ããŒã¿ã¹èŠæ±ãããã³ãã®ä»ã®åºæ¬çãªæäœã«äœ¿çšãããŸãã
controlTransferIn(setup, length): ããã€ã¹ããããŒã¿ãèªã¿åãããã®ã³ã³ãããŒã«è»¢éãå®è¡ããŸããcontrolTransferOut(setup, data): ããã€ã¹ã«ããŒã¿ãæžã蟌ãããã®ã³ã³ãããŒã«è»¢éãå®è¡ããŸãã
setupãã©ã¡ãŒã¿ã¯USBControlTransferParametersãªããžã§ã¯ãã§ããããªã¯ãšã¹ãã¿ã€ããåä¿¡è
ããªã¯ãšã¹ãã³ãŒããå€ãããã³ã€ã³ããã¯ã¹ãæå®ããŸãããããã¯ããã°ãã°æšæºã®USBãªã¯ãšã¹ãã«å¯Ÿå¿ããäœã¬ãã«ã®ã³ãã³ãã§ãã
äŸïŒæŠå¿µçãªã³ã³ãããŒã«è»¢éïŒ:
async function getDeviceDescriptor(device) {
const setup = {
requestType: 'standard', // 'standard', 'class', or 'vendor'
recipient: 'device', // 'device', 'interface', 'endpoint', or 'other'
request: 0x06, // Standard USB Request: GET_DESCRIPTOR
value: 0x0100, // Descriptor Type: DEVICE (0x01), Index: 0
index: 0 // Index for endpoint descriptor
};
const length = 18; // Length of a standard device descriptor
const result = await device.controlTransferIn(setup, length);
if (result.data) {
console.log("Device Descriptor:", new Uint8Array(result.data));
}
}
ã³ã³ãããŒã«è»¢éã¯ãããã€ã¹ã®åæåãããã€ã¹ã®èœåãåãåãããããã«äžå¯æ¬ ã§ããããã°ãã°æšæºçãªããŒã¿è»¢éãéå§ãããåã«äœ¿çšãããŸãã
ãã©ãŠã¶ã®ãµããŒããšå©çšå¯èœæ§
Web USB APIã¯æ¯èŒçæ°ããAPIã§ããããã®æ¡çšã¯ãã©ãŠã¶ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ãã£ãŠç°ãªããŸããçŸåšãæããµããŒããå å®ããŠããã®ã¯ä»¥äžã®éãã§ãã
- Google Chrome: ãã¹ã¯ããããã©ãããã©ãŒã ïŒWindows, macOS, LinuxïŒã§åºããµããŒããããŠããŸãã
- Microsoft Edge: ChromiumããŒã¹ã§ãããããè¯å¥œãªãµããŒããæäŸããŠããŸãã
- Opera: äžè¬çã«Chromeã®å®è£ ã«è¿œåŸããŠããŸãã
Mozilla FirefoxãSafariãªã©ã®ä»ã®ãã©ãŠã¶ã§ã®ãµããŒãã¯éå®çã§ãããããŸã å®è£ ãããŠããŸããããŸãããã©ãŠã¶ã®å®è£ ã«ã¯åŸ®åŠãªéãããã£ãããç¹ã«åæã®ããŒãžã§ã³ã§ã¯ç¹å®ã®ãã©ã°ãæå¹ã«ããå¿ èŠããã£ããããããšã«ã泚æãå¿ èŠã§ããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ãšã£ãŠãããã¯éçºè ãã¿ãŒã²ãããšãããã©ãŠã¶ç°å¢ã«æ³šæãæãå¿ èŠãããããšãæå³ããŸããåºç¯ãªæ¡çšã®ããã«ã¯ããã©ãŒã«ããã¯æŠç¥ããã©ãŠã¶äºææ§ã®æç¢ºãªè¡šç€ºãäžå¯æ¬ ã§ãã
ããã«ãWeb USB APIã¯ã»ãšãã©ã®ãã©ãŠã¶ã§ã»ãã¥ã¢ãªã³ã³ããã¹ãïŒHTTPSïŒãå¿ èŠãšãããã®ã»ãã¥ãªãã£ã¢ãã«ãããã«åŒ·åããŠããŸããããã¯ãWeb USBã䜿çšããã¢ããªã±ãŒã·ã§ã³ã¯å¹³æã®HTTPãŠã§ããµã€ãã§ãã¹ãã§ããªãããšãæå³ããŸãã
ã»ãã¥ãªãã£ã«é¢ããèæ ®äºé
Webãã©ãŠã¶ããããŒããŠã§ã¢ã«ã¢ã¯ã»ã¹ããå Žåãã»ãã¥ãªãã£ã¯æåªå äºé ã§ããWeb USB APIã¯ãããã€ãã®ã»ãã¥ãªãã£æ©èœãåããŠèšèšãããŠããŸãã
- ãŠãŒã¶ãŒã®åæ: éèŠãªããšã«ããã©ãŠã¶ã¯USBããã€ã¹ãžã®èªåçãªã¢ã¯ã»ã¹ãèš±å¯ããŸããããŠãŒã¶ãŒã¯ããã©ãŠã¶ãæäŸããããã³ããïŒ
navigator.usb.requestDevice()ã䜿çšïŒãéããŠæç€ºçã«ããã€ã¹ãéžæããå¿ èŠããããŸããããã«ãããæªæã®ãããŠã§ããµã€ããæ¥ç¶ãããåšèŸºæ©åšãä¹ã£åãã®ãé²ããŸãã - ãªãªãžã³ãžã®ãã€ã³ã: ãŠã§ããµã€ãã«äžããããèš±å¯ã¯ããã®ãªãªãžã³ïŒã¹ããŒã ããã¡ã€ã³ãããŒãïŒã«çŽä»ããããŸãããŠãŒã¶ãŒã
https://example.comäžã®ããã€ã¹ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããå Žåããã®èš±å¯ã¯https://subdomain.example.comãhttps://another-site.comã«ã¯èªåçã«æ¡åŒµãããŸããã - ãµã€ã¬ã³ãã¢ã¯ã»ã¹ãªã: APIã¯ãéããªããã€ã¹ã®åæãæ¥ç¶ãèš±å¯ããŸããã
- æš©éææ Œã®å¶é: APIã¯åŒ·åãªã¢ã¯ã»ã¹ãæäŸããŸããããã©ãŠã¶ã®ãµã³ãããã¯ã¹å ã§åäœããããã«èšèšãããŠããããŠãŒã¶ãŒã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã äžã§ã®æš©éææ Œã®å¯èœæ§ãå¶éããŠããŸãã
ãããã®å¯Ÿçã¯ãç¹ã«ããã€ã¹ã®æææš©ãã»ãã¥ãªãã£æ £è¡ãããžã¿ã«ãªãã©ã·ãŒã倧ããç°ãªã倿§ãªã°ããŒãã«ç°å¢ã«ãããŠããŠãŒã¶ãŒãä¿è·ããããã«äžå¯æ¬ ã§ããéçºè ã¯ããããã®ã»ãã¥ãªãã£ããã³ãããšãä¿¡é Œã§ãããŠã§ããµã€ãã«ã®ã¿ã¢ã¯ã»ã¹ãèš±å¯ããããšã®éèŠæ§ã«ã€ããŠãŠãŒã¶ãŒãæè²ããªããã°ãªããŸããã
å®è·µçãªãŠãŒã¹ã±ãŒã¹ãšã°ããŒãã«ãªäŸ
Web USB APIã¯ãç©çããã€ã¹ãšå¯Ÿè©±ããWebã¢ããªã±ãŒã·ã§ã³ã®å¯èœæ§ã®äžçãåãéããŸãã以äžã«ãããŸããŸãªå°åãæ¥çã§ã©ã®ããã«äœ¿çšã§ãããã®äŸãããã€ã瀺ããŸãã
1. æè²ãšç§åŠ
- ãªã¢ãŒãã©ã: å°éæ©åšãžã®ã¢ã¯ã»ã¹ãéãããŠããåœã®åŠçããWebã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠäžå€®ã®ã©ãã«ããUSBé¡åŸ®é¡ãåå èšããŸãã¯ãªã·ãã¹ã³ãŒãã«æ¥ç¶ã§ããŸããããã«ãããé éã§å®éšãè¡ããããŒã¿ãåéããããšãã§ããŸããäŸãã°ãã€ã³ãã®å€§åŠããäžçäžã®åŠçãUSBé§åã®æ»Žå®è£ 眮ãå¶åŸ¡ã§ããä»®æ³ååŠã©ããæäŸããããšãã§ããŸãã
- ã€ã³ã¿ã©ã¯ãã£ãåŠç¿ããŒã«: USBã€ã³ã¿ãŒãã§ãŒã¹ãåãããã€ã¯ãã³ã³ãããŒã©ãŒïŒArduinoãRaspberry Pi Picoãªã©ïŒã䜿çšããæè²ããããWebããŒãžããå¶åŸ¡ã§ããŸããããã«ãããåŠçã¯èªåã®ã³ãŒããç©çã³ã³ããŒãã³ãã«äžãã峿ã®å¹æããå Žæã«é¢ä¿ãªãèŠãããšãã§ããã€ã³ã¿ã©ã¯ãã£ããªããã°ã©ãã³ã°ã¬ãã¹ã³ãå¯èœã«ãªããŸãããã©ãžã«ã®ã³ãŒãã£ã³ã°ããŒããã£ã³ãããUSBæ¥ç¶ã®LEDãããªãã¯ã¹ãšçŽæ¥éä¿¡ããWebããŒã¹ã®IDEã䜿çšããŠãç©çã³ã³ãã¥ãŒãã£ã³ã°ã®æŠå¿µãæããŠãããšæ³åããŠã¿ãŠãã ããã
2. ç£æ¥ãšè£œé
- æ©æ¢°ã®ç£èŠãšå¶åŸ¡: å·¥å Žã¯ãæ©æ¢°ã«æèŒãããUSB察å¿ã®ã»ã³ãµãŒãã³ã³ãããŒã©ãŒã«æ¥ç¶ããWebããã·ã¥ããŒããå±éã§ããŸããããã«ãããäºææ§ã®ãããã©ãŠã¶ãåããä»»æã®ããã€ã¹ãããçç£ã©ã€ã³ã枩床枬å®å€ããŸãã¯å§åã¬ãã«ããªã¢ã«ã¿ã€ã ã§ç£èŠã§ããŸãããã€ãã®è£œé å·¥å Žã§ã¯ãUSBããŒã¹ã®æž¬å®ããã€ã¹ãšã€ã³ã¿ãŒãã§ãŒã¹ããŠå質管çããŒã¿ãèšé²ããWebã¢ããªã±ãŒã·ã§ã³ãæã€ããšãã§ããŸãã
- èšå®ããŒã«: USBé§åã®ç£æ¥æ©åšã®ãã¡ãŒã ãŠã§ã¢ãæŽæ°ããããèšå®ãæ§æãããããããšããWebã€ã³ã¿ãŒãã§ãŒã¹ãéããŠçŽæ¥è¡ããããã«ãªããããã€ã¹ã¿ã€ãããšã«ç¬èªã®ãœãããŠã§ã¢ã€ã³ã¹ããŒã©ãŒãäžèŠã«ãªããŸããããããå·¥åŠãå°éãšããæ¥æ¬ã®äŒæ¥ã¯ãUSBæ¥ç¶ã®ããããã¢ãŒã ãç°¡åã«èšå®ããããã®WebããŒã¹ã®ããŒã«ãæäŸãããããããŸããã
3. å®¶é»è£œåãšIoT
- ã¹ããŒãããŒã ããã€ã¹ç®¡ç: å€ãã®ã¹ããŒãããŒã ããã€ã¹ã¯Wi-FiãBluetoothã䜿çšããŸãããåæèšå®ãé«åºŠãªèšºæã®ããã«USBã€ã³ã¿ãŒãã§ãŒã¹ãæã€ãã®ããããŸããWebã¢ããªã±ãŒã·ã§ã³ã¯ããªãŒã¹ãã©ãªã¢ã®æ°ããUSBæ¥ç¶ã¹ããŒããµãŒã¢ã¹ã¿ããã®ãªã³ããŒãã£ã³ã°ããã»ã¹ãç°¡çŽ åããããšãã§ããŸãã
- ã«ã¹ã¿ã åšèŸºæ©åš: ããã€ã¹ããã¡ã€ã«ãŒã¯ãèªèº«ãäœæããUSBå¶åŸ¡ããã€ã¹çšã®ã«ã¹ã¿ã Webã€ã³ã¿ãŒãã§ãŒã¹ãäœæã§ããŸããããã«ã¯ã3Dããªã³ã¿ãŒã®ã³ã³ãããŒã«ããã«ãããã«ã¹ã¿ã ããŒããŒãã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãLEDç §æå¶åŸ¡ã·ã¹ãã ãŸã§ãããŸããŸãªãã®ããããŸããã«ããã®ã¡ã€ã«ãŒã³ãã¥ããã£ã¯ãç¬èªã®USBé§åã¢ãŒãã€ã³ã¹ã¿ã¬ãŒã·ã§ã³ãå¶åŸ¡ããå±ç€ºããããã®å ±æWebãã©ãããã©ãŒã ãéçºãããããããŸããã
4. ãã«ã¹ã±ã¢
- æ£è ã¢ãã¿ãªã³ã°ïŒå³æ Œãªç®¡çäžã§ïŒ: 管çãããç°å¢ã§ã¯ãç¹å®ã®éã¯ãªãã£ã«ã«ãªUSBæ¥ç¶ã®å¥åº·ç£èŠããã€ã¹ããããŒã¿éçŽã衚瀺ã®ããã«Webã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠã¢ã¯ã»ã¹å¯èœã«ãªãå ŽåããããŸãããã«ã¹ã±ã¢ã¢ããªã±ãŒã·ã§ã³ã¯ããã©ã€ãã·ãŒèŠå¶ïŒç±³åœã®HIPAAãæ¬§å·ã®GDPRãªã©ïŒãžã®å³æ Œãªæºæ ãšãå ç¢ãªã»ãã¥ãªãã£ãããã³ã«ãå¿ èŠã§ããããšã匷調ããããšãéèŠã§ããè±åœã®ç ç©¶æ©é¢ã¯ãé·æçãªæ£è ç ç©¶ã«ãããŠUSBæ¥ç¶ã®ç°å¢ã»ã³ãµãŒããããŒã¿ãåéããããã«Web USBã䜿çšããå¯èœæ§ããããŸãã
課é¡ãšå¶é
ãã®å¯èœæ§ã«ãããããããWeb USB APIã«ã¯èª²é¡ããªãããã§ã¯ãããŸããã
- éå®çãªãã©ãŠã¶ãµããŒã: åè¿°ã®ããã«ããã¹ãŠã®äž»èŠãªãã©ãŠã¶ãWeb USBããµããŒãããŠããããã§ã¯ãªããããã«å®å šã«äŸåããã¢ããªã±ãŒã·ã§ã³ã®ãªãŒããå¶éããŠããŸããããã«ãããéçºè ã¯ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããããµããŒããããŠããªããã©ãããã©ãŒã åãã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³ãæ€èšããå¿ èŠããããŸãã
- ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãã©ã€ã: Web USBã¯è€éãã®å€ããæœè±¡åããŸãããåºç€ãšãªããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯äŸç¶ãšããŠåœ¹å²ãæãããŸãããã©ãŠã¶ãUSBããã€ã¹ããªã¹ãã¢ããããåã«ãOSãããã€ã¹ãæ£ããèªèããããã«ç¹å®ã®ãã©ã€ããå¿ èŠãªå ŽåããããŸããããã¯ã倿§ãªã°ããŒãã«ITç°å¢ã§ã¯ç¹ã«åä»ãªåé¡ãšãªãåŸãŸãã
- USBãããã³ã«ã®è€éã: USBã¯è€éãªãããã³ã«ã§ããããã€ã¹ã¯ã©ã¹ããšã³ããã€ã³ãããã£ã¹ã¯ãªãã¿ã転éã¿ã€ããçè§£ããããšãäžå¯æ¬ ã§ããWeb USB APIã¯JavaScriptã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãããUSBéä¿¡ã®åºç€ç¥èã¯äŸç¶ãšããŠå¿ èŠã§ãã
- ã»ãã¥ãªãã£ããã³ããã¯åšå§çã«æããããããšããã: å¿ èŠã§ã¯ãããŸãããããã€ã¹ã¢ã¯ã»ã¹ã«é¢ãããŠãŒã¶ãŒããã³ããã¯ããã®æŠå¿µã«äžæ £ããªãŠãŒã¶ãŒã«ãšã£ãŠã¯æ··ä¹±ãæããããèŠæããããããå¯èœæ§ããããèš±å¯ãäžããããšãããããããå¯èœæ§ããããŸããæç¢ºãªãŠãŒã¶ãŒæè²ãäžå¯æ¬ ã§ãã
- çŽæ¥çãªHIDãµããŒãã®æ¬ åŠïŒæŽå²çã«ïŒ: Web USBã¯HIDïŒãã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹ïŒæ©èœããšãã¥ã¬ãŒãããããã«äœ¿çšã§ããŸãããæ±çšHIDããã€ã¹ãžã®çŽæ¥ã¢ã¯ã»ã¹ã¯åœåãå¥ã®åãçµã¿ïŒWebHID APIïŒã§ãããããããã«ã¹ã¿ã USBããã€ã¹ãšéä¿¡ããäž»èŠãªæ¹æ³ã¯äŸç¶ãšããŠWeb USBã§ãã
- äœã¬ãã«æ©èœãžã®éå®çãªã¢ã¯ã»ã¹: APIã¯ãã»ãã¥ãªãã£ãšäœ¿ããããã®çç±ãããéåžžã«äœã¬ãã«ãªUSBæäœã®äžéšãæœè±¡åããŠããŸããUSBãã±ããã®ã¿ã€ãã³ã°ããã¹ã®åæã«å¯Ÿããæ·±ãå¶åŸ¡ãå¿ èŠãšããé«åºŠã«å°éåãããããŒããŠã§ã¢ãšã®å¯Ÿè©±ã«ã¯ãWeb USBã§ã¯äžååãªå ŽåããããŸãã
ã°ããŒãã«éçºã®ããã®ãã¹ããã©ã¯ãã£ã¹
åœéçãªãªãŒãã£ãšã³ã¹åãã«Web USBã¢ããªã±ãŒã·ã§ã³ãéçºããéã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãšæè²ãåªå
ãã:
- USBããã€ã¹ã®æ¥ç¶ãšèªèšŒæ¹æ³ã«ã€ããŠãæç¢ºã§ç°¡æœãªæç€ºãæäŸããŸãã
- å¯èœãªéãå°éçšèªãé¿ããçè§£ããããèšèã䜿çšããŸãã
- ãã©ãŠã¶ã®ããã³ããã衚瀺ãããçç±ã説æãããŠãŒã¶ãŒã«ãã®å®å šæ§ãä¿èšŒããŸãã
- ãŠãŒã¶ãŒåãã®ãã¹ãŠã®ããã¹ããšæç€ºã«å€èšèªãµããŒããæäŸããŸãã
- å
ç¢ãªãã©ãŒã«ããã¯ãå®è£
ãã:
- Web USBã®ãã©ãŠã¶ãµããŒããæ€åºãããµããŒããããŠããªããã©ãŠã¶ã«ã¯ä»£æ¿æ©èœãæ å ±ã¡ãã»ãŒãžãæäŸããŸãã
- Web USBãå©çšã§ããªããã©ãããã©ãŒã ããã©ãŠã¶åãã«ãããŠã³ããŒãå¯èœãªã³ã³ãããªã³ã¢ããªã±ãŒã·ã§ã³ã®æäŸãæ€èšããŸãã
- ãšã©ãŒãé©åã«åŠçãã:
- USBéä¿¡ã¯è匱ãªå ŽåããããŸããæ¥ç¶ã®åé¡ãããŒã¿è»¢éã®å€±æãäºæããªãããã€ã¹ã®ç¶æ ã«å¯Ÿããå æ¬çãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã
- ãŠãŒã¶ãŒãåé¡ã解決ããæ¹æ³ãæ¡å ãããæçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
- ããã©ãŒãã³ã¹ãšåž¯åå¹
ãæé©åãã:
- ã¢ããªã±ãŒã·ã§ã³ãUSBããã€ã¹ãã倧éã®ããŒã¿ãåŠçããå¿ èŠãããå Žåã¯ãJavaScriptã§ã®å¹ççãªããŒã¿åŠçïŒäŸïŒåä»ãé åã®äœ¿çšïŒãæ€èšãããã©ãŠã¶ãããã€ã¹ãå§åããªãããã«æŽæ°ããããŠã³ã¹ãŸãã¯ã¹ããããªã³ã°ããããšãæ€èšããŸãã
- ããŒã¿åæãã¯ã©ãŠãããŒã¹ã®æ©èœãèšèšããéã«ã¯ãäžçäžã®ããŸããŸãªã€ã³ã¿ãŒãããé床ãšããã€ã¹èœåãèæ ®ããŸãã
- 倿§ãªç°å¢ã§ãã¹ããã:
- ããŸããŸãªUSBããã€ã¹ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ããã©ãŠã¶ããŒãžã§ã³ã§ã¢ããªã±ãŒã·ã§ã³ããã¹ãããŸãã
- ä¿¡é Œæ§ã確ä¿ããããã«ãããŸããŸãªãããã¯ãŒã¯æ¡ä»¶ãšããŒããŠã§ã¢æ§æãã·ãã¥ã¬ãŒãããŸãã
- ã»ãã¥ãªãã£åºæºãéµå®ãã:
- åžžã«HTTPSã䜿çšããŸãã
- ã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããæš©éãšãã®çç±ãæç¢ºã«å®çŸ©ããŸãã
- ããŒã¿åŠçãšãã©ã€ãã·ãŒã«ã€ããŠéææ§ãä¿ã¡ãŸãã
- ãã³ããŒIDãšãããã¯ãIDãæŠç¥çã«æŽ»çšãã:
- VID/PIDã«ãããã£ã«ã¿ãªã³ã°ã¯äžè¬çã§ãããã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªããã€ã¹åãã«èšèšãããŠããå Žåã¯ãããåºç¯ãªUSBã¯ã©ã¹ããããã³ã«ã®ãµããŒããæ€èšããŸãã
- äžéšã®è£œé å ã¯æ±çšã®VID/PIDãã¢ã䜿çšããŠãããããããå ·äœçãªãã£ã«ã¿ãªã³ã°ããŠãŒã¶ãŒéžæãå¿ èŠã«ãªãå Žåãããããšã«æ³šæããŠãã ããã
Web USBã®æªæ¥
Web USB APIã¯ãWebãããŒããŠã§ã¢å¶åŸ¡ã®ããã®ããã€ã³ã¿ã©ã¯ãã£ãã§æèœãªãã©ãããã©ãŒã ã«ããããã®åºç€çãªäžæ©ã§ãããã©ãŠã¶ãã³ããŒãAPIã®å®è£ ãšæ¹è¯ãç¶ããããå€ãã®éçºè ããã®å¯èœæ§ãæ¢æ±ããã«ã€ããŠãç©çäžçãšã·ãŒã ã¬ã¹ã«çµ±åãã驿°çãªWebã¢ããªã±ãŒã·ã§ã³ã®æ¥å¢ãæåŸ ã§ããŸãã
Web Serial APIïŒUSBãä»ããã·ãªã¢ã«éä¿¡çšïŒãWebHID APIïŒãã¥ãŒãã³ã€ã³ã¿ãŒãã§ãŒã¹ããã€ã¹çšïŒãªã©ãé¢é£ããWebæšæºã®ç¶ç¶çãªéçºã¯ãWebãããŒããŠã§ã¢ãšå¯Ÿè©±ããèœåãããã«åŒ·åããŸãããããã®APIã¯ãWeb USBãšçµã¿åãããŠäœ¿çšãããããšã§ãæŽç·Žããããã©ãŠã¶ããŒã¹ã®ããŒããŠã§ã¢ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããããšããéçºè ã«ãšã£ãŠåŒ·åãªããŒã«ããããäœæããŸãã
äžçäžã®éçºè ã³ãã¥ããã£ã«ãšã£ãŠãWeb USB APIã¯æ®éçã«ã¢ã¯ã»ã¹å¯èœãªããŒã«ãšäœéšãæ§ç¯ããæ©äŒãæå³ããŸãããã€ãã£ãéçºã®è€éããæœè±¡åããæšæºåãããå®å šãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããããšã§ãæŽç·ŽãããããŒããŠã§ã¢é§åã®Webã¢ããªã±ãŒã·ã§ã³ãäœæããããã®åå ¥éå£ãäžããŸããæè²ãç£æ¥ããŸãã¯å人çãªãããžã§ã¯ãã®ããã§ããããã©ãŠã¶ããçŽæ¥USBããã€ã¹ã«æ¥ç¶ã§ããèœåã¯ãç§ãã¡ããã¯ãããžãŒãšå¯Ÿè©±ããæ¹æ³ãé©åœçã«å€ããã§ãããã
çµè«
ããã³ããšã³ãWeb USB APIã¯ãWebãã¯ãããžãŒã«ãããéèŠãªé²æ©ã§ãããéçºè ãããžã¿ã«ãšç©çã®é åã®éã®ã®ã£ãããåããåãäžããŸãããã©ãŠã¶å ã§çŽæ¥USBããã€ã¹ãžã®ã¢ã¯ã»ã¹ãšå¶åŸ¡ãå¯èœã«ããããšã§ãã€ã³ã¿ã©ã¯ãã£ãã§ããŒããŠã§ã¢ã匷åãããWebã¢ããªã±ãŒã·ã§ã³ãäœæããããã®åºå€§ãªå¯èœæ§ãè§£ãæŸã¡ãŸãããã©ãŠã¶ãµããŒããåºæã®USBã®è€éãã«é¢é£ãã課é¡ã¯æ®ã£ãŠããŸãããæç¢ºãªã»ãã¥ãªãã£äžã®å©ç¹ãšã¯ãã¹ãã©ãããã©ãŒã ã€ãããŒã·ã§ã³ã®å¯èœæ§ã«ãããæ¢æ±ãã䟡å€ã®ããAPIãšãªã£ãŠããŸãã
äžçäžã®éçºè ã«ãšã£ãŠãWeb USB APIãåãå ¥ããããšã¯ãWebã¢ããªã±ãŒã·ã§ã³ãåãªãæ å ±ä»¥äžã®ãã®ãæäŸã§ããæä»£ã«è¶³ãèžã¿å ¥ããããšãæå³ããŸããã€ãŸããç§ãã¡ã®äžçã圢äœãããã€ã¹ãšã®å ·äœçãªçžäºäœçšãæäŸã§ããã®ã§ãããšã³ã·ã¹ãã ãæçãããµããŒããæ¡å€§ããã«ã€ããŠãWeb USB APIã¯ã次äžä»£ã®æ¥ç¶ããããã€ã³ããªãžã§ã³ãã§ãæ®éçã«ã¢ã¯ã»ã¹å¯èœãªWebäœéšãæ§ç¯ããããã®äžå¯æ¬ ãªããŒã«ã«ãªãããšã¯ééããããŸããã