FeliCa Liteデバイスを買ってみた その2.5

>>しかし、肝心のデータ書き込み (Write Without Encryption)が上手くいかない。 NDEFとして扱うなら上手くいくのかなぁ。
コメント頂いたmokemokechickenさんのコードを見て、自分が何を間違っていたかすぐに分かった。

FeliCaはデータアクセスする際にシステムコードとサービスコードの指定が必要だ。システムコードはカードのフォーマットで決まるが、サービスコードは任意に振る番号とアクセス属性で決まる。 アクセスコードは以下で示されるように下位6bit(LittleEndian)でそのデータのアクセス方法と権限が決まる。

FeliCaユーザマニュアルより「サービスコード」

-- ユーザが任意に割り振った番号 --
b7 b6 b5 b4 b3 b2 b1 b0 b7 b6
-- アクセス属性 --
b5 b4 b3 b2 b1 b0

アクセス属性の例)

001000b : ランダムサービス (リード/ライトアクセス:認証必要)
001001b : ランダムサービス (リード/ライトアクセス:認証不要)
001010b : ランダムサービス (リードオンリーアクセス:認証必要)
001010b : ランダムサービス (リードオンリーアクセス:認証不要)
:

FeliCa Liteデバイス側にデータを書きこむためには"リード/ライトアクセス"で認証不要、つまり 001001b = 09h が指定されてさえいれば番号は任意で良いと考えていたのである。実際にはそうではなくて、きちんと使えるサービスコードが決まっておりそれを見付け出して使う必要がある訳だ。

これから修正しようと思うが、通信系のソフトウェアというのはこういうちょっとしたことに長時間ハマることが多々ある。いつか答えが出るまで悩んでいることも大切だが、今回のように成功した方の教えを乞うのはもっと大切なのだ。

コードを公開していなければこうはいかなかったと思う。

http://www.sony.co.jp/Products/felica/business/tech-support/index.html?j-short=tech-supportからダウンロードできる

FeliCa Liteデバイスを買ってみた

NFC/FeliCaの検証用に欲しいと思っていたので、購入してみた。

いわゆる"フォーマット済カード"であり、FeliCa IDmが既に書きこまれているので、すぐにFeliCa PICCとして使用できる。左からカードタイプ、シール(ラベルタイプ)で、両方ともスイッチサイエンスさんから一枚単位(@¥350)で購入できる。

FeliCa Liteカード RC-S886
FeliCa Liteシール RC-S701

これと拙作のnfc-felicaを使っていろいろ試してみようと思う。※


※既にIDmはダンプしてみた。当たり前だが個別のIDmを取得できる。

nfc-felica-lib ライブラリィプロジェクト追加

nfc-felica - Project Hosting on Google Code

本プロジェクトのコードを"Androidライブラリィ"として使用するためのプロジェクト"nfc-felica-lib"がリポジトリに追加されました。

以下のURLからSVNリポジトリにアクセスできます
svn/nfc-felica/trunk/nfc-felica-lib

今回、本プロジェクトのコミッタとしてYAMAZAKI Makoto氏に参加頂きました。
"nfc-felica-lib"はYAMAZAKI Makoto氏の作です。 ありがとうございました。

githubにリポジトリを作成しました

CalendarViewとnfc-felicaは手慣れた環境であるGoogle Codeに、これまた使い慣れたSVNリポジトリを作成したのだが、「外部からの修正を期待するような場合はgitのほうがよいよ」というアドバイスを頂いたので、まずは慣れるために作ってみることにした。

Kazzz/CalendarView - GitHub
Kazzz/nfc-felica - GitHub

少しの間両方で運用してみて、使えそうだったらgithub側に全面的に移行しようと考えている。

nfc-FeliCa rev5

今回のバージョンよりSuica/Pasmoのデータとサイバネ駅データベースにより、使用履歴を日本語でフォーマットできるようになりました。
nfc-felica - Project Hosting on Google Code

以下更新しました。

    • Suica/PasmoのデータをフォーマットするSuicaクラスを追加
    • Suica/Pasmoにおけるサイバネ駅コードデータベース(StationCode.db)とそのユーティリティクラスDBUtilを追加
    • ユーティリティをUtilクラスに集約
    • NFCTagSampleアクティビティを廃止
    • その他細かい修正

Suica/Pasmoのデータフォーマット解析に関しては以下のサイトを全面的に参考にさせて頂きました
suica - FeliCa Library Wiki - SourceForge.JP

なお、今バージョンより公開する成果物にひとつ制限が付きます。

全てのソースコードは記載通りApache 2.0ライセンスの元に再利用可能ですが、Suicaクラスからアクセスしているサイバネ駅コードデータベース(StationCode.db)の原データに関しては有志の皆様の無償協力のもとで作成されたものであり、対価の発生する配布、商用での利用は作成元のご意向で許可されておりません。(個人利用、無償で利用する分に関してはなんら制限はありません)
仮に本プロジェクトのコードを商用で利用する場合、データベースのデータを分離して再利用して頂くことになりますのでご注意ください。

サイバネ駅コードデータベース(StationCode.db)は以下のサイトで公開されているExcelデータをインポートして作成しました。
IC SFCard Fan

謹んで御礼申し上げます。

※「FeliCa」は、ソニー株式会社が開発した非接触ICカードの技術方式です。
※「FeliCa」は、ソニー株式会社の登録商標です。

nfc-felica アップデート

nfc-felica/android 2.3 nfc access felica command
抽象化をひとつ上げたFeliCa.javaを用いて、巷で使用されている他の言語のライブラリィのような簡易な呼び出しが可能になります。

具体的には以下のようなコードでFeliCa側のデータ(認証不要、非暗号化)を読み込みます。

  • NFCFeliCaReader.javaより
this.nfcTag = intent.getParcelableExtra("android.nfc.extra.TAG");

// nfcTagだけは外から貰わないと動かない
FeliCa f = new FeliCa(this.nfcTag);

//polling は IDm、PMmを取得するのに必要
f.polling(FeliCa.SYSTEMCODE_PASMO);

//read実行
byte[] result = f.readWithoutEncryption(FeliCa.SERVICE_SUICA_HISTORY, (byte)0);

FeliCa#readWithoutEncryptionの戻り値は読み込んだブロックデータだけとなります。(16byte)

今後は結果をSuicaの使用履歴にラップすることを考えています。