ちょっと調べてみたら、PASMO/Suicaの残額表示はとっても簡単なことがわかったので、実験してみました。出だしは良かったのですが、その後でしばらく悩むことに。。
PASMO/Suicaでは、利用履歴サービスという情報を参照すれば20件までの履歴情報がわかるというファイル構造になっています。それぞれの履歴レコードの11バイト目と12バイト目がその時点での残額を示しているので、最新の履歴1件の11,12バイト目の部分さえ見れば。現在の残高が調べられるというとってもわかりやすい作りになっているのでした。つまりは、何も考えないで、ファイルの特定の箇所さえ読めばいいようなものです。
実際にどのようなコマンドをカードに送ればいいのかについては、資料を見ればすぐにわかるのですが、このブログ記事には Arduinoのコードも出ており、わかりやすいです。この例では、Request Serviceを発行してサービスの確認をおこなっていますが、対象がPASMOだとわかっていればこれを省略してしまうこともできます。結論として、POLLINGでカード検出ができたなら、そのカードに対して適切な Read Without Encryptionコマンドを送ってやると、その応答として最新の利用履歴を示す16バイトのブロック・データが返ってきますので、その内容を解析すればいいだけです。実際に試して見た結果がこちら。
16進ダンプだけではわかりにくいので、履歴を簡単にデコードした結果も付け加えてあります。この例では2枚のカードの読み取り結果をしてしています。それぞれ、16進ダンプ表示の最初の行がPollingコマンドの応答内容、2番目の行がRead without Encryptionコマンドの応答内容を示しています。Read応答の最後の16バイトが実際に読み取った部分で、それぞれ40 01と62 0aの部分が(little endianなので)320円と2658円に相当します。
この例では2枚とも正しく読み取れていますが、当初は1枚のカードはちゃんと読めるものの、もう片方のカードはPollingには応答するものの、Read withtout Encryptionコマンドに応答しませんしませんでした。発行しているFelicaコマンドが間違っているわけではないので、動作しない原因は、2枚のカードの違いに起因するものであることは確実です。そこで、Nexus 7の助けを借りて Tag Ingoアプリを動かして調べてみると、残高照会ができるカード(A)とできないカード(B)には、こんな違いが。。。
そこでISO Control Registerを 0x1aに設定してFeliCa 212kbpsを選択した後のレジスタを確認してみると、いくつか気になるところがあったので、次のように変更してみました。
PASMO/Suicaでは、利用履歴サービスという情報を参照すれば20件までの履歴情報がわかるというファイル構造になっています。それぞれの履歴レコードの11バイト目と12バイト目がその時点での残額を示しているので、最新の履歴1件の11,12バイト目の部分さえ見れば。現在の残高が調べられるというとってもわかりやすい作りになっているのでした。つまりは、何も考えないで、ファイルの特定の箇所さえ読めばいいようなものです。
実際にどのようなコマンドをカードに送ればいいのかについては、資料を見ればすぐにわかるのですが、このブログ記事には Arduinoのコードも出ており、わかりやすいです。この例では、Request Serviceを発行してサービスの確認をおこなっていますが、対象がPASMOだとわかっていればこれを省略してしまうこともできます。結論として、POLLINGでカード検出ができたなら、そのカードに対して適切な Read Without Encryptionコマンドを送ってやると、その応答として最新の利用履歴を示す16バイトのブロック・データが返ってきますので、その内容を解析すればいいだけです。実際に試して見た結果がこちら。
16進ダンプだけではわかりにくいので、履歴を簡単にデコードした結果も付け加えてあります。この例では2枚のカードの読み取り結果をしてしています。それぞれ、16進ダンプ表示の最初の行がPollingコマンドの応答内容、2番目の行がRead without Encryptionコマンドの応答内容を示しています。Read応答の最後の16バイトが実際に読み取った部分で、それぞれ40 01と62 0aの部分が(little endianなので)320円と2658円に相当します。
この例では2枚とも正しく読み取れていますが、当初は1枚のカードはちゃんと読めるものの、もう片方のカードはPollingには応答するものの、Read withtout Encryptionコマンドに応答しませんしませんでした。発行しているFelicaコマンドが間違っているわけではないので、動作しない原因は、2枚のカードの違いに起因するものであることは確実です。そこで、Nexus 7の助けを借りて Tag Ingoアプリを動かして調べてみると、残高照会ができるカード(A)とできないカード(B)には、こんな違いが。。。
- ROM種別とIC種別が異なる。カードAは自販機で買ったカードなんですが、カードBはオートチャージ対応のカード。
- カードAはデータ転送速度として212kbpsと424kbpsをサポート。カードBは212kbpsのみの対応。
そこでISO Control Registerを 0x1aに設定してFeliCa 212kbpsを選択した後のレジスタを確認してみると、いくつか気になるところがあったので、次のように変更してみました。
- RX Wait Time Registerが0xfaとなっており、時間長過ぎ。1に修正。
- Modulator and SYS_CLK Control Registerが0x24となっており、ASK 13%が選択されていた。ASK 10%に対応する0x20に修正。