さて、android-x86にポーリングするしくみを作ろう。
自分のメモ代わりに書いているので、断片的になってしまうが許しておくれ。
ポーリング周期は、こちらを見る限りでは400ms周期。
http://bs-power-save-project.blogspot.com/2011/11/nfconoff.html
ソースを400とかでgrepしたが、出てこず・・・。
discoverに関する設定を見ると、Durationという変数があった。
コメントを読む限りでは、PN544が48ms単位で自動的に回してくれるような気がする。
深く追うのはやめて、適当にAndroid側で周期的なポーリングを行うことにしよう。
Androidは詳しくないのだが、AsyncTaskとかHandlerとか、そんなのを使うみたいだ。
UIは絡まないので、Handlerでいいんじゃないかな?
判断基準がまだわかってない。
そもそも、ポーリングだけすればいいと言うものではない。
ポーリングして、カードがなければすぐに寝ないと。
そしてカードがあったら、通知しないと。
どうやって通知するんだろう?
Interface誌2012/4月号を読むと、
- ACTION_NDEF_DISCOVERED・・・NDEFが見つかった
- ACTION_TECH_DISCOVERED・・・NDEF以外で指定したtechnologyが見つかった
- ACTION_TAG_DISCOVERED・・・どれかのtechnologyが見つかった
ということでいいのかな?
NDEFが一番条件が厳しく、その次がTECH、なんでもありがTAGというところか。
if(NDEF) - else if(TECH) - elseというイメージでいよう。
最終的なインテントを投げるのは、NfcDispatcher.javaみたいだ。
dispatchTagInternal()が投げている。
たどっていくと、NfcServiceHandlerが元になるようだ。
mNfcDispatcher.dispatchTag()がNfcDispatcherの入り口。
NfcServiceHandlerがメッセージを受け取り、
- MSG_MOCK_NDEF:NdefMessageを作ってdispatchTag()を呼ぶ
- MSG_NDEF_TAG:NDEFがあるならそれを、なければnullでdispatchTag()を呼ぶ
とするみたい。
そして、MSG_MOCK_NDEFだのMSG_NDEF_TAGだのは、DeviceHostListenerをimplementsしているNfcServiceがonRemoteEndpointDiscovered()みたいな関数で持っている。
自分で用意するNativeNfcManagerのコンストラクタでNfcServiceはもらうことができるので、検出したらonRemoteEndpointDiscovered()とかを呼んでやればいい。
だと思う。
このあたりをごそごそといじると・・・
定期的にポーリングするようになった。
カードをかざすと、NfcServiceが落ちるようなので、とりあえず何か動いていそうなことはわかった。
いいんだか悪いんだか・・・。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。