技術記事
ブラウザからチップカードリーダーを操作しよう!
以前の 投稿では、 NodeJS(人気のJavaScriptランタイムエンジン)を用いてUSB接続を確立する方法をご紹介しました。その後の 続編投稿では、NodeJSと任意のブラウザ(Websocketsに対応していない古いブラウザも含む)の間でWebsocketsを使ってプロセス間通信を行う方法を確認しました。
USB接続のコードとWebsocketsのコードを組み合わせれば、JavaScriptだけでWebページからUSBデバイス(右に示した当社のVP3300 3-way カードリーダーなど)を操作することが可能になります。本日はそのコードをご紹介します。
以前の投稿でスクリプトをまだダウンロードされていない方もご安心ください。以下のスクリプト(約360行のJavaScript)には必要なものがすべて含まれています(Node本体を除く)。コードの説明は後ほど行いますが、まずは使い方からご紹介しましょう。
1. ID TECH ナレッジベースにアクセスし、 node-driver.zip アーカイブをダウンロードします。(ログイン不要)注意:Node.exeを含むため、サイズが大きく(11メガバイト)、ダウンロードには数秒かかります。また、Windowsマシン専用です。アーカイブはローカルマシンの任意の場所に保存してください。
2. アーカイブを展開します。必要なスクリプトはすべて含まれています。(以下のコードをコピー&ペーストする必要はありません!)
3. 展開されたアーカイブの中から、 start.batというファイルを探して実行します。(コンソールウィンドウが開きますが、そのまま開いたままにしておきます。)これでNodeドライバーが起動します。
4. 対応デバイス(ID TECH BTPay Mini、VP3300、UniPay III、VP8800)をマシンのUSBポートに接続します。Nodeドライバーが自動的に接続します。
5. アーカイブ内の client.html ファイルをWebブラウザで開きます。Connectボタンをクリックすると、ポート9901でWebsocket接続が確立されたことを示すメッセージが表示されるはずです。ドライバーはこの接続を介してUSBデバイスと通信します。
下に示している約360行のJavaScriptが見えますか?全体をテキストファイルにコピー&ペーストし、例えば driver.js として保存してください。
NodeJSをまだインストールしていない場合は、お使いのマシンにインストールしてください。ただし、Nodeでdriver.jsを実行する前に、以下を行ってください。
以下のNodeモジュール(Githubなどで入手可能)を npm を使ってインストールします:
1. node-hid(USB接続用)
2. socket.io(Websockets接続用)
3. socket.io-client(NodeスクリプトをSocket.IOクライアントとして動作させるため)
次に、Nodeで driver.js (下に示しているコード)を実行します。ブラウザからドライバーに接続するには、次の内容を含むHTMLページを作成してください:
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.slim.js"></script>
さらに:
socket.io の Websockets 実装を使用するには、socket.io.slim.js スクリプトをインポートする必要があります。Websocket メッセージを送信するには、socket 変数(上記のvar socket)を使用します。
ブラウザでWebsocketを介してUSB接続を実現するために、Nodeで実行する必要のあるコードは以下のとおりです。
このコードの前半部分には、USBProviderクラスの定義(Nodeがサポートする ECMA 6 表記を使用)が含まれています。これについては、 以前の投稿で説明しました。コードの中間部分にはSocketProviderクラスの定義があり、これによりWebsocketsサーバーを作成できます。コードの後半部分は、前述の2つを結びつける「シムコード」です。USBProviderインスタンスとSocketProviderインスタンスを作成し、起動して、それぞれと通信することで、シンプルなJSONデータオブジェクト構造を使用して、ブラウザからUSBデバイスへコマンドを送信できるようになります。
リーダーに生のデバイスコマンドを送信するには、次のようにします。
var cmd = "5669564f74656368320060040000f5e1";
dobj = dataObject( 'client',cmd,'raw command');
socket.emit( 'echo', dobj ); // デバイスへコマンドを送信
本製品は cmd 上記の文字列は、ID TECH の UniPay III、BTPay Mini、または VP3300 デバイス向けの「Get Terminal Settings」コマンドの生の16進バイトを表しています。
先に紹介した client.html アーカイブに付属する node-driver.zip ファイルには、上記コマンドを接続されたデバイスに送信するgetTerminalSettings()というメソッドをすでに含めてあります。client.htmlコンソールでこのコマンドを実行すると、以下に示すように、デバイス設定の詳細なリストが得られます。
このスクリーンショットは、ID TECH BTPay Mini(VP3300)製品の Terminal Settings のデフォルト値の一部を示しています。(注:スクロール可能領域全体をキャプチャしていないため、すべての設定が表示されているわけではありません。)
今回の投稿と、USB接続に関する前2回の投稿の重要なポイントをざっと振り返ってみましょう。これまで見てきたように、以下のことが言えます。
1. NodeJS(人気のあるオープンソースのJavaScriptランタイムエンジン)の助けを借りれば、JavaScriptを使ってあらゆるUSBデバイスと簡単に通信できます。これだけでも驚くべきことです!
2. Nodeを使えば、わずか75行のコードでWebsocketサーバーを作成でき、Nodeをサポートする任意のデバイス上で、高速・容易・堅牢かつセキュアなプロセス間通信を実現できます。
3. NodeスクリプトはUSBデータを(Websocket経由で)Websocketに対応した任意のブラウザ、つまり最新のあらゆるブラウザへ簡単に渡すことができます。
4. その結果、Webブラウザで動作するJavaScriptを使って、ラップトップ、PC、タブレット、その他のホストに接続されたUSBデバイス(カードリーダーなど)を制御することが容易に可能になります。これはつまり、JavaScript以外のコードを書くことなく、ID TECH の任意のカードリーダーと通信できる、強力なブラウザベースの決済アプリを作成できるということです。 CやC++でネイティブコードを書く必要はありません。したがって、ほとんどあらゆる決済アプリを、わずかなコーディング労力で非常に迅速にプロトタイプ化することができます。
今後の投稿では、Web技術を活用してID TECHのリーダーを利用した決済アプリを作成する方法について、さらに詳しくご紹介します。ぜひまたお越しください!
ところで、ID TECH の製品について詳しく知りたい方は、フリーダイヤルまでお電話ください。
