2012年3月11日

android-x86+VirtualBoxでadb

軽い話を。

普通にandroid開発すると、adbでログを見る。
android-x86でもそうしたい。


基本的には、android-x86のページに書いてあるとおりだ。
http://www.android-x86.org/documents/debug-howto

うちでは、Ubuntu 11.04 64bitを使っている。
VirtualBoxは4.1.2_Ubuntuというやつみたいだ(Ubuntuソフトウェアセンターでインストールした)。

まず「Host-Only」について。
何も考えずにVMの設定画面を開いてネットワークの設定を「ホストオンリー」にすると、赤字で「ないよ」みたいに言われた。
検索して、まずVMではなくVirtualBoxの環境設定が必要なことを知る。

「ファイル→環境設定」から「ネットワーク」を選択。
エラーが出るときは、ここのリストが空になってると思う。
右端の+がついたアイコンをクリックすると、追加された。
特に変更などはいらんみたいだ。

このあとで、VMのネットワーク設定を「ホストオンリー」にすると、アダプタが選択される。


次に、adbを動かす。

android-x86を起動すると、localhostとなんかとeth0があるようだった。
しかし、どれも有効になっていないので、手動でやらんといかん。
ホストオンリーをデフォルトで追加したときは、DHCPになっているようなので、ここもDHCPでアドレスをとってくる。

まず、VMが起動した画面で「ALT+F1」と押す。
すると、VMの画面にコンソールが重なったような画面になる。まあ、コンソールなのだ。
私は、こうやった。

$ netcfg eth0 dhcp

特にエラーも出なかった。
もう一度「netcfg」だけ打つと、IPアドレスが取れていた。
元に戻るときは「ALT+F7」。

最後は、ホストとなるパソコン側。
adbが動くパスならいいんだろうけど、android-x86の説明に従って「out/host/linux-x86/bin」に移動することにした。

$ cd out/host/linux-x86/bin
$ ./adb kill-server
$ ./adb connect xxx.xxx.xxx.xxx:5555

これでいけた。
5555は、adbがデフォルトで使うポート番号だったと思う。xxx.xxx.xxx.xxxは、VM側がDHCPで取得したIPアドレス。

./adb devicesなどして確認してもよし、shellしてもよし、logcatしてもよし、だ。

android-x86を動かす

私は、RSSでブログチェックをしている。
メールも、twitterやSNSなどもほとんど活用してない。
基本的に、ブログやホームページをチェックする程度だ。

今週、ITproさんに興味ある記事があった。

Android 4.0をx86パソコンで動かしてみよう
http://itpro.nikkeibp.co.jp/article/COLUMN/20120227/383202/

やってみよう。

広島の方ではAndroidのハッカソンが行われているようなので、対抗して一人ハッカソンだ。
・・・嘘です。単なる偶然です。


私はVirtualBoxで動かしたかったので、書いてあることはほとんど読まず、android-x86のページを見た。
いや、書いてあるとおりにやったら動かなかったので、普通にやったというところか。
ITproのページではgrub周りを変更してあるし、ベースとなるPCがうちと違うためだ。

インストールせず、isoファイルをそのままCD-ROMみたいにして動かすと、動いた。


もちろん、これだけをやりたいわけではない。
ちょっと昔の話をしよう。

私がSonyのRC-S620/Sを購入した後だったか前だったか、Android 2.3が発表された。
初のNFC API対応だった。
ソースをダウンロードして、NfcServiceを見て、このくらいなら移植できるんじゃないか、と思った。

そしてやってるうちに、2.3.3だか2.3.4だかが出てきて、一気に複雑になって挫折したのだ。
まあ、おかげでJNIやらなんやらを試すことができたのだが、なんとなくもったいない気持ちだった。
その後、BeagleBoardに自前ライブラリなどは載せたものの、Androidの標準APIとはつなげられなかったので、何とかしたいと思っていたような気がする。

というわけで、今回の一人土日ハッカソンは、「android-x86で少しくらいパソリを動かす」だ。
全部動かそう、とか、APIとつなげよう、なんて大それたことを2日でやっちゃいかん。


まず、android-x86のソースを見て困ったのが、NfcService周りのソースがないこと。
コンパイルされないようにしているわけではなく、そもそも入ってないのだ。
これは、android-4.0.3_r1から持ってきた。

 

持ってきたからと言って、そのまま使えるわけではない。
次の作業は、NfcServiceからlibnfc-nxpを分離する作業だ。
libnfc-nxpという名前からするとlibnfcの分派のように聞こえるが、全く別物だ。
こちらは、NXPがじきじきにメンテナンスしているものだ。
たぶん、これ。

NfcServiceは、packages/app/Nfc以下にある。
そしてAPIは、frameworks/base/core以下にある。
見たところ、API側はいじられてないようなので、方針としてAPIには手をなるべく入れないことにした。
Javaはわからないので、あまり触りたくない、というのが本心だ。


2.3.4くらいのときと違って、packages/app/Nfc以下も整理されていた。
nxpを制御する部分がかなり分離されているのだ。
これは、好都合だった。

やってからわかったことだけ書くと、DeviceHost.javaがネイティブとのインターフェースになり、それをうまいこと実装すれば移植しやすいようである。
それがわかるまでは、NfcServiceから先に手をつけ、DEPやLLCPをごそごそ削り、システム側と整合が取れなくなってコンパイルエラーやら動かないやらでてんやわんやだった。

やるなら、まずnxpパッケージを削除して自前のパッケージを追加し、そこにDeviceHostのimplementsクラスを作るとよさそうだ。
名前をNativeNfcManagerクラスにしておくと、NfcServiceとつなげやすい。

あとは、NativeNfcManager側のLLCPを無効にしたりしつつ、NfcServiceで使わないものを整理していくと、そこそこ形が整う。
注意としては・・・ビルドだろうか。
android-x86だが、どうも1回だけしかmでビルドしないと、依存関係がうまく解決できていないのか、VirtualBoxで実行しても異常動作を起こすことが多かった。
ソースを変更せず、もう一度mするとうまくいったので、順序の問題っぽい。
これがわかるまで、動きが毎回違うのかと思って苦労した。


ここまでは、NfcServiceだけの話。
私はパソリを動かしたいので、USBもなんとかせんといかん。

libusbを移植して自前の環境を持ってこようかと思ったが、Android 3.2のときにUSB Host機能を使ってパソリを動かしたことを思い出した。
そのライブラリをNfcServiceで動かせば、あっさり動くだろう。

 

・・・動かなかった。
タイミングの関係だか書き方が悪いのだかわからんが、動かなかった。

アプリでUSB Host機能を動かすとわかるが、普通はユーザに「このUSB機器をつないでもいい?」という認証を求めてくる。
(求める要求はアプリで果敢といかんが、画面はシステムが出してくれる。)
この認証画面が出てくるのが、NfcServiceの起動と重なり、認証させる画面と同時くらいにサービスを動かそうとするためか「サービス起動に失敗した」ダイアログが表示され続け、認証画面にたどりつけなかったのだ。
まあ、書き方が悪かったんだろうね・・・。


しかし、通常使うのであれば、わざわざダイアログが出てきて認証させることがいやだ。
パソリだけを優遇してやろう。

と、今では書いているが、そうするまでかなり迷った。
ダイアログを出させて認証させてから動かす方がよいかどうか、だ。
最終的には「いいんじゃないの」としたけどね。

この「特別扱い」の実行が最後までわからなかった。
frameworks/base/services/java/com/android/server/usb/UsbSettingsManager.javaを見ると、認証しているのはcheckPermission()だ。
これは、USB Host用とUSB Accessory用とそれぞれある。
私としては、認証済みリストにパソリを最初から含めたような作りにしたかった。

認証済みのものは、/data/system/usb_device_manager.xmlにファイルとしておかれているようだった。
ソースで見る限り、だが。
ならば、このファイルを作って置いておけばいいだろう。
・・・と思ってからが長かった。
だめなのだ。私にはわからんかった。

Androidを移植したことがあるとわかるが、最初のルートファイルシステムをどう作るかは機種によってまちまちだ。
私はSmartQ5とBeagleBoardしかないのだが、それですら違いがあるのだ。
android-x86では、どうも/dataに相当する部分はマウントしないみたいである。
最初、/data/system/usb_device_manager.xmlというファイルを置いていたのだが、読んでくれなくてadb shellで確認した。

ならば、とinit.rcの起動処理くらいにcpで/etc/に置いたファイルをコピーするようにしたが、それもだめ。
/etc/init.shのタイミングだとコピーはできたが、UsbSettingsManagerのコンストラクタには間に合っていないのか、だめ。

いろいろ考えて実践したあげく、こうした。

    public boolean hasPermission(UsbDevice device) {
        synchronized (mLock) {
        	//PaSoRi OK(hiro99ma)
            if((device.getVendorId() == 0x054c) && (device.getProductId() == 0x02e1)) {
                Slog.d(TAG, "I am PaSoRi.");
                return true;
            }

ああ、笑うがいいさ。
格好が悪いが、べた書きでしか対応できなかった。


こうすると、android-x86が起動するとNfcServiceが起動し、パソリも自動的に認証して、NfcServiceのenableでポーリング開始を書いていたら、ポーリングしてくれた。
長かった・・・。

明日は、ポーリングをやりっぱなしではなく定期的に行うようにして、検知したらインテントを投げるように変更したいものだ。
ほら、やっぱりAPIとつなげるってところまでは無理そうやん。

2012年3月7日

NDEFの資料を読もう (2)

NDEFのやりたいことは、前回でなんとなくわかったと思う。
XMLのようなツリー構造になっているわけではなく、シーケンシャルにNDEFレコードが複数集まったもの、それがNDEFメッセージのようだ。

 

NDEFレコードのことを細かく見ていっても面白くないので、気になるところだけ見る。


2.4.2 Payload Type

 

1番目のレコードが持つPayload Typeは、そのレコードのPayload Typeというだけでなく、NDEFメッセージ全体のPayload Typeでもある(SHOULD)。

この節は、説明が長い・・・。
まあ、必要になったら読めばよかろう。
とにかく、well-knownなもの以外も設定できるのだよ、と。


ここまでの知識で、手元にあるNDEFのデータを読んでみた。
touchanoteのタグ(Mifare UltralightC)と、SonyのNDEF writerで作った人からもらったタグ(FeliCa Lite)。

どっちも、URLを含んでいるのだが、表現方法が異なる。

 

touchanoteの場合、Type2の定義に従ったカードのヘッダ部分に続いてNDEFメッセージが始まっている。
いきなり、well-knownの「U」、すなわちURIになっている。

 

NDEF writerもらったタグの場合、Type3の定義に従ったカードのヘッダ部分に続いてNDEFメッセージが始まっている。
これは、well-knownの「Sp」、すなわちスマートポスターになっている。
SpのレコードにはMBとMEのビットが立っていて、このレコード1つしかないことになっている。
しかし、そのペイロード部分に複数のレコードを含むというメタ構造というのかしら、そういう構造になっている。

スマートポスターはNFC Forumのドキュメントとして別途存在するように、けっこう重要なwell-known typeらしい。


とまあ、こんな感じであった。

実物が得やすいし、NFC Forumのドキュメントにはサンプルもあるので、実装はそこまで難しくないように思う。

 

気をつけるのは、NDEFメッセージが始まるまでは各Tagによって異なるということかな。
Type2とType3では、それぞれ定義が別だった。
「NFC Forum Device Requirements」によると、NDEFメッセージのパーサは積まないといかんようなので、早めに簡単なものを実装したいものである。

NDEFの資料を読もう (1)

NDEFというと、アプリが使うもんだっていうイメージがあったので、まったく把握していない。
NFC Forumのドキュメントを読んで、少しくらい把握しておこう。


2.2 Intended Usage

 

意図する使い方、というところか。

関連するドキュメントを「NDEFメッセージ」にまとめ、それをNFC Forum Device間でやりとりする、というイメージなのだろう。

強調しているのは、MIMEも使えるけど、MIMEとは限らないよ、ということ。
NDEFメッセージを解析するために、NDEFレコードタイプとペイロードのチェックをしなくていいよ、ということらしい。

エラーについての決まりもないようだ。
ここら辺が規定されると、実装がめんどくさいからありがたい。


2.3 NDEF Encapsulation Constructs

 

NDEFの構成、というところか。
"encapsulation" を和訳して入れ込むと、なんかわかりづらくなりそうなのでやめた。

NDEFは、まず「NDEF message」が一番上に来る。
1つのNDEF messageに、複数のNDEF recordが含まれる。

NDEF recordには、「メッセージ始め」という意味のMBビットと、「メッセージ終わり」という意味のMEビットがある。
最短のNDEF messageは、1つのNDEF recordを含み、そのrecordのMBビットとMEビットが両方立っている。
"chunked payload"にするためには、2つ以上のNDEF recordが必要らしい。

 

ときどき聞く "chunk"という言葉。
1つじゃないよ、2つ以上だよ、というくらいの意味のようだ。
それでいいのかどうかは知らんが、まあ困りはすまい。

 

NDEF messageは、MBとMEが最初と最後にそれぞれ1つじゃないといかん。
これを「オーバーラップしてはいかん」と書いている。
ネストさせてはいかん、ということらしい。
データをネストさせたいなら、NDEF messageをペイロードに持つNDEF recordを持つことになる、と。

NDEF recordは、自分が先頭から何番目のレコードなのかは知らない。
なので、順番性はNDEFを伝達する人が保証すること。
DEPとかで分割して送る場合を想定しているのかな?


今日はここまで。
英語は相変わらず苦手だが、ずっと眺めていれば抵抗感は少しぐらい減るんじゃないかね。

世の中は、NFC & Smart WORLD 2012なるものが開かれているが、私はいつものようにコタツに座っている(コタツの上じゃないよ)。
出張でもない限り、関東に用がないからなぁ。

2012年3月6日

[nfc]木を見て森を見ず、のようなNDEF

私は、NDEFをあんまり重視していなかったように思う。

単なるデータフォーマットの一つ、くらいの認識だ。
こんだけ世の中にいろいろフォーマットがあるのに、また増やしやがって、というような。

 

しかし、いろいろと考えていくと、NDEFというのはNFC Forum規格の中心に位置するのではないか、と考えるようになった。
何というか、NFC内での共通言語という位置づけなのだろうか。

Digital Protocolは、やっぱりプロプライエタリな部分の寄せ集めという感はぬぐえない。
しかし、無線部分を規格化しましょう、ということなのだから、そこはどうでもいいのかもしれない。
どちらかというと、NDEFというデータにアクセスするまでの物理的な通信手段(PHY)をDigital Protocolにまとめ、メモリ構造をTagに集約し、さあ後はNDEFの世界が広がっているぞ、というイメージかしら。

 

今まで、LLCPのドキュメントばかり見ていたけど、先にNDEFのことを見ておいた方がよいのではないかと急に思った次第である。

Digital ProtocolやLLCPなどの木ばかりしか見ず、NDEFなどの森を見ていない、という状況は避けたいものだ。

2012年3月4日

SDK for NFC Starter Kitのソースファイルを整理

今まで作ってきたSDK for NFC Starter Kitのアプリがあるが、ソースファイルを適当にしすぎていた。
まだ覚えているうちに整理しておこう、と今日一日やっていた。
https://github.com/hirokuma/NfcStarterKitWrap

NFC Starter Kitのラップを作っていたものをクラスライブラリにして、アプリからはDLLを参照するようにするだけでいいようにした。
ついでに、CHMファイルのAPI仕様書も作った。
まあ、仕様書というにはわかりづらいところではあるが・・・。
サンプルソースもあるので、困ったらそっちを見た方が早い。

機能の追加も何もないが、ソースファイルの整理はやっておかんといかんですな。

[win]Windows Help2はもうやらんのか

NFC勉強会が終わった後にもかかわらず、いきなりWindowsの話だ。

いや、聞いておくれ。
今までSDK for NFC Starter Kitで作ってきたライブラリがあるのだけど、それを整備していたのだ。
コメントを付けていったくらいだけど。

Visual Studioでコメントをつけると、XML形式でのドキュメントを作ることができる。
それをSandcastleとかに喰わせると、API仕様書みたいなものができあがる。
一度作っておけば、忘れたときに便利だろう。


そう思って、最新版のSandcastleとかをインストールしようとした。

インストールしても・・・特にメニューに何か追加されるわけでも無し。
Sandcastle Help File BuilderというGUIのツールは別途なのだ。
インストールガイドはこちら。

ガイドを読むと「Sandcastle Stylesから持ってくるとバグとか直ってるのがあるよ」というように読めたので、そっちを持ってきた方がいいのかな?

 

どうも、SHFBをダウンロードすると、Sandcastleに必要なもの一式が入っているみたいだ。
わざわざSandcastleを単体でインストールしなくてもよいみたいな気がする。


インストールしているときに気付いたのだが、Visual Studio 2010以降ではWindows Help2形式のものは作らん、といっていた。

確か、chmファイルから、なんかよくわからん形式に変わったという記憶はある。
たぶん、それがHelp2形式なのだろう。
それが作られなくなるってのは、なんだ?

検索すると、こちらのページがわかりやすかった。
http://owlsperspective.blogspot.com/2011/01/visual-studio-help3-system.html

「不評だから」が理由らしい。。。
んで、Help3形式にする、と。。。

なんかもう、chmファイルでいいや、という気になってしまった。

NFC勉強会@福岡に行きました

お誘いがあったので、昨日NFC勉強会@福岡に行った。

道は、1回だけ曲がり間違えた・・・。
しかし、ちゃんと着くことができたので、問題なかろう。
あれですな、自分に自信がないと、自分の記憶すら疑ってしまうと言うやつだ。

出不精で勉強会などほとんど行かないため、今回の場所も初めて。
GuildCafe Costaというところである。
店内のレイアウトはこんな感じで、右側のスペースを使わせていただいた。
左側には、普通のお客さんもいらした。
スペースの境目がスクリーンになっていて、そこにプレゼンテーションを表示できる。


内容の詳細は・・・他の方がきっと書くと思うので省略。
時間の都合でHands-onの時間は取れず、プレゼンテーション+会話となった。

まあHands-onするにしても、NFCって通信部分だけなので難しいところだ。
どうしても、勉強会みたいに「やったことを話す」か、ハッカソンみたいに「何か作る」が中心で、「じゃあ1時間あるから何か作ろうか」ってのはやりづらそうだ。

 

勉強会のいいところは、自分が興味を持っていないところの話を聞けるところだ。
一人でやってると、自分の興味分野しか見ないので、他のことを見なくなるのだ。
テレビや新聞みたいに、他のことも見てしまう状況を作らんといかん。


今回、初めて発表なるものをしてみた。
資料はこちら。
http://www.slideshare.net/hiro99ma/nfc-11850428

うーん、地味だ・・・。
話したいことはだいたい話せたのでいいけど、えらく下層の話だったので「なんじゃこりゃー」の人がいたかも。
まあ、そういうのもよかろう・・・と自分を納得させておく。

ネットに置いた方の資料は、多少修正している。
発表時にソフトを切り替えたくないのでPDFのスクリーンショットを貼っていたところを外したり、誤解があったらいかんと思ったところに注釈を入れたりしただけだ。

話していいのかどうか迷っていた後半部分も、結局はそのままにした。
解析方法なんて、考えてみれば書いたことくらいしか方法がないし、解析した結果も「できました」とかしか書いてない。
「まあいいんじゃないの」というところだ。


勉強会とは関係ない話で、ほほぅ、と思ったのは、ツイッターの話だ。

私の場合、平日は仕事から帰ってから1回だけ見るような感じなので、フォローする人は少ないし、フォローする人もツイートが多くない人を選んでいる(そしてだいたい全部読む)。
興味がある人は、そのときにときどき見に行く、という使い方である。
見るのも、ブラウザで見るだけである(ツール類は使ってない)。

しかしフォローする人が多いと、ツイートのあれって流れるように出るらしい。
ずっと見ていても1時間にいくつかしか出てこない自分の状況しか知らないので、へー、と思ったのだ。
同じものでも、人によって使い方が異なるので、いろいろ想定せんといかんなあ、と思った次第だ。

2012年3月3日

Raspberry Pi

Qtのブログで存在を知ったのだが、今週発売があったらしい。

http://japanese.engadget.com/2012/03/01/35-linux-pc-raspberry-pi-hdmi-sd-usb-la/

本家のサイトはこちら。

http://www.raspberrypi.org/

 

私はあんまり重たいことをしないし、小さくてちょこちょこ動くようなことしかしないので、BeagleBoardくらいでもちょっと高機能すぎる。
このくらいがちょうどいいかなってところだ。

あ、SPIとI2Cがないのか?
そうでもないらしい。GPIOと兼用ピンということか。ARMだし。
http://www.bitwizard.nl/wiki/index.php/Raspberry_pi_expansion_system_page
途中の情報らしいが、ここにも書いてあった。

 

まあ、買うかどうかはわからんけどね。

2012年3月1日

[nfc]どこまで話してよいものやら

今週末、福岡でNFCの勉強会がある。
お誘いを受け、発表の機会まで得ることができた。

さて、どこまで話してよいものやら・・・。

 

今月のInterface誌はNFC特集だが、第3章の「NFC開発に存在する三つの壁」に頷いた人は多いだろう。
ひどく、苦労した。
今でも苦労しているが、当時は投げ捨てそうな程だった。
残念ながら当時の苦労状況は、ここのブログに移ってくる前に閉鎖されたので残っていない。

 

そこからの経緯は、簡単に以前書いたので割愛しよう。
問題は「今まで調べた結果をどこまで話していいのだ?」というところだ。


私としては、チップを買う→データシートがついてくる→それを読めばすべてわかる、なのだが、NFCに関してはそれがまったく通用しなかった。

あれこれ実験した結果、このドキュメントが一番近そうだ、というところまでが長かった。
この情報は、単なる体験談だから、別に話しても悪くないと思う。

しかし、データ解析をしたところは・・・まずいと思う。
PaSoRiを買ったときに付いてきた取説は、かなり目を通したのだ。
でも「リバースエンジニアリングしないでくれ」というような項目がない。
(昔のハードは、買うと回路図つきだったりしたものだった。)

リバースエンジニアリングは権利としてある、という話もあるようだが、知財側面は無視できない。
やらんで済むならやりたくはない。
しかし、わからんものをほっておけるほどおとなしくもないので、ちょっとやった。
この成果が、FALP送信は一応できた、というやつになる。

まあ、ここは詳細に話すつもりはないので、話してもそんなに問題ないような気はする。


どちらかというと気にしているのは、もう1つ話そうとしていること。

わかる人にはわかるだろうが、IDmについてだ。
実際に利用したことはないが、ネットで見ていると「この製品のセキュリティ、大丈夫なのか・・・?」というものがしばしばある。
具体例を見せないとわからんのではないか、という気がしているのだ。

ネットを検索すると、同じようなことを思う人はいる。
その人も「これは危ないから公開しない」といっているが、その気持ちは良くわかる。
IDmをセキュリティ情報として使うなんて、パソコンの前にログインパスワードを付箋で貼っているのと同じくらい危険なのだ。

 

詳細は説明しないけど、NFCが来るということは、そういう情報も入手しやすくなると言うことだと思う。
私だって「あら、ほんとにできた」という感じだったしね。


そんな「どこまで話せるんだ」という苦悩を抱えつつ、NFC開発者は日々不安や孤独と闘っている。
そこに深い井戸でもあれば「王様の耳はロバの耳~」くらいのことは叫びたくなる。

その井戸が、NFC勉強会になる、というだけのことである。

 

と、強気なようだが、原稿を見直してもう少し無難にすべきか迷いはある。
Guild Cafeに行く道ですら迷おうとしているのに、原稿の進む道でも迷わんといかんのか。。。

 

NFC開発者の苦悩は続く。