blog画像が表示されないページは、元画像を間違えて削除してしまっているためです。データが残っていないので、想像力で補ってください。(1)今週は、毎日定時で仕事が終わりそうな予感がする。いうときに、勉強をしておかねば。そんなわけで、Nexus7の改造をすることにした。改造、といっても分解するわけではなく、ソフトウェアの改造に留まる。目的がないと勉強してもつまらない。「かざしている間だけNFCが動作する」にしよう。前に、「かざす」という動作をどうやって端末で実現させるか検討したが、一番楽なのはハードウェアキーを押している間だけにする、というものだった。かざす、というには弱いが、人間の意思をどこかに入れたいので、それをハードウェアキーに託したというところだ。Nexus7には、ハードウェアキーが3つしかない。電源ボタン音量アップボタン音量ダウンボタンホームボタンなどはソフトウェアキーなので、対象外だ。この3つのうち、自由に使えそうなのは音量ボタンだと思う。音量ボタンを押している間だけ、NFCの動作ができるようにする音量も変更させたいだろうから、どうにかして動的な切替ができるようにせんといかん。そこは・・・あとで考えよう。Froyo時代に調べた資料があったのだが、さすがにパスなどが変更されている。仕方なく、今の動きから調べることにした。入力イベントをさばいているのが、frameworks\base\services\input\EventHub.cppのようだった。ここのEventHub::getEvents()だ。gdbclientを使ってブレークポイントを設定すると、何度も止まった。()さかのぼってみたが、どうもスレッドでぐるぐる回っているところらしく、イベントの発生地点はこれからではわからなさそうだった。電源ボタンを押したときの処理は、policyのPhoneWindowManager.javaだったよなぁ、と思って音量ボタン押しにブレークポイントを設定してみたが、止まらず。これは、アタッチしたプロセスが悪いのかもしれない。その部分をまるまるコメントアウトしても音量ボタンの操作ができたので、ここではないみたい。面倒になったので「KEYCODE_VOLUME_UP」でjgrepすると、media/java/android/media/AudioManager.javaが出てきた。handleKeyDown()やhandleKeyUp()があるので、処理をコメントアウトすると音量ボタンを操作しても何も起こらなくなった。今日の調査は、ここまで。手を加えるなら、AudioManager.javaではなく、これを呼び出した上位層にしたいものだ。電源ボタン+音量ダウンボタン同時押しでスクリーンショット撮影とか、ああいうのと同じ階層にできるのが望ましいところだ。Informationブロックに可変情報が含まれているんだろう「なぜ」で始めると、その説明をするように見えるかもしれないが、そうではない。純粋な疑問として書いているのだ。TagのNDEFについてだ。Informationということでいくつか情報を書くのだけど、そこにNDEFメッセージのバイト数を書き込むことになっている(書き込み中フラグもあるけど・・・まあそれは置いておこう)。Tagには、そういう可変情報はあまりない。CC0にマジックナンバーを書き込むことで、NDEFのデータを含んだタグ、という意味になる。CC0はCCブロックにあり、他にCC1~3もあるのだが、ここに書き込む値も固定値でよい。CCブロックに固定値を書き込んでブロックを書き込み禁止にすると、このタグはNDEF用にしてしまえるのだ。Informationにあり(といってもマジックナンバーなどはないが)、書き込むたびに更新せんといかんので、めんどくさい。Tagも使いやすくなるんじゃなかろうか。Classicもアクセス方法は十分面倒だと思うが、かなり普及している。Lite-Sがスイッチサイエンスさんから販売されないかな-、と期待している私であった。ほら、Lite-Sの方が安価にできるという話だし。ないとしても相互認証ができるんだから試したくなるではないか(片側認証とは違うアルゴリズムっぽいが)。Proximity)により、Windows8ではNFCをOSレベルで扱うことができるようになった。取得したデータの解析はあまり楽にできないようだ。それじゃつらかろう、と思ったかどうか知らないが、NDEFライブラリがCodePlexにある。(NFC)まだ読む方しか試していないが、自分でbyte[]を解析しなくてよいので、楽そうだ。siteにも追加した。ソースも置きたいところだが、なんか出来が悪すぎて置いてない。ストアアプリ自体をわかってないので、画面も真っ黒だし、ダイアログを出そうとするとコンテキストがよくないのか例外が発生するしで、さんざんなのだ。Windows8はインストールされているものの、ストアアプリを全然使っていないので、あんまりやる気が出ないのだな。デスクトップアプリからだと、NFPは使えなさそうだし。いや、普段はWindowsを使うことが多いので、Windowsで動くNFCアプリを作ることができた方がよいことはよいのだ。NFPはWindows8以降でしか動かなさそうNFPはストアアプリでしか動かなさそうWindows7以前では、共通のAPIがなさそう(PC/SC?)と思っているからなのだが、実際はどうなんだろう?Windows8以降しか動かん、というのは仕方ないとしても、ストアアプリでもデスクトップアプリでも動いてくれるようにならんかなぁ。(2)意外なことに、AARの続きだ。packages/apps/Nfc/src/com/android/nfc/NfcDispatcher.javaのtryNdef()。ここでAARの処理を行っている。NDEFメッセージの先頭から順にActivityを起動していく。起動できるものがあれば、そこでおしまい起動できるActivityがなかった場合、NDEFメッセージの先頭に入っている要素を取ってきて、PackageManager.getLaunchIntentForPackage()でIntentを取得して、それを起動させようとする。起動できたら、そこでおしまい。"market://details?id=パッケージ名"のインテントをIntent.ACTION_VIEWで作って、起動させようとする。起動できたら、そこでおしまい。NfcRootActivityを起動こんな感じみたいだ。複数のAARを含んだNDEFメッセージの場合には、注意が必要だ。どれか1つでもアクティビティ起動できたら、そこでマーケットまで行かずに終わってしまうからだ。いう用途があるかわからないけど、そういう動きになるようだ。ここからは私がよく知らないところだ。インテントだから、指定できるものはなんでもいいんじゃないのか?と思ったのだ。Intent.setPackage(String)だから、やっぱりパッケージ名しかだめなのか。PackageManager.queryIntentActivitiesAsUser(intent)でアクティビティが見つかるならばいいようだ。試してみねばならぬのぅ。nfc2013/05/22名刺とNFC私は、個人用の名刺を持っていない。持っていたからといって渡す相手もいないのだが、名前を覚えるのが苦手な私としては、「せめて、せめてお名前だけでも・・・」という気持ちだ(そして、名前しか残らなかったりする)。このサイトの特徴からすると、名刺にはNFCタグが貼られている方がよいだろう。次の画像を見ていただきたい。これはサイズが128x128なのだが、これでもJPEGで11.3KBある。大きいので、2値化してみる。これで3.3KBくらいだ。Bitmapの方が軽いかも、と思ったが、そうでもなかった。ある程度のサイズからはBitmapの方が有利になるかもしれんが、このサイズでは無理そうだ。JPEG2000のコーデックを今もってないので試せないが、IC運転免許証でも使われているくらいなので、このサイズでもいい圧縮率かもしれん。画像をこの半分くらいにしても、4KBあれば格納できそうだ。64x64くらいのサイズでも、その人の面影はわかるんじゃなかろうか。いうわけで、4KBくらいのNFCタグがあるとよいだろう。4Kしかないかな、と。Forumの対象外だがね。名刺用のNDEF、というものは、今のところないだろう。NDEFもどこまで効力があるかわからんな。デファクトスタンダードを作り上げるというのが、業界としては面白いところなのかもね。nfc2013/05/21[android]AAR「AARとかどうですか?」というコメントをいただいた(ここじゃないどこかで)。うーむ、Androidのみか・・・。いえ、現在の人口に膾炙された開発環境の中で一番自由にNFCを扱うことができるのはAndroidだと思っている。Shield、なんてのもあるのだろうが、OSというかプラットフォームがサポートしている方が「標準」って感じがする。そんなわけで、AARを知っておいても問題はなかろう、と勝手に判断し、調べることにした。Record、の略で、特にNFCとかいう言葉はついていない。私の知らないところでNFC以外のAARがあるかもしれないし、将来的に取ってあるのかもしれない。AARはNFCのもの、という前提で話を進めよう。Recordのことかもしれない。AARを作るためのAPIはandroid.nfc.NdefRecordが持っているからだ。Developersによると「AARは、NFCタグを読んだときにアプリを起動させるしくみ」らしい。いうことは、普通のアプリはAARのNDEFを読むことができないんじゃなかろうか?追ってみよう。タグの処理は、external/libnfc-xxxでやっているはず。追うのが面倒なので省略すると、次はpackages/apps/NfcにあるNfcDispatcher.javaだ。dispatchTag()は、たぶんlibnfcからjavaに処理が渡される最初の方だったと思う。内容を読まずに判断するなら、こういう順で判定しているようだ。オーバーライドできるか(知らん。HandoverかどうかNDEFかどうかふさわしいTechnologyかどうかアクティビティを開始できるかマッチしなかったAARかどうかは、3番で判定している。type(0x04)か?TYPEは"android.com:pkg"か?を見て、両方trueだったらペイロードをUS_ASCIIでデコードしてパッケージ名としてリストに詰める。詰められたパッケージ名は、先頭から順にdispatch.intent.setPackage(パッケージ名)とされる。Messageじゃないなら、AARは先頭に置いたらいかんよ」といっているのは、こういうわけだ。先頭がAARだったら、後のレコードがどうなっていてもAARとして扱ってしまうからだろう。AARの実装を斜め読みしたが、なんとなくわかっていただけただろうか?私の期待としては「AARにはアプリ起動以外になにかできることが隠されているのでは・・・」なのだが、ぱっと見たところそういうのはなさそうだった。なにか面白い使い道があるかもしれんので、もう一度どこかで見直すことにしよう。あ、最初に書いた「普通のアプリはAARのNDEFを読むことができないんじゃなかろうか?」は、インテントフィルタなどを書けばできる、みたいなことを書いてあった。いうのは興味がないので、いいや。TEXTを読み返すなんだかんだで、2ヶ月くらいNFCやってない。このままフェードアウトしそうな気がしてならないが、まあそれはそれで悪くはない。5月号slideshareは縦長の資料には向かないなぁ。月刊NDEFは印刷をメインに考えたものだから、A4縦になってしまったのだ。そんなことよりも、内容の薄さの方が気になって仕方がない。気が抜けてきたのかなぁ。nfc2013/05/12「かざしてない」問題NFCを搭載した端末に対して不満に思うことがある。それは「かざしてないのに反応する」というところだ。かざしてない、というのは変かもしれない。「かざす」という意思がないのに、端末が「かざした」と判断して動作してしまう、ということだ。今のところ「かざす」のところに、人間の行動の意思が入っていないので、こうなってしまうのだろう。Android端末だと、ロック状態になればNFC動作は止まるものの、それまでは動いている。何気なく机の上に置いたりすると、そこにちょうどNFCタグがあって反応することがある。これがどうしてもいやでねぇ。かざす、というのは非常に簡単な動作のため、端末自身では判別することが難しいと思う。NFCだけでなく、別のセンサを使って解決するしかないのではなかろうか。「かざす=スイッチが押されている」ということだ。端末の左右にボタンを付けて、それを挟むようにしてかざす、というイメージだ。これは左右じゃなくてもいいけど、押したままかざすのだ。熱センサとかもありかも。特定の位置に指を当てて熱を与えているときだけ搬送波が出るとか。「かざす=特定の位置に熱を与えている」ということだ。これは手が冷たかったら使えないから、無理か。指紋センサみたいなものならよいか。あれも、指をなぞらせるタイプじゃなくて、置くだけでよいならいいのかも。「かざす=特定の位置に指を当てている」か。いう部品もあるのかな?ちょっと割り切りが必要だが、加速度センサでもいいかもしれない。左右に振っているときだけ搬送波が出るのだ。「かざす=端末を振っている」だが、これはカバンの中とかでも反応してしまうかもしれないし、そもそも別の機能が加速度センサを使うかもしれない。これを解決しないことには、NFCが「かざして使う」ということにはならんのじゃないか、と心配している。nfc[android]AOSPのアプリをEclipseでデバッグできる昨日あきらめたAOSP(って呼び名かどうかも自信がなくなってきた。素のmasterね)のJavaアプリデバッグ。調べるといろいろ出てきた。開発Tips」たぶん、ポイントはこんなところか。locationをはずして、AOSPの頭にした)。EclipseのDDMSを開いて、Deviceからデバッグしたいプロセスを選択しておく。そこにポート番号が書いてあるので、覚えておく(2つ書いてあって、たぶんもう片方は8700だと思う)。Application」をつくり、作ったプロジェクトを選択し、Portに8700を設定する。デバッグを実行すると、警告とか出てくるが、気にせず進める。ソースを開き、ブレークポイントなどを設定する。Android側アプリを操作すると、たぶん停止してくれる。Projectを作るのに時間がかかる。エラーが大量に出るのだが、気にしなくていいようだ。AOSPのソース全部をプロジェクトに置かなくてもできるのでは・・・とやってみたが、だめだった。ブレークポイントに止まらなかった。全部置けばいいやん、と思うかもしれんが、時間がかかるのよ。それに、Windowsからでもできるらしいのだが、そうそうソースファイル全部なんて取って来れないしね。できることがわかっただけでも、よしとしよう。Eclipseの自動ビルドは、はずしておいたほうがよいよ。ビルドしたいわけじゃないのでね。android[android]AOSPのアプリをEclipseではデバッグできないのか?どうでもいい話を先にするが、前のサイトと移転してきたこのサイトは、どちらも「技術ブログ」を目標に書いてきた。私はだいたい、役に立つとか立たないとか、そういうのはあまり気にせず、調べたことや思ったことを各人間のようである。今はNFCのことが多くなっているが、あまりそこにはこだわっていない。AdSenseをやってみるといいのでは!と思ったのだが、審査でNGになってしまった。理由はわからんのだが、私は「内容がいろいろあって絞ってないからでは?」と思っている。NFC以外の記事を削除しようかと考えたこともあるが、それも私らしくないのでこのままにしている。前口上はこのくらいにして、記事を書こう。syncしてきたmasterのソフト一式を焼けるようになった。flashallする、というところだ。full_grouper-eng、とすることで、デフォルトがroot状態になるのもありがたい。remount、で済むから。)さて、では/system/app/にあるアプリをデバッグすることはできるのだろうか?ローカルアプリなら、Eclipseであーだこーだすればできるのだが、/system/appとなると敷居が高そうだ。プロセスとして動くものなら、gdbでアタッチすると行けそうな感じはしている(『組込みプレス』No16を読んで)。Javaアプリはどうだろうねぇ。検索したが、本家に書いてあった。checking」と書いてあるから、エラーチェックだけには使えるよ、ということだろう。うーん、目標達成できずか。printfデバッグ(Log.dデバッグか)は、けっこうめんどくさいんだよな・・・。ビルドするための情報はすべてこちらにあるのに、デバッグがまったくできないなんてことはあるのだろうか?と。JavaもAndroidもLinuxもよくわかってはいないのだが、Eclipseでアプリビルドするのと、mmでビルドするのとでそこまで大きく違った生成物ができるわけでもないだろう。条件さえ整えば、いけるんじゃなかろうか?というわけで、情報があれば教えてください・・・。Liteの見分け方むりやり、ネタを作った感じで申し訳ない。Liteというものがある。Standardに類するものを持っている人が多数だと思う。nimocaしかり、Suicaしかり。Liteの方が使いよい。NDEF対応するのが簡単だからだ。それに、入手しやすいし。Liteがたくさん集まっている可能性が高い。Liteだっけ、Standardだっけ?」となるかもしれない。ならないのが普通なんだけど、そうなった将来に備えておいてもいいんじゃないかと思った。答は簡単で、「システムコード0x88B4を指定したポーリングに応答があるかどうか」で決まる。Lite、そうでなければ、それ以外だ。これで決まりだ、と思いたいのだが、実はそこまで確信が持てない。Standardのシステムコードが「0x88B4を使わない」という記述を読んだことがないからだ。使うことはないと思うのだが・・・。念のため、システムコード以外の区別方法も説明しておこう。Liteにはないカードコマンドを発行することだ。Liteに使えるコマンドは3つだけである。Standardともなると、コマンドはかなり増える。Code」なんかは発行しやすいコマンドじゃなかろうか。Standardと考えてよかろう。nfc2013/05/03[n7]Nexus7のroot化をしてみた「助さん、格さん、もういいでしょう」というわけで、Nexus7のroot化なるものをしてみた。syncでとってきたmasterをビルドして焼いて、あとはデバッグするところまでだ。情報があるので、ビルドして焼くところまではうまくいった。おおざっぱに手順を書き残しておく。ほとんど、穀風さんのところで事足りた。syncでとってくるGoogleのバイナリ提供ページからNexus7のものを持ってくるmake焼くためにbootloaderのunlock(1回だけ)コマンドを打つと、Nexus7側に画面が立ち上がって、確認を求められる。unlockすると、起動時に鍵の外れたアイコン表示が出る。あと、データが全部消されるみたいなので、バックアップしておこう(まあ、焼くから全部消えるんだけど)。unlock焼くNexus7はbootloaderモードというのか知らんが、緑の彼がおなかを開いている画面にしておく。Linux側は、lunchしておかないと環境変数設定が足りなくなるようだ。USBをPCの前に挿してやってたのだが、途中で止まってしまった。後ろから挿すとうまくいったので、そういうのがあるようだ、ということは覚えておこう。flashallこれで焼くことはできるのだが、デバッグのためにapk差し替えなんかがやりづらい。そのため、root化することにしたのだった。lunchのとき、full_grouper-userdebugを指定したのだが、full_grouper-engとかだったらrootになってくれるのかもしれん(てきとう。modeなるものがあり、そこをカスタム品に置き換えるようだ。置き換えると、zipファイルからインストールするしくみができるようで、suするアプリかなんかをインストールしてくれるようだ。今の最新版っぽいファイルを使うことにした。recovery-clockwork-touch-6.0.3.1-grouper.imgUPDATE-SuperSU-v1.25.ziptouchがつくのとつかないのがあるけど、まねしてtouchがつく方にした。ZIPは、/sdcard/の下に置いたけど見えず。/sdcard/0/の下にいるようだった。SuperSUまでインストールはできたようだ。shellでremountしようとしたけど、permissionが足りんとか言われるのはそのままだし。suすればいいかと思ってやったけど、コマンドプロンプトで止まってしまうし(Nexus7画面には、何か認証したっぽいメッセージが出てきた)。めんどくさくなってきたので、engでビルドし直すことにした。逃げている感じがかなりするのだが、まあいいや。android2013/05/01[nfc]NFCの検知NFCの検知は、いくつかタイプがある。そんな地味な話を書いてみよう。タグ側にとっては、基本的に搬送波がトリガとなる。だいたいのタグは受け身なので、自分からは搬送波を探しに行ったりしない。「パッシブ」というやつですな、たしか。NFCのアクティブタグってのは知らないので、割愛。やればできるとは思うのだが、電源がいりますな。Tag(SONY)とか、Panasonicさんのもそうだけど、あれもパッシブタブだ。かかわらず電源がいるのは、マイコンを動かすほどの起電力を搬送波から得ることができないからだろう(Panasonicさんのは、一部電源不要だけど、マイコンを使うなら必要になったはず)。R/W側はいろいろとやりようがある。思いつくのが「ポーリング」だろう。定期的に搬送波を出して、探すやり方だ(「ポーリング」は一般用語のポーリングと同じ意味)。PCに接続してFeliCaランチャーが起動しているPaSoRiも、Windows8でNFPしているR/Wも、ポーリングしている。搬送波をただ出せばいいというわけではなく、NFC-AならNFC-Aの、NFC-BならNFC-Bの、もちろんNFC-FならNFC-Fの搬送波を出さないといけない(NFC-Bは、私はまだ成功したことがないのでよくわからん)。搬送波を出す、というか、搬送波に答えてもらうためのコマンドを出すというところだ。AもBもFもコマンドが違うので、3種類を検知しようとしたら、定期的に3種類のコマンドを織り交ぜながら搬送波を出すことになる。頻繁に搬送波を出すと、検出までの時間は短くなるけど、電源の消費も激しくなる。AndroidでNFCを有効にしておくと、多少なのかしっかりなのか知らないけど、電源の消費は大きくなってるだろう。タグみたいに待ち受けとくわ、となるのがカードエミュレーションモードだろう。モードの意味としては「カード(タグ)をエミュレーションする」なので、やりたいことはちょっと違うのだけど、結果としてそうなってしまう。おサイフケータイなんか、そうなってんじゃないかね。うちのP906iはそうだ。搬送波を検知して(というよりも、搬送波によって電流が発生したことを検知するんだろう)、それをトリガにして動き出す、というところだろう。トリガの代表格は、駅の改札だろうね。これだと、自分では無線を出さないから、電池の持ちはよくなる。タグが金属を持つのであれば、金属センサーをトリガにして搬送波を出し始めるとか。無線を出すのは結構な電力を食うので、物理的なアクションを待つというわけだ。これは、製品として既にあるのだ(RC-S710)。いう「ああ、こういう見方もあるのか」的なものは、好きですな。あれ、いろいろある、とか言っておきながら、3つくらいしか思いつかなかった。他にもあるとは思うが、このくらいにしといてやるわ、ということで。