FeliCa Liteデバイスを買ってみた その2.5
>>しかし、肝心のデータ書き込み (Write Without Encryption)が上手くいかない。 NDEFとして扱うなら上手くいくのかなぁ。
コメント頂いたmokemokechickenさんのコードを見て、自分が何を間違っていたかすぐに分かった。
FeliCaはデータアクセスする際にシステムコードとサービスコードの指定が必要だ。システムコードはカードのフォーマットで決まるが、サービスコードは任意に振る番号とアクセス属性で決まる。 アクセスコードは以下で示されるように下位6bit(LittleEndian)でそのデータのアクセス方法と権限が決まる。
-- ユーザが任意に割り振った番号 -- | |||||||||
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からダウンロードできる