2013/03/18

[android]OTPがNDEFになると、NdefFormatable#format()に失敗することがある?

こんな時間まで何やってるんだか・・・。

FeliCa Liteのフォーマッタを作っていた。
しかし、それだけだと寂しいので、NDEFフォーマットするやつと、非NDEFフォーマットするやつを作った。
もちろん1次発行済みのFeliCa Liteであればできないのだが、MC[3]に書き込みができるなら元に戻せるのだ。

 

では、とMIFARE Ultralightにも対応しようと考えた。

 

まず考えたのは、かざし終わったNDEFタグを、そのまままた読み込むような動作ができるかどうかであった。
というのも、NFC-Fが非NDEFフォーマットしているとき、それをフォーマットしてNDEFタグにしたとしても、AndroidとしてはNDEFと思っていないので、せっかくのNdefクラスが使えないからだ。

これはあきらめて、NdefFormatable#format()と同じように、引数にNdefMessageを渡したら書き込むようにした。

 

あとはそこまで難しくない。
Ndefとして検出したなら、TNF_EMPTYを書き込む。
NdefFormatableとして検出したなら、TNF_EMPTYでformat()する。


じゃあせっかくなので、非NDEFにも対応しようと考えた。
対応は、MIFARE Ultralightだけ。
やることは簡単で、データ領域を0x00で埋めるだけだ。

そうすると、NDEFタグとして認識しなくなった(NXP TagInfoで確認)。

最後にNDEFフォーマットして寝るか、と思ったら・・・失敗する。
NdefFormatable#format()を呼び出すのだが、IOExceptionが発生するのだ。
これは困った。

 

まずは書き込みができなくなったのかもしれない、と思って、データ領域を0xFFで埋めた。
そしたら・・・0xFFで埋まった。
書き込みはできる。
うん、でも埋めた領域はデータ領域を超え、Lock領域にも及んでいたようだ。。。
おかげで、そのタグは後半が0xFFのまま書き込み禁止になってしまった。。。
まあ、前半は生きているからいいだろう。

私のフォーマット方法が悪いのかと思い、NXP TagWriterを使ってみた。
同じく失敗。
Tag Lostになる。

腹が立ったので、他の生きているデータ領域の5byteをまねして書き込んだ。
そうすると、format()できるようになった。


推測だが、OTP領域(NFC ForumのT2T資料でいうCC)にNDEFのマジックナンバーを書き込むと、Android側が「これはNDEFタグだから、データ領域の先頭はこれこれこうなっていないといけない」と判断してしまっているのだろう。
Nexus7(4.2.2)の動作なので、libnfc-nxpだろうか。
Broadcomのチップを使っている端末で起きないなら、libnfc-nxpかな。そうでなければOS部分か。

まあ、NdefFormatableの定義もちょっと曖昧な気がするので、バグと呼ぶのは悪い気がするな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。