2012/03/11

android-x86でパソリにNFC-Fをかざしてインテントを受け取る

続きだ。

ポーリングまではNfcService内で収まっているので、そんなに難しくなかった。
ここからインテントを飛ばすようにするのが、大変だった。

DeviceHostをimplementsしたNativeNfcManagerクラスを作ったのだが、それだけでは足りない。
タグのために、DeviceHost.TagEndpointをimplementsしたNativeNfcTagクラスを作らねばならなかった。
NativeNfcManagerがデバイスの操作、NativeNfcTagがカードの扱いをしているようだ。

困ったことに、このあたりはソースにコメントがないので、どのデータがどうあるべきなのかがわからんかった。
本物の方は、NfcServiceのJava、libnfc-jniのJNI、libnfc-nxpのC/C++と、あれこれ入り組んでいるし、コールバックでやりとりしていてソースを追っても理解するのが難しそうだった。

なので、今回はNFC-Fに限定し、IDmとシステムコードだけをインテントで返すことに専念した。
PMmは・・・私のライブラリでは捨てているので、なしだ。
IDmは、getUid()で値を返せば、NfcServiceがうまくやってくれる。
PMmとシステムコードは、getTechExtras()でExtrasに入れていた。
前半の0~7バイト目にPMmを、8, 9バイト目にシステムコードを入れているようだ。

 

このあたりのデータの詰め方を把握しないと、移植はできんと思う。


ここまでやって、パソリにNFC-Fのカードをかざすと、TAG_DISCOVEREDに対応したアプリでDmとPMm、システムコードを表示させることができた。
ポーリング周期は1秒。
NFC-Fしか対応しないようにしている。Type 3 Tag前提じゃないので、FeliCa LiteやFeliCa Standardなどでも反応する。
反応はするけど、タグを読んだりする部分はやってない。

図にするほどでもないが、こんな構成だ。

image

 

疲れたー。
VirtualBox用のISOはあるけど、300MBくらいあるので公開できず。。。

かなりがんばれば、android-x86でNFCアプリ開発ができるところまでできなくもなさそうな気がする。
(すごい弱気・・・)

しくみをよくわかってないので、何もかもが手探りってのがよくないですな。
あと、Javaもよくわかってない。

0 件のコメント:

コメントを投稿

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