JavaScript Web APIs USBDevice を使って FeliCa リーダー/ライターを操作してみました。(その1)

Web APIs USBDevice

MDN のリファレンスを読んでいると、USBDevice なる Web API を見つけた。
ブラウザから USB 機器へアクセスできるようなので、触ってみるとこれがなかなかハードルが高いが、アプリケーションの幅が広がる非常に興味深い API でした。

USB に接続する機種に、非接触ICカードリーダー/ライターを選んだものだから、IC カードの種類やら FeliCa の仕様やらまで調べることになり、結構手間取りました。

昔のように、RS-232Cに自作のケーブルで機器をつないで、コマンドを送受信してた頃に比べたら楽ちんでしたけどね。
備忘録として、情報を置いておきますので、お役に立つことがあれば幸いです。

で、JavaScript で動作するモジュールなんかも作成したのですが、弊社内の技術者にとってはどうでもないような技術らしく、誰も興味を示さないのでそれも公開します。

WebUSB APIとは?

MDN References > Web APIs > USBDevice

MDN のリファレンスによれば、

WebUSB APIのUSBDeviceインターフェースは、ペアリングされたUSBデバイスとそれを制御するためのメソッドに関するメタデータへのアクセスを提供します。

mdn References > Web APIs > USBDevice

と、説明されています。
まあ、ひらたく言えば「ブラウザからクライアントに繋げられたUSB機器を制御できる」というような感じでしょうか。

なにをUSBにつなげる?

SONY 非接触ICカードリーダー/ライター PaSoRi(パソリ) RC-S300

机の上に、たまたまころがっていたのがこれ

非接触ICカードリーダー/ライター PasoRi(パソリ) RC-S300

FeliCa Lite-S のブランクカードもあったので、ちょっと繋いでみました。
モデル名の後ろに /S つきのものと /P つきのものがありますが、ハードの仕様的には変わりがないようです。
ソニーの非接触ICカードリーダー/ライターには、RC-S380 という機種がありますが、これとは互換性がないようです。

FeliCa Lite-S ってなに?

非接触ICカードにはいくつかの種類があり、現在は FeliCa と Mifare が主流です。
FeliCa は、ソニー株式会社の登録商標、Mifare は、NXPセミコンダクターズ社の登録商標です。

FeliCa は、日本では交通系カードや電子マネーカードとして普及している規格です。
現在、FeliCa には「Standard」と「Lite-S」の2種類あります。
交通系カードや電子マネーカードとして利用されているのは FeliCa Standard
セキュリティレベルの低い、社員証や学生証・会員証などで多く利用されているのが FeliCa Lite-S です。

「Standard」と「Lite-S」の大きな違いは、ファイルシステムにあります。
「Standard」のファイルシステムは、システム・エリア・サービス・ブロックデータという構成になっており、サービスはブロックデータにアクセスするための認証用の鍵を保持しています。またエリアは階層構造をとることができ、各エリアは子エリアとサービスに対する認証用の鍵を保持しています。システムは1枚の物理カードに複数の論理カードを保持できます。
このように複雑なファイルシステムと強固な認証システムをもつ FeliCa ですが、ファイル構造が複雑なため小規模なシステムでは扱いづらいというデメリットがあります。
そのデメリットを埋める規格として利用されているのが「Lite-S」です。
「Lite-S」のファイルシステムは、1つのシステム( システムコード:88B4h )と、読み込み/書き込み用と読み込み専用の2つのサービスとブロックしかありません。

FeliCa Lite-S のブロック構成

「Lite-S」のブロックは、1ブロック16バイトで構成されています。16バイトを超えるデータは複数のブロックに分割して格納します。

ブロック番号 00h~0Dh は、ユーザーが自由に使用できる16バイトの領域です。
ブロックの読み出し書き出しは、認証後読み出し・MACつき読み出し、認証後書き出し・MACつき書き出し・認証後MACつき書き出しに対応しています。

認証後読み出し・MACつき読み出し、認証後書き出し・MACつき書き出し・認証後MACつき書き出しについては、ソニー株式会社 FeliCa 非接触ICカード 技術情報(PDFダウンロード) 「FeliCa Lite-Sユーザーズマニュアル」5セキュリティを参照してください。

FeliCa Lite-S のコマンド

「Lite-S」のコマンドは、Plolling・Read Without Encryption・Write Without Encryption の3つだけです。

「JavaScript FeliCa Lite-S操作モジュール」作ってみました。

Web APIs USBDevice を使った説明とかをしなきゃいけないのでしょうが、とりあえず「JavaScript FeliCa Lite-S操作モジュール」の紹介をしておきます。
適当なウェブサーバーと非接触ICカードリーダー/ライター SONY PaSoRi RC-S300 があればサンプルは動作すると思います。Web APIs USBDevice は対応ブラウザがまだ少なく、Chrome / Edge / Opera / Chrome Android しか対応していませんので、リンゴユーザーの方は残念ですが・・・。

動作を見てもらって、モジュールの中身を見てもらえばなんとなく、Web APIs USBDevice の使い方なんかもわかりやすいと思います。

USBDevice の説明と FeliCa Lite-S の説明が混在してしまうと思うので、説明を後回しにしました。

FeliCa Lite-S操作モジュール ArukasNFCLiteS

「FeliCa Lite-S操作モジュール ArukasNFCLiteS」の紹介

JavaScript からこのモジュールを利用すれば、非接触ICカードリーダー/ライター SONY PaSoRi RC-S300へのコネクト・ポーリング・FeliCa Lite-S カードへの読み書きが簡単にできます。

動作確認は、
 OS:Windows10 Pro・Windows10 Home
 ブラウザ: Chrome・Edge
で行っています。
動作ハード確認は、Atom x5-Z8350 という低スペック PC でも動作しました。

ダウンロード

ダウンロードにあたり下記事項を確認してダウンロードしてください。

解凍後には必ず「JavaScript FeliCa Lite-S操作モジュール.txt」を一読し、免責・禁止事項・注意事項をご確認ください。交通系カードや電子マネーカードを使って、データが壊れたとかの責任は一切受け付けません。

・免責

当モジュール及びサンプルプログラムによるいかなる損害も、有限会社さくらシステム及び製作者はその責を一切負いません。

・禁止事項

有限会社さくらシステム及び製作者に許可なく、あらゆるメディア・コンテンツに再掲することを禁じます。

・注意事項

当モジュール及びサンプルプログラムは、技術検証を目的として作成されていますので、負荷試験を始めとする製品化を行うための基準を満たすための試験を一切行っておりませんので、予期せぬ結果を招く場合があります。
その場合であっても、上記免責事項により有限会社さくらシステム及び製作者はその責を一切負いません。

使用方法

ダウンロードした zip ファイルを解凍すると NFC フォルダが作成されますので、適当なWebサーバへアップロードしてください。
Web APIs USBDevice に対応したブラウザからサンプルへアクセスすることで、動作を確認することができます。
詳しくは、NFC フォルダ内の「JavaScript FeliCa Lite-S操作モジュール.txt」を参照してください。

次回

次回から Web APIs USBDevice による USB デバイスの操作方法の説明をしていきます。