ソニー製FeliCaリーダ・ライタのPaSoRiをLinuxやmacOSなどの環境から利用できるライブラリであるlibpasori(実際にはその拡張版であるlibpafe)をAndroidやmacOS上のChromeブラウザ内で動作するように移植したものです。
これにより、libpasori(libpafe)を基盤としてFeliCaを読み書きするプログラムを簡単にChromeブラウザ上で動作させられます。
実際のソースコード互換移植例として、
- libpafeに含まれるPaSoRiテストツール(pasori_test)
- 同、FeliCaデータのダンプツール(felica_dump)
- libpafeベースのSuica履歴ダンプツールであるsuica-dump
をWeb用に変換したものを用意しました。
- Lenovo Phab 2 Pro(Android 6.0) + RC-S330でfelica_dumpサンプルを利用してEdyの公開領域を読み取ったところ
- PaSoRi RC-S380, RC-S330, RC-S320(/S310)
- S310について、実機での確認は出来ていませんが動作はするはずです
- AndroidまたはmacOS版のGoogle Chrome 63+
- Windows環境ではデバイスを認識しないようです
- 一般的なAndroid端末を利用する場合、参考写真のようにUSB-OTGケーブルでPaSoRiを接続する必要があります
- MacもしくはAndroid端末(6.0以上を推奨)を用意する
- PaSoRi RC-S380/S330/S320(/S310)を上記環境に接続する
- Chrome 63以上でデモページを開く
- ※注意: 上記デモページ群では、端末に接続されたPaSoRiやそれを経由して読み取ったFeliCaに関する情報を一切外部に送信していませんが、原理上は容易に送信可能であることを認識した上で読み取り確認をおこなってください
- 個人的に余らせていたPaSoRiを手軽な履歴取り込み手段として復活させること
- libusbを基盤とするライブラリは、libusbとUSBの仕様を一定理解していれば小規模なコード変更でWebへ移植できると示す(確認する)こと
WebUSBは、USBデバイスの新たな活用場面として大きな可能性を持つものです。 現状のChrome実装(64時点)にはWindows上でのデバイス認識や利用上の問題がある(Chromium issue #637404参照)ものの、既にmacOS(10.10+程度)とAndroid(6.0+程度)では同一のJavaScriptコードでデバイスを制御できる状態にあります。
個人的な感覚ですが、特にAndroid端末とUSB-OTGケーブルを組み合わせることで
- ターゲットデバイスの現役時代にはAndroidとの組み合わせが存在しなかったもの(過去資産活用)
- 新規デバイスドライバの開発時にWeb上での動作サポートを選択肢に入れる価値があるもの(クロスプラットフォームドライバとしての活用)
という2つのエリアで活用の可能性を感じます。
libusbを利用してクロスプラットフォームのソースコード互換を実現しているドライバの中には、Windows環境サポートのためにlibusb+WinUSBバックエンド体制を取っているものもあります(まさにChromium/Chromeがこう変わりつつあります)。 これらは、デバイス検出まわりで一定の改変が必要な可能性があるものの比較的容易にWebへと持ち出せるのではないか、と期待しています。
- Emscripten(1.37.28で確認済)
- CMake(3.5.1で確認済)
- GNU MakeやClang一式
Ubuntu16.04にbuild-essentialとclang、cmakeパッケージを入れた状態にEmscripten環境を構築したものに類似するWSL上の環境でビルド確認をおこないました。
$ git clone --recursive https://github.com/muojp/webpasori.git
$ cd webpasori
$ mkdir build
$ cd build
$ emcmake cmake ..
$ make
.
├── felica_dump.html
├── felica_dump.js
├── libpafe-emscripten
│ └── libpafe.a
├── pasori_test.html
├── pasori_test.js
├── suica_dump.html
└── suica_dump.js
submoduleをcloneしていない場合(--recursiveをつけずにcloneした場合など)にはビルドが失敗します。
$ git submodule init
$ git submodule update
を実行してください。
WebUSBはそのパワフルさと潜在的な危険性のため、利用にさまざまな制限が課せられています。 代表的なものが
- ローカルホスト以外でのHTTPS必須
- ユーザアクションをきっかけとしたデバイス接続必須
です。
LAN内の環境で実行する場合、手元環境にてHTTPS待ち受けが必要です。 このとき、443番ポートの利用は必須ではありません。 また、証明書エラーが出る状態でも強制的に続行すれば動作します。
詳しくはAccess USB Devices on the Webを参照してください。
開発が落ち着いてきたらGitHub PagesやAmazon S3、Azure Storage (BLOB)などへhtml/jsファイルをアップロードして動作確認するのが楽です。
本家libpafeでサポートされていないRC-S380への対応のためにlibpafeをforkして数点の機能追加をおこないました。 これに伴い、Git submoduleのマッピングを変更しました。
git pull
実施時にsubmodule絡みのエラーが出る場合、
$ rm -r .git/modules/libpafe-emscripten/src/libpafe
$ git submodule update -i
としてsubmoduleを取り込み直してください。 これでもうまくいかなかったり、面倒であれば全体をcloneし直しても構いません。
- なるべく外部リポジトリのコードに手を加えずにEmscriptenビルドを通したいところでしたが、libpafeの構造上本家へのパッチ無しにこれを実現するのは難しいと判断しました
- 当初はS330のみをターゲットとして移植、その後にS320も移植ターゲットとして作業を完了しました。S310については実機へアクセスする手立てがなかったため、動作を確認できていません
- S320への対応によって動作はするはずです
- その後、S380も暫定対応しました。あくまでもlibpasoriの領域に限定した移植で、S380の真価(P2PやHCEなど)は発揮できません