質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

3190閲覧

WebUSBでIDmを正しく読み取る方法

Take_it

総合スコア357

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2019/02/19 14:20

編集2019/02/19 14:34

前提・実現したいこと

GoogleChrome+PaSoRi RC380を使用して、Webアプリ上でFeliCa Lite-SのIDmを読み取りたい。

発生している問題・エラーメッセージ

PaSoRiとの通信はできている。- リスト
IDm(16進数16桁)の内、上14桁しか取得できない。

該当のソースコード

Javascript

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> 6 <meta name="robots" content="noindex,nofollow" > 7 <link rel="stylesheet" type="text/css" href="templates/style.css"> 8 <audio id="sound-file" preload="auto"> 9 <source src="sounds/card.mp3" type="audio/mp3"> 10 </audio> 11 </head> 12<script> 13history.pushState(null, null, null); 14 15window.addEventListener("popstate", function () { 16 history.pushState(null, null, null); 17}); 18</script> 19 <body style="background-color:#000000;height:75px"> 20 <table style="width:98%;height:95%"> 21 <tr> 22 <td style="width:20%;text-align:center"> 23 <input type="button" value="Welcome" style="display:block;font-size:xx-large;padding:10px;width:100%;height:65px;text-align:center;background-color:#1e0e99;color:white;bordar:1px solid yellow;border-radius:15px"> 24 </td> 25 <td style="width:60%;text-align:center"> 26 <button id="start" style="background-color:red;display:inline;font-size:xx-large;width:90%;height:65px;border-radius:15px">FeliCaリーダーに接続</button> 27 <button id="waiting" style="display:none;font-size:x-large;width:90%;height:65px;background-color:blue;color:white;wont-weight:bold;border-radius:15px">FeliCaリーダーにカードをかざしてください</button> 28 </td> 29 <td style="width:20%;text-align:center"> 30 <a href="blank_main.php" target="main" style="text-decoration:none;"><input type="button" value="待機画面へ" style="display:block;font-size:x-large;padding:10px;width:90%;height:65px;text-align:center;background-color:#00b8e6;bordar:1px solid yellow;border-radius:15px"></a> 31 </td> 32 </tr> 33 </table> 34 <form name="hiddenform" method="POST" action="user_login.php" target="main"> 35 <input type="hidden" name="idm" id="target"> 36 </form> 37 </body> 38</html> 39 40<script> 41 42let startButton = document.getElementById('start'); 43let waitingMessage = document.getElementById('waiting'); 44async function sleep(msec) { 45 return new Promise(resolve => setTimeout(resolve, msec)); 46} 47async function send(device, data) { 48 let uint8a = new Uint8Array(data); 49 console.log(">>>>>>>>>>"); 50 console.log(uint8a); 51 await device.transferOut(2, uint8a); 52 await sleep(10); 53} 54async function receive(device, len) { 55 console.log("<<<<<<<<<<" + len); 56 let data = await device.transferIn(1, len); 57 console.log(data); 58 await sleep(10); 59 let arr = []; 60 for (let i = data.data.byteOffset; i < data.data.byteLength; i++) { 61 arr.push(data.data.getUint8(i)); 62 } 63 console.log(arr); 64 return arr; 65} 66async function session(device) { 67 // INFO:nfc.clf:searching for reader on path usb:054c:06c3 68 // DEBUG:nfc.clf.transport:using libusb-1.0.21 69 // DEBUG:nfc.clf.transport:path matches '^usb(:[0-9a-fA-F]{4})(:[0-9a-fA-F]{4})?$' 70 // DEBUG:nfc.clf.device:loading rcs380 driver for usb:054c:06c3 71 // Level 9:nfc.clf.transport:>>> 0000ff00ff00 72 await send(device, [0x00, 0x00, 0xff, 0x00, 0xff, 0x00]); 73 // Level 9:nfc.clf.rcs380:SetCommandType 01 74 // Level 9:nfc.clf.transport:>>> 0000ffffff0300fdd62a01ff00 75 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfd, 0xd6, 0x2a, 0x01, 0xff, 0x00]); 76 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 77 await receive(device, 6); 78 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd72b00fe00 79 await receive(device, 13); 80 // Level 9:nfc.clf.rcs380:GetFirmwareVersion 81 // Level 9:nfc.clf.transport:>>> 0000ffffff0200fed6200a00 82 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 83 // Level 9:nfc.clf.transport:<<< 0000ffffff0400fcd7211101f600 84 // DEBUG:nfc.clf.rcs380:firmware version 1.11 85 // Level 9:nfc.clf.rcs380:GetPDDataVersion 86 // Level 9:nfc.clf.transport:>>> 0000ffffff0200fed6220800 87 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 88 // Level 9:nfc.clf.transport:<<< 0000ffffff0400fcd72300010500 89 // DEBUG:nfc.clf.rcs380:package data format 1.00 90 // Level 9:nfc.clf.rcs380:SwitchRF 00 91 // Level 9:nfc.clf.transport:>>> 0000ffffff0300fdd606002400 92 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfd, 0xd6, 0x06, 0x00, 0x24, 0x00]); 93 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 94 await receive(device, 6); 95 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd707002200 96 await receive(device, 13); 97 // Level 9:nfc.clf.rcs380:GetFirmwareVersion 98 // Level 9:nfc.clf.transport:>>> 0000ffffff0200fed6200a00 99 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 100 // Level 9:nfc.clf.transport:<<< 0000ffffff0400fcd7211101f600 101 // DEBUG:nfc.clf.rcs380:firmware version 1.11 102 // INFO:nfc.clf:using SONY RC-S380/P NFC Port-100 v1.11 at usb:020:014 103 // Level 9:nfc.clf.rcs380:SwitchRF 00 104 // Level 9:nfc.clf.transport:>>> 0000ffffff0300fdd606002400 105 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x03, 0x00, 0xfd, 0xd6, 0x06, 0x00, 0x24, 0x00]); 106 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 107 await receive(device, 6); 108 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd707002200 109 await receive(device, 13); 110 // DEBUG:nfc.clf:sense 212F 111 // DEBUG:nfc.clf.rcs380:polling for NFC-F technology 112 // Level 9:nfc.clf.rcs380:InSetRF 01010f01 113 // Level 9:nfc.clf.transport:>>> 0000ffffff0600fad60001010f011800 114 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x06, 0x00, 0xfa, 0xd6, 0x00, 0x01, 0x01, 0x0f, 0x01, 0x18, 0x00]); 115 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 116 await receive(device, 6); 117 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd701002800 118 await receive(device, 13); 119 // Level 9:nfc.clf.rcs380:InSetProtocol 00180101020103000400050006000708080009000a000b000c000e040f001000110012001306 120 // Level 9:nfc.clf.transport:>>> 0000ffffff2800d8d60200180101020103000400050006000708080009000a000b000c000e040f0010001100120013064b00 121 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x28, 0x00, 0xd8, 0xd6, 0x02, 0x00, 0x18, 0x01, 0x01, 0x02, 0x01, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x08, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0e, 0x04, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x06, 0x4b, 0x00]); 122 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 123 await receive(device, 6); 124 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd703002600 125 await receive(device, 13); 126 // Level 9:nfc.clf.rcs380:InSetProtocol 0018 127 // Level 9:nfc.clf.transport:>>> 0000ffffff0400fcd60200181000 128 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x04, 0x00, 0xfc, 0xd6, 0x02, 0x00, 0x18, 0x10, 0x00]); 129 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 130 await receive(device, 6); 131 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd703002600 132 await receive(device, 13); 133 // DEBUG:nfc.clf.rcs380:send SENSF_REQ 00ffff0100 134 // Level 9:nfc.clf.rcs380:InCommRF 6e000600ffff0100 135 // Level 9:nfc.clf.transport:>>> 0000ffffff0a00f6d6046e000600ffff0100b300 136 await send(device, [0x00, 0x00, 0xff, 0xff, 0xff, 0x0a, 0x00, 0xf6, 0xd6, 0x04, 0x6e, 0x00, 0x06, 0x00, 0xff, 0xff, 0x01, 0x00, 0xb3, 0x00]); 137 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 138 await receive(device, 6); 139 // Level 9:nfc.clf.transport:<<< 0000ffffff1b00e5d70500000000081401000000000000000000000000000000000000f700 140 let idm = (await receive(device, 37)).slice(17, 24); 141 if (idm.length > 0) { 142 let idmStr = ''; 143 for (let i = 0; i < idm.length; i++) { 144 if (idm[i] < 16) { 145 idmStr += '0'; 146 } 147 idmStr += idm[i].toString(16); 148 } 149 document.getElementById( 'sound-file' ).play(); 150 document.getElementById( "target" ).value = idmStr; 151 document.hiddenform.submit(); 152 } 153 // DEBUG:nfc.clf.rcs380:rcvd SENSF_RES 01000000000000000000000000000000000000 154 // DEBUG:nfc.clf:found 212F sensf_res=01000000000000000000000000000000000000 155 // 212F sensf_res=01000000000000000000000000000000000000 156 // DEBUG:nfc.tag:trying to activate 212F sensf_res=01000000000000000000000000000000000000 157 // DEBUG:nfc.tag:trying type 3 tag activation for 212F 158 // Type3Tag 'FeliCa Standard' ID=000000000000000 PMM=0000000000000000 SYS=0000 159 // 0000000000000000 160 // Level 9:nfc.clf.rcs380:SwitchRF 00 161 // Level 9:nfc.clf.transport:>>> 0000ffffff0300fdd606002400 162 // Level 9:nfc.clf.transport:<<< 0000ff00ff00 163 // Level 9:nfc.clf.transport:<<< 0000ffffff0300fdd707002200 164 // Level 9:nfc.clf.transport:>>> 0000ff00ff00 165} 166 167startButton.addEventListener('click', async () => { 168 let device; 169 try { 170 device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x054c }] }) 171 console.log("open"); 172 await device.open(); 173 } catch (e) { 174 console.log(e); 175 alert(e); 176 throw e; 177 } 178 try { 179 console.log("selectConfiguration"); 180 await device.selectConfiguration(1); 181 console.log("claimInterface"); 182 await device.claimInterface(0); 183 console.log(device); 184 startButton.style.display = 'none'; 185 waitingMessage.style.display = 'inline'; 186 do { 187 await session(device); 188 await sleep(500); 189 } while (true); 190 } catch (e) { 191 console.log(e); 192 alert(e); 193 try { 194 device.close(); 195 } catch (e) { 196 console.log(e); 197 } 198 startButton.style.display = 'inline'; 199 waitingMessage.style.display = 'none'; 200 idmMessage.style.display = 'none'; 201 throw e; 202 } 203}); 204</script>

試したこと

公開されていたソースを参考にしたが、中身がよくわかっておらず、残り2桁を取得するためにどうすればいいかがわからない。

補足情報(FW/ツールのバージョンなど)

参考にしたのは、
https://qiita.com/saturday06/items/333fcdf5b3b8030c9b05
https://github.com/saturday06/webusb-felica/blob/gh-pages/demo.html
こちらのページです。
device = await navigator.usb.requestDevice({ filters: [{
vendorId: 0x054c,
protocolCode: 0x01
}]});
これだとPaSoRiを認識しないため、
device = await navigator.usb.requestDevice({ filters: [{ vendorId: 0x054c }] })
ここだけ改変しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

2桁足りなかった(本来16桁のはずが14桁取得)ので

javascript

1let idm = (await receive(device, 37)).slice(17, 24);

を、試しに

Javascript

1let idm = (await receive(device, 37)).slice(17, 26);

としてみたところ、14桁から18桁に、4桁増えました。
増えた18桁のデータの先頭16桁が正しいIDmであることが確認できたので、

Javascript

1let idm = (await receive(device, 37)).slice(17, 25);

としたところ、正しい16桁を取得することができました。

投稿2019/02/19 15:07

Take_it

総合スコア357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問