2011/12/30

[rcs620s]RC-S620/SでNFC-DEPする

もうすぐ実家に帰るので、最後に書き残しておこう。
RC-S620/SとPaSoRiでNFC-DEPしていたので、そのコードを。

・・・と思ったが、あまり本体は変わっていないように思う。
Resetコマンドの使い方を間違えていたので、そこを修正したというところだ。
以前、終わらせ方がわからん、という記事を書いたが、Resetできてなかったのだろう。

githubではなく、assemblaを使ってます。
assemblaはprivateが使えるので、書きかけのコードでも気にせず置けるところがありがたい。
まあ、誰もアクセスしてないだろうから気にしすぎなんだけどね。

https://www.assembla.com/code/rcs620s/git/nodes

2011/12/26

[llcp]LLCPのシーケンスを描こうとしたが難儀する

libnfcとlibnfc-llcpを使ったLLCPでAndroid Beamを動かそう、などと思っていた。
R/Wは、PaSoRiやRC-S620/Sを想定(それしか持っていない)。
libnfc-llcpがどう動くのが正解なのかわからないので、めんどくさくなってきた。
おそらく、オープンソースでPaSoRiをつかったLLCPをしようとするならば、nfcpyがいいだろう。
libnfcを介さず直接libusb(PyUSB?)を操作するし、なんといってもRC-S956をサポートしている。
RC-S330で動いたと言うことだし、NexusSとNPPできたとあるので、まあ大丈夫じゃないんかね。

しかし、私は自前で実装しようかと思う。
限定的であれば、そこまで大変なことにはならないんじゃないかい?
パフォーマンスとかそんなに気にしないし、そもそもAndroid Beamできそうな端末も持ってないので、急いで作ったとしても確認できない。
(それを言うと、完成させたとしても確認できないがね・・・。)



NFC ForumのLLCP 1.1を読んで、とりあえずシーケンスだけでもひっぱってみようとした。
しかしまあ、ネットワークの知識がないせいか、英語の知識がないせいか、何をいってるのかわからん。
せめて図があればよかったのだが、プロトコルの説明以外で図がない。
まいった・・・。
一般的なLLCの勉強をしつつ、一部だけ引っ張ってみた。
実装したわけでもなんでもないので、間違ってるかもしれん(まあ、間違ってるだろう)。
地道に引っ張っていきますかね。
https://sites.google.com/site/hiro99ma/home/experiment/snepunit/llcp

2011/12/18

[felica]Resetコマンドの使い方を間違えていた

DEP後、RC-S620/SやRC-S370をあれこれやっても、DEPを再開できなかった。
Resetコマンドを出しても戻らないので、なんか別のことがあるんだろう、くらいに考えていた。

PN533にはResetコマンドはなく、同じ数字が別のコマンドとして存在する。
ResetコマンドはRC-S956専用コマンドなのだ。
そして忘れていたが、RC-S620/Sの簡易コマンド仕様書にはResetコマンドのことが記載されている。

 

どうせ他のコマンドとあんまり変わらんだろうと考えていたのだが、そんなことはなかった。
いやいや、仕様書は確認しないと、と常々いっているのに、またこれだ。
確認不足でしたわ。

[libnfc]1.5 new apiはまだビルドが通らない

Ubuntu11.10でしか試していないが、libnfc-1.5-new-apiはまだビルドが通らない。
nfc-internal.hの扱いをどうするつもりなのかがよくわからんので、とりあえず解決させてみる、という気にならなかった。
まあ、急ぐ必要はないんだけどね。

 

RC-S956用のドライバをPN53xとは別に作った方がいいんだろうけど、追加するにはconfigureとかから変更していかないといかんだろうから、めんどくさい。
やっていないので「やれない」とはいわないのがずるいところだ。
当面は、1.5.1に対して追加していきましょうかね。

Accessory Modeが動かんというのは、VIDのせいじゃなかろうかね

A500で、AndroidのUSBアクセサリモードが動かない、という話があったように思う。
うちではAccessoryChatできていたようなので、なぜかわからなかったのだ。

よくよく考えてみると、AccessoryChatを動かすために、PC側のソフトを変更させたような気がする。
何かというと、Vendor IDをチェックするときにAcerの番号もOKにするようにしたのだ。

 

AccessoryModeの接続確認は、まず最初にUSBのVendor IDとProduct IDをチェックする。
VID==0x1801 && (PID==0x2d00 || PID==0x2d01)であればAccessory Modeになったと判断する。
しかし、VIDの0x1801ってGoogleなのだ。
メーカーとしては、PIDくらいは変更してもいいけれども、VIDを他社の番号にするのが難しいんじゃなかろうか。

なので、ADKのボードみたいなのを持ってるけど動かない場合は、ADK側のファームを変更するといいんじゃなかろうかね。
もってないので適当なことをいえば、
http://developer.android.com/guide/topics/usb/adk.html#getting-started
The ADK packageで取得したファイルのAndroidAccessory.hにあるisAccessoryDevice()のidVendorチェック条件を増やせばいいんじゃないかね。

    bool isAccessoryDevice(USB_DEVICE_DESCRIPTOR *desc)
    {
        return (desc->idVendor == 0x18d1 || desc->idVendor == 0x0502) &&
            (desc->idProduct == 0x2D00 || desc->idProduct == 0x2D01);
    }

ソース未公開ライブラリがあるんならどうしようもないんだけどね。
AndroidAccessory.cppを眺めた感じでは、アクセサリモードになるためのシーケンスでも使われているようなので、何とかなるんじゃないかね。

USBのベンダIDは、こんなところに一覧がある。
http://www.linux-usb.org/usb.ids
ここから、自分のIDを探して追加するといいかも。
A500のときは、0x0502を追加したようだ。
XOOMだと、0x22B8なのかな? この数値は、accessorychat.cに載ってた値なので、よくわからん。

android-4.0.3_r1もUbuntu11.10でビルドできないことだよ

タイトル通りだ。

エラーになって終わるのだが、その理由はwarningをerror扱いにするオプションが指定されているからだ。
しかしそこを解除しても、4.0.1のときは他の原因でエラーがいくつも発生した。
修正箇所は、他の人がブログに書いているので調べてみるとよかろう。

masterでビルドできるんならいいや、と思ったが、さっきsyncしてmakeすると、mesa3dでコンパイルエラーが出た。
まあ、まだ使ってないからいいや。

[nfc]今年のまとめ

来週やるかどうかわからんので、気が向いたときにまとめをやっておこう。

どうやら、このブログに移ってきたのは、今年のことのようだ
2月1日である。
2月2日には、「LLC PDU」などという記事を出しているところから、あれからずっとLLCPのことを考えているようだ。
もう10ヶ月以上経つが、まだLLCPできてない。
できてないというよりも、LLCPを自力で実装しようと考えてないから、まあ・・・いいとするか。

2月は43件の投稿。
多いなー、と思ったが、だいたい毎月そんなもんのようだ。
連休の前月は少なめなのかもしれんが、毎日投稿しているわけでもないと思うと、週末にけっこう出しているようだ。

3月は、最初ちょろちょろDEPして、間にカメラなんてものを挟んでいる。
BeagleBoardに、USBカメラを動かそうとしていたようだ。
うちにあるUSBカメラのI2Cあたりで、待ち時間を入れたとかなんとかした記憶がある。
その影響か、JNIをやったりしている。
NativeActivityが出たので「Javaじゃなくてもアプリができるのかも」と思っていたのかもしれん。
アプリで楽をしたい私は、結局Javaしかないことがわかったところだ。

4月は、FALPなんてやってる。
NFC Forumの分類としては、NFC用途は3種類ある。
その中でも、やはりPeer to Peerの通信が一番面白いし、用途が広いと感じているようだ。
そして、PaSoRi RC-S370をターゲットにするなどして、R/Wコマンドに興味を示している。
ここら辺から、深みにはまっているように思う。

そして最多の5月。
OTGに興味を示している。
AndroidからUSBで(逆だな、USBでAndroid機器を、だ)操作できるAccessory Modeができたからだろう。
機器を操作したい私としては、USB Host機能を持つ3.1以上じゃないとどうでもよくなったみたいだ。
kernelとの関係や、USBプロトコルなどを見ているので、結構濃いことをやってたようだ。

6月は、あれやこれや。
Accessory Modeや、Qt、Windows USBやNFCの規約。
雨が多いせいかしら?

7月は、結構変なことをしている。
「かざしてログオン」をだます、というのは、私としては大きな分岐点だった。
NFCといっても、結局のところ通信の一種でしかない、という当たり前の結論を得たのだ。
そして、RC-S620/Sの簡易仕様が出てきた。

8月は、PaSoRiのアプリを作ってMarketに出したりしている。
9月にかけて、FeliCa Liteの片側認証を実装している。
なんというか、「わかってきた」というところだ。



10月はLLCPの実装を自分ではやらず、任せてしまおうと思っているみたいだ。
libnfcなどの、オープンソースプロジェクトを探している。
私らしくないような、私らしいような。

SONYのSDKも気にしてはいるものの、先にP2Pとして運用されていたFALPがNFC標準になっていない以上、どうすることもできない。
そう、技術は最初に作っていたので、間違いなく研究されていると思う。
DEPよりもFALPは先にできていたはずなのだ(たしか)。

FALPが普及しなかったのをSONYのせいにするのは、ちょっと酷だろう。
私としては、第2のTRON、みたいなことになったんじゃないかと何となく思っている(根拠無し)。
14443に含まれなかったのは、かなり痛い。
しかし、18092でDEPの標準としてNFC-Fも入っているのは、大きい。
携帯電話内部に情報を押し込めるのであれば、デバイスレベルの技術が左右してくる。
今やってる、SEを個別に置くのかSWPでSIMに置くのかとか、そんなの。
しかしネットワークとして外に出ていくとなれば、「どうせ外に出るやん」という考え方になる。
本体内にセキュリティをしっかりかけていても、お金の情報は外にあるので、その経路はさらされてしまうのだ。
内部を操作されてデータを書き換えられるのはまずいけれども、ネットワークでそれができてしまうと危険の比率がまったく異なる。
これは、SEがSIMにあろうと別にあろうと、ネットワーク上の問題だからどうしようもない。
SONY/FNがやってるその辺を、Googleが覚悟してやってるのだろうか、というのは気になる。
正直なところ、あんまり考えきれてないんじゃないかなー、という気がしている。
これもまた、証拠無しの印象だけなので、聞き流しておくれ。

さて、来年のことを考えよう。
PN533とRC-S956の違いがnfcpyでわかってきたので、制御はできそうに思う。
libnfcとlibnfc-llcpが動けば、Android Beamもできそうだ。
ただ・・・うちでは動作確認できない。
確認できないので、やっても面白くない。
面白くないなら、やりたくない。
そこをどうするか決めるのが、最初の目標ですかね。

2011/12/17

[dep]InJumpForDEPを受けとれば、DEPになるのだろう

nfcpyの情報を元に実装してみた。
うん、GetGeneralStatusの特定バイトを読むと、DEPと思われる値が取得できた。
InJumpForDEPを投げていないときには別の値だったし、FALPでも別の値だった。


ということで、InJumpForDEPを受けとれば、TgInitAsTargetでもDEPになると考えて良かろう。
DEP_REQがトリガになるのかな?


大きな問題は解決したが、細かいのは残る。

弱っているのは、InJumpForDEPした側のR/Wを終わらせた後、再度初期化処理を行うとエラーになるのだ。
初期化時にいくつかコマンドを投げているのだが、nfcpyに載っていた初期化にさしかかるとエラーになる。
うーん、何しているコマンドなんだか・・・。
電源ON後に1回しかできないコマンド、とかならいいんだけど、戻り値だけではわからん。

なんか間違えてるかなぁ。。

[dep]nfcpyを読む

またまたNFC-F Developers' Blogからだが、こんな記事があった。

http://blog.felicalauncher.com/en/?cat=5

 

Dynamic Tag(FeliCa Plug)の説明もあるが、真ん中に「nfcpy open source project」という項目がある。
以前書いたが、nfcpyのサイトには「RC-S330でLLCPできた」とあった。
リンク先にあるPDFを見ると、p20に構成図がある。
libusbを使い、デバイスドライバはpn53xとかipsimとかになってて、RC-S956は出てきていない。

p.33を見ると「not restricted」とある。
「We can provide」とあるけど、Weって誰なんだろう。
資料元がSONYさんなので、SONYの人?
ってことは、nfcpyはSONYさんが技術提供しているのか?と思ったけど、そういう記述は見つけてない。
うーむ。

このPDFを作っている一人のStephen Tiedemann氏は、nfcpyプロジェクトをlaunchpad.netに登録した人みたいだ。
launchpad.netは「software collaboration platform」というところのようだ。
なんというか、sourceforgeみたいなものかしら。

SONYさんとは直接関係はないけれども、中の人がやってるオープンソースプロジェクトだ、というところでよいのかな。


ならば、ということでTgInitAsTargetをどう処理しているのか見てみた。
libusbを使っているので、データの扱いは素のRC-S956のはずだ。

どうやら、Modeを見ていない。
GetGenralStatusして、その戻り値の一部でDEPかどうかを判断し、PN53x系と同じ処理になるようにModeのDEPフラグをONにしているようだ。

ほほー。
この情報は大きい。
nfcpyのRC-S956ドライバはPN53xドライバを継承して作っているようなので、RC-S956でオーバーライドしている機能がPN53xとの差分と考えて良かろう。

 

ならば前回気になったDiagnoseを見ておこう。
・・・同じようなコマンドが使えそうだ。
そして最初に考えていたのと同じく、戻り値にテストコマンド番号がひっつかないタイプみたいだ。
PN53xでは、先頭を外して戻り値を返しているようだから、間違ってなかろう。
まあ、深く考えないことだ。

 

こういう、ソースファイルを使わせてもらうわけではないが、中身を読んで参考にする場合はどういう扱いになるのだろう?
「ありがとう」っていう紹介をしておけばいいのかね。


Phythonのソースは初めて読んでみたが、案外わかりやすい。
スクリプト系は苦手なので拒絶しがちなのだが、食わず嫌いはいかんな。

2011/12/16

[adk]FeliCa PlugをADKで接続する記事(だと思う)

英語版のブログに、こんな記事があった。

 

How to control the NFC Dynamic Tag with an Android Tablet

http://blog.felicalauncher.com/en/?p=482

 

FeliCa Developers' Blogの英訳だけと思っていたけど、よく見ていくとそういうわけでもない。
この記事は、日本版にはないし。

ADKなんて、けっこう日本でもメジャーな方だと思うけど、何かあるのかしら?
Arduinoとか持ってないから気にしたことがなかったのだけど・・・。

 

うちにも、USBホストになることができるものはいくつもあるので、あとはプロトコルさえ実装してしまえばA500なんかをADK(アクセサリ側)として動かせるんじゃないかな、と思う。
そういえば、A500でADKできないって記事を読んだことがあるのだが、なんだろう?
AccessoryChatは動いたような記憶があるのだが・・・。
遠い記憶なので、あんまりあてにならんな。

[libnfc]Diagnoseは実行されていなかった

DEPがうまくいかんので、まずは素の状態でInJumpForDEPとTgInitAsTargetを実行させて確認しようと考えた。
libnfcを読んでいって、どこに何があるかを調べていくよりも、RC-S956コマンドを実行させて確認した方がシンプルでわかりやすい。

 

そんなわけで、久々に自作ライブラリを動かした。
Android版はFeliCa Liteの片側認証などの発行を重視した作りになっているが、Linux版はR/Wコマンドを重視している。
DEP関係のI/Fも実装して動いた記憶はあるのだが、当時は「DEPコマンドでやりとりできる」ということしか考慮していなかったので、DEPモードになっていたような覚えはない。
そのI/Fをいじくって、DEP確認をしよう。


と思ったが、ライブラリの使い方を忘れたので、libnfcに出ているコマンドをいくつか実装しようと思った。
まずは、R/W自動認識で使っているように見えるDiagnoseコマンドだ。
このコマンドは、PN533によるといくつかのサブコマンドが使えて、それによってテストができるようなのだ。
自動認識では、エコーバックする0x00コマンドが使われているようだった。

libnfcでRC-S370を動かしたとき、この戻り値がPN533と違っていたのだ。
PN533では、戻り値はサブコマンドとエコーバックなのだが、RC-S370はエコーバックのみだったのだ。
気になるので、試しておきたい。

しかし・・・実装して送信しても、ACKは返ってくるがアプリケーションエラーが返ってくる。
シンタックスエラーらしいが、コマンド仕様がないので何が悪いかわからん。

いろいろ試したが、戻ってこない。
では、libnfcで返ってきているのは何なのだ・・・。

 

と、libnfc時代のログを見てみると、いつもの「0x00 0xff・・・」みたいな出力ではなく、なんか「0x55 0x55・・・」のような出力になっている。
なんだこのデータは?

ソースを見ると、PN533のUARTで相手を起こすときのプリアンブルらしい。
当然、RC-S956はそんなの知らないから無応答。
追ってないけど、そこでエラーにはならずに、送信バッファの文字列がうまいこと見えるんだか重なるんだかして、エコーバックしたように見えたのではなかろうか。

ともかく、RC-S956のDiagnoseコマンドはPN533とはフォーマットが異なりそうだ、というくらいにしておこう。

2011/12/13

PN532とPN533ですら少し違う

「felica dep」などで検索しても、ほしい情報が出てこない。
そんな中、PN532のユーザーズマニュアルが出てきた。
RC-S956も、こんな感じで出てきたらいいのに・・・。

しかし考えてみれば、ここ最近のFeliCaに関する情報公開は、どんどん広がっている。
実にすばらしいことだ。
最近では、個人利用限定とは言えPaSoRiを操作できるライブラリを公開したり、Android向けの開発環境を無料で提供したりと、かなりの勢いで公開されていっている。
公開されることにより、使う人が増え、情報が増える。
いい流れができてきたので、どんどん進んでほしい。


で、PN532とPN533だが、パラメータがちょこちょこ違う。
全部見たわけではないが、PN533の方が設定が減ったように見える。

RC-S330とRC-S370は、果たして同じなのだろうか?
同じRC-S956とはいえ、さらに細かいリビジョンがあったりしたらどうしよう。

 

とかいろいろ考えようとしたが、風邪っぽいのでやめた。

2011/12/12

PollとListen、ActiveとPassive

鳥頭っぽくていかんが、またわからなくなってきた。

Poll Modeは、ポーリングする方ではなく、ポーリングしてもらう方なので、無線を出す。
Listen Modeは、聞いてもらう方ではなく、聞きに行く方なので、受信する。
というのが、前回までだ。

 

InJumpForDEPのパラメータに、ActPassがある。
Active ModeかPassive Modeかの選択だ。
あまり気にしていなかったのだが、PN533ドキュメントを読むとプロセスが異なると書いてある。


libnfcのDEPサンプル(initiator側)では、212KbpsのPassive ModeとしてInJumpForDEPを使っている。

まず、POL_REQを送信する。
そのデータは、PassiveInitiatorDataだ。今回はワイルドカードの「00 ff ff 00 00」。

それに対するPOL_RESを受けとったら、NFCID2t(ターゲットのIDm)として覚えておく。

 

次に、ATR_REQを送信する。
データとして、NFCID3iとGiを付ける。
DIDを使うかどうかは、内部パラメータfDIDUsedで決定される(SetParameters)。
マルチターゲットではないのなら、DIDは0(DEPルール)。
NFCID3iは、さっき取得したNFCID2tに2byte(0x00 0x00)埋めた値を使う。

それに対するATR_RESを受けとったら、ターゲットはTPE(Transport Protocol Equipped)だ。
受け付ける準備ができた、ということだろう。
PN533はNFCID3tを記憶し、Tgを決める。Tgは1。

 

これがPassive時の動きだそうな。


どこら辺がPassiveなのかわからんので、Active時の動きも見ておこう。

まず、ATR_REQをNFCID3iとGi付きで送信する。
さっきはPOL_RESの値を使ったが、今回はそれがないので自前のNFCID3iを用意する。
DIDの件は同じ。

それに対するATR_RESを受けとったら、ターゲットからのデータを待つ。

 

これが、Active時の動きだそうな。
違いは、ATR_RES後の動きだろう。
Passiveの場合は、ターゲットが受け付ける準備ができたということで、InJumpForDEPした方が送信する。
Activeの場合は、ターゲットからの送信を待つ。

私のイメージでは、Passiveが相手からの送信を待ち、Activeが自分から送信する、だったのだが、違うようだ。
今回のサンプルはPassiveなので、initiatorが「Hello, World」を送信する。
それを受けとったら、targetが「Hello, Mars」を送信する。
そういう動作になっている。


んで、TgInitAsTargetのModeでDEPとならない件は、これとは絡まなさそうだ。

NFC Forumのドキュメントを読んでいて出てきたのは、ATR_REQのRCバイトはDEPの場合0x00か0x02ということ。
0x00は、いつものポーリング。
0x01は、システムコード付き。
0x02は、通信速度付き、じゃなかったっけ?
まあ、もともと0x00になっていたから、今回は関係ない。

あと、NFCID2の先頭は「0x01 0xFE」であること。
これも決められていたが、サンプルはそうなっている。

PN533のTgInitAsTargetの説明にはDEPのことも書いてあるが、ATR_REQを受けとったらDEPモードって書いてあるんだよなぁ・・・。
うーん、変にSetParametersをされることによって、RC-S956では動作しなくなってたりするのかしら。

2011/12/11

RC-S956でDEPはできるはず

https://launchpad.net/nfcpy/+announcements
NFC用のPythonモジュールのページ。
ここを見ると、2010/09/21にRC-S330でLLCPできた、とある。

 

http://www.sony.co.jp/Products/felica/business/products/ICS-D101_106.html
http://www.sony.co.jp/Products/felica/business/products/ICS-D101_102_103.html
SONYのSDK for FeliCa(RI)のページ。
真ん中くらいに「RC-S956はRC-S330やRC-S370で使われてます」とある。
(2011/12/17:リンク先修正。ICS-D106が削除?)

 

ということは、RC-S370でもDEPはできる、ということになる。
なるんだが・・・・どうやったものだか。

[libnfc]DEPできてない

libnfcでpollingができたのでlibnfc-llcpでLLCPしようとしていたのだが、それは早まりすぎだ。
まずはlibnfcでDEPだけがちゃんとできることを確認せねば。

[ターゲット側]
$ nfc-dep-target
Connected to NFC device: PN532 (/dev/ttyUSB0) - PN533 v1.48 (0x07)
NFC device will now act as: D.E.P. (undefined baud rate) target:
       NFCID3: 12  34  56  78  9a  bc  de  ff  00  00 
           BS: 00
           BR: 00
           TO: 00
           PP: 01
General Bytes: 12  34  56  78 
Waiting for initiator request...

[イニシエータ側]
$ nfc-dep-initiator
Connected to NFC device: Sony / RC-S370/P - PN533 v1.48 (0x07)
D.E.P. (212 kbps) target:
       NFCID3: 12  34  56  78  9a  bc  de  ff  00  00 
           BS: 00
           BR: 00
           TO: 0e
           PP: 32
General Bytes: 12  34  56  78 
Sending: Hello World!

・・・反応なし。
P906iを近づけるとLEDが光るので、搬送波はちゃんと出ているようだ。
どのレベルでかはわからないが、DEPできていないようだ。


ログをとりながら調べていこうとしたのだが、PCDの自動検索が邪魔をして、2台接続での確認が難しい。
まずは指定したデバイスを使用するようなlibnfcに仕立てる方が先だ。

nfc_connect()の引数がNULLだと検索し、そうでない場合は引数のデータを使って接続するようだ。
引数の型はnfc_device_desc_t。
めんどくさいので、自動検索した結果を利用することにしよう。

acDevice   : PN532 (/dev/ttyUSB0)
pcDriver    : PN532_UART
acPort     : /dev/ttyUSB0
uiSpeed    : 115200
uiBusIndex : 32767

 

acDevice   : Sony / RC-S370/P
pcDriver    : PN53x USB
acPort     :
uiSpeed    : 0
uiBusIndex : 3

UARTの方はいいのだが、USBはuiBusIndexが挿すところによって変わってくるな・・・。
USBだけは探すようにした方がよさそうだ。


ログを見ていくと、targetはTgInitAsTargetを、initiatorはInJumpForDEPをしている。
initiatorはtargetを212KbpsのDEPだ、と認識しているようだ。これは意図通り。
targetはinitiatorを212KbpsのFeliCaだ、と認識しているようだ。これは意図通りではない。

TgInitAsTargetのModeが、どのデータを参照しているのかがわかっていない。
212Kbps、というのは実際に無線通信した結果なのだろう。
では、DEPビットとかFeliCa/MIFAREビットはどうやってみているのか。
FeliCa/MIFAREは、SYNCコードなんかでわかりそうだ。

しかし、NFC-DEPはNFC-AかNFC-Fのフレームとしてやってくる。
だから無線だけではDEPかどうかわからんと思うのだ。
プロトコル解析が必要になってくると思う。
ATR_REQをパラメータとして受け取っているのだが、それだけではだめということか。

InJumpForDEPがどうやってDEPかどうか見分けているかというと・・・戻り値が来たかどうか。
DEPのためのコマンドだから、それがエラーにならず応答したらDEPだ、という考え方のようだ。

どうしてもちらつくのが「RC-S956ではパラメータのフォーマットが違うのでは」という思いだ。
試しに、TgInitAsTargetの戻りがATR_REQだった場合は、無理矢理DEPとみなすようにした。
そしたら、一応終了した。そらそうだな。

うーん、これからどう進めたものか・・・。

LOCAL_DEX_PREOPT := false

NFCのON/OFFをするAppWidgetが作れないだろうか?と思ったので、試している。
EjectSDも動いたんだから、なんとかならんかなぁ。

適当に作ってadb installすると「」というエラーになった。
何かと思ったが、最近ではapkとodexの2つファイルができるらしい。
うーむ。

いろいろ調べたところ、Android.mkに

LOCAL_DEX_PREOPT := false

という行を追加すると、apkだけになるみたいだ。
実際に、なりました。

mmでビルドするときだけかもしれんけど、覚えておいて損はあるまい。


肝心のON/OFFするやつだが、調べると難しいみたいだ。
パーミッションが普通のアプリからは取れないみたい。
NFC以外も巻き込んでいいなら、AirplaneモードにすればOFFになるようだが、それだとなぁ。

Androidの「NFC OFF」がハードレベルなのかソフトレベルなのかは気になるところ。
PN544の仕様は知らないのだけど、だいたい

  • 電源OFF
  • アイドル状態
  • 動作中
  • 無線送受信中

くらいの状態があると思う。
下に行くに従って、消費電力が大きくなる。
NFC OFFにしたときが「電源OFF」なのか「アイドル状態」なのか。
使わんのやけん電源OFFしたらいいやん、と思うかもしれんが、そうするとも限らん。
libnfc-nxpでもそこまでは書いてないようなので、kernel側にあるのだろうか。

まあ、端末を持ってないから追求しないけどね。

2011/12/10

二重署名できるときとできないときの差がわからん

EjectSDというAndroidアプリをマーケットに置いている。
このアプリは、アップするときに二重署名になっている。
二重署名、というのは、すでに署名済みのjarファイルに、別の署名をしたものだ。

Androidでよくある質問に「apkファイルに署名すると『java.util.zip.ZipException: invalid entry compressed size』が出てくる」というものがある。
この回答として一番多いのは「apkファイルが署名済みだからです」というものだ。
しかしよく考えてみよう。
ここでエラーを出しているのはjava.util.zipで、圧縮サイズがうんぬん、という内容だ。
署名がすでにあるからエラーを出しているというわけではない。
結果として同じことなのかもしれないが、気になるではないか。
というのも、二重署名できるということは、署名済みであってもさらに署名ができるということだからだ。
エラーが出る場合と、出ない場合がある。
今のEjectSDは、そんな状況に追い込まれているのだ。
署名が違うと、マーケットにアップするのが大変。
新規のアプリにしないといかんのだ。

まずはこちらのサイト。
http://d.hatena.ne.jp/skirnir/20090220/1235143925
.NETの話ではあるが、エラーの原因はそういうことなのだ。
jarファイルはzipと同じ構造なので、同じことだろう。

こちらは、おそらくExceptionを出す箇所のソースファイル。
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/Collections-Jar-Zip-Logging-regex/java/util/zip/ZipOutputStream.java.htm
真ん中くらいに「invalid entry compressed size」の文字がある。

ああだこうだ考えたが、結局のところjarファイルのヘッダ情報が正しくない、ということだろう。
なら、作り直せばいいじゃないの、ということで、jar xfしてjar cfした。
そしたら、二重証明できるようになった。
ふーん。

[felica]フィーチャーフォンとのFALP受信はあきらめよう

SDK for NFC Starter Kit(長いので、SNSKと略す)でFALP受信をやろうとしている。
送信元は、DoCoMoのP906i。そう、フィーチャーフォンだ。
持ってないから、仕方ない。

そして、うまくいってない。

 

FALPライブラリのログを見ていたのだが、ようやくログの見方がわかってきた。
TgGetInitiatorCommandに対してStatusエラーを返しているようなのだ。
しかし、PN533のドキュメントを見ても該当する番号がない・・・。
FALP独自のエラーなのか?

 

FALPライブラリの使い方が間違えている可能性も考慮しよう。
受信開始はWindowメッセージで取得することになっている。
Windowハンドラは、この順でメッセージを受け取っている。

  1. WM_GETMINMAXINFO
  2. WM_NCCREATE
  3. WM_NCCALCSIZE
  4. WM_CREATE

うん、ウィンドウの生成はできているようだ。
RegisterWindowMessage()も失敗してないし、set_falp_target_callback_parameters()もOK。
falp_listen()もOK。
こっから先は、Windowメッセージが来ない。

 

ログの内容からしても、まだ認証に至っていないので、フィーチャーフォンとのFALPはやはり想定されていない、と考えた方がいいのかもしれない。
あるいは、P906iのFALP実装がSONYさんの想定にないものになっているか・・・というのも考えたが、CTSに通っているからそれはないだろう。

あきらめた。

2011/12/08

SDK for NFC Starter Kit Ver.1.0

今までβ版としてリリースされてきたSDK for NFC Starter Kit。
とうとう正式リリースされた模様です。

http://www.sony.co.jp/Products/felica/business/products/ICS-D004_002_003.html

おめでとうございます。


β2版とざっと比較したところ、AIR関係とドキュメント、ドライバが変更になってた。
細かいところまでは見てないけど、AIR以外のサンプルソースは同じだった。

 

正式版になったので、FeliCaのブログにサンプルソースなんかが出てくると思う。
楽しみですわ。

2011/12/06

android-4.0.1_r1.2もUbuntu11.10でビルドエラーになる

android-4.0.1_r1.2もUbuntu11.10でビルドエラーになる。
なりました。

以上、ご連絡まで。
よろしくお願いいたします(?)。

2011/12/04

[llcp]訳がわからなくなる

libnfc-llcpだが、うまくいってないことはわかった。
しかし、何がだめなのかがよくわからなくなった。


今のところ、PaSoRiとRC-S620/Sを重ねてやっていたのだが、ふと両者を離してからそれぞれllcp-test-serverとllcp-test-clientを立ち上げると、後者を立ち上げたときに前者がエラーになって終わってしまっていた。
これはどうも、libnfcが空いているNFCデバイスを検索しているために起きているみたいだ。
しかし、さっきまでは特に問題なかったような・・・。

cleanなどしてたら、直った。
ような気がしていたが、そうでもないみたいで、タイミングか何かで発生する。
PC1台でやるのは、難しいんかね。


両方のPCDをばらばらに起動できたことを確認してから、重ねるように手順を変更した。
動作結果は同じで、InJumpForDEPでタイムアウトが返ってくる。

前回、ATR_RESを自動返信にしていると書いたが、あれはPN533のドキュメントを参考にした値だ。
RC-S956がどうなのかは、SetParametersの資料がないため、わからん。

うー、SetParametersとかWriteRegister/ReadRegisterの仕様が出てこないかなぁ。
libnfcでは、これらを普通に使っているのだが、PN533と同じ値でいいのかどうかすら判断ができんのだ。

[llcp]InJumpForDEPとATR_REQとSetParameters

NADだ。
以前も、NADとDIDについて考えたことがあったのだが、そこまで深くはなかった。
LLCPをやるにあたって、またその問題を考えねばならぬようだ。

llcp-test-serverでTgInitAsTargetして、llcp-test-clientからinitiatorモードでInJumpForDEPすると、serverは「DEPじゃなくてFeliCaから要求がきた」と判断している。
DEPで接続したいので、このInJumpForDEPを無視して、またTgInitAsTargetしている。
これが、いつまでたってもserverがnfc_target_init()から抜けない理由である。

DEPかどうかをどうやって見ているかというと、ATR_REQのパラメータだ。
InJumpForDEPを投げると、R/WはATR_REQを送信する。
その中に、PPiがあり、bit0が1だとNADを使う、ということになっている。

TgInitAsTargetは戻り値のModeでDEPかどうかがわかる。
bit2が1なら、DEPだ。
このDEPビットが、何を見て立てるのかはわからんかった。
PPiを見てるって感じではなく、無線の設定なんかだろうか。


NFC ForumのDIgitalProtocolを読むと、Initiator側のPPiではNADを0にしろ、と書いてある。
ほほぅ。

また、PN533のドキュメントには、NADバイトはInDataExchangeで指定しなさい、とある。
InDataExchangeを使うと、DEP_REQを送信する。
そのDEP_REQにはNADバイトってのが専用にある。InDataExchangeを使うのはそういうわけだ。

ってことは、ATR_REQのPPiに載っているNAD情報は関係がなく、実際にはDEP_REQに出てくるということか?
それなら、現在の動作も納得できるような気がする。
TgInitAsTargetから抜けないのは、InDataExchangeを待っているから、ということだ。
InDataExchangeでNADバイトが指定されていたとき、libnfcのTgInitAsTargetを抜けてlibnfc-llcpに戻ってくるのだ。

さて、そういう動作をしてくれるだろうか?


うーん、InJumpForDEPがタイムアウトしている。
ってのは、昨日と一緒だな。
InJumpForDEPはATR_REQだから、ATR_RESを待っている。
SetParametersでATR_RESの自動返信ビットを立てているから、タイムアウトしなくても良さそうなものなのだが・・・。

それと、無線が不安定だ。
PaSoRiの上にRC-S620/Sをぺたっと置いているのだが、どうもそれだと反応が悪い。
間に紙を挟んだりすると、よさそうな感じがする。
よいというか、タイムアウトするというだけなのだが。

PaSoRiはType-Bに対応させるため、無線の調整をしたという話を聞いたことがある。
元々DEPを想定したものではないから、問題があるのかも。

RC-S620/Sがもう1枚あればいいのになぁ。
1枚壊したのが、非常に痛い。。。ACKが返ってこないから、致命的だ。
修理したいけど、無理だろう。情報ないし。せめてTPの情報が欲しいところだ。
開けてみたけど、小さい部品ばっかりでわからん。
しかしこんだけ小さいなら、逆電流なんかに弱いかもしれん。
うぅ、ピンの1~6が逆になってただけなのに・・・。

 

InJumpForDEPがタイムアウトしてないこともあった。
しかし、それでもTgInitAsTargetは終わってない。
何だろうねぇ・・・。

[libnfc]TgInitAsTargetはどう動いたらいいものか

llcp-test-serverのログを見ると、TgInitAsTargetを実行後、InitiatorからATR_REQを受け取っているものの、ATR_RESを返していないようだ。
だから、clientはタイムアウトしているのだろう。

私が自分でTgInitAsTargetの動作を実装して、かざしてログインアプリをだましたときには、自前でコマンドに応答するソフトを作っていた。
libnfcではどうやってるのだろう?


では、nfc_target_init()でTgInitAsTargetを実行した後、どうすればいいのかを見ていこう。
libnfcのサンプルであるnfc-emulate-tagを動かして確認しよう。

・・・nfc_target_init()が失敗する。
FeliCaのタグとして動くように変更したのがまずかったか。
見ていったところ、FeliCaの場合にはMifare関連のパラメータを0x00として使っていた。
しかしRC-S956の使用かなんかわからんけど、SENS_RESは0x00 0x04でないと動かん。

適当に書き換えて動くようにし、P906iに入っている「iCタグリーダー」で読んでみる。
・・・対応してないタグということで、アプリがはじいた。
そのせいだと思うが、nfc-emulate-tagには変化なし。
ポーリングの段階ではじいたってことかな。

では、FALPで送りつければ何か送信するだろう。
やってみると、サービスコードの取得を行おうとしているパケットが受信できた。
が、nfc-emulate-tagは「知らんフレームがきた」ということでabort経路になり、終了。
まあ、abort経路がわかればなんとかなるだろう。

 

どうやら、TgInitAsTargetでターゲット状態になったあとは、ポーリングで受信データを確認しにいくようだ。
nfc_target_init()の引数にバッファを与えていて、そこに格納されるみたい。
コールバックじゃないんだ。。。
nfc-emulate-tagでは、target_io()の中で受信データの先頭を見て、何を返すか判断している。
考え方は、同じみたいだ。

[win]assocとftypeだけでは関連づけが取り戻せない?

以前、こんな記事を書いた。
http://hiro99ma.blogspot.com/2011/11/win.html
さっき、QtCreatorをインストールしたのだが、CやらHやらがQtCreatorにとられてしまった。
Qt、おまえもか・・・とは思ったが、それほどあせらない。
assocとftypeで取り戻せばいいからだ。
が・・・取り戻せない。
assocもftypeも、設定したテキストエディタを指しているのだが、肝心なExplorerがQtCreatorを指したままになっている。
ログオフも再起動もやったのだが、変わらず。
assocとftype以外に、何か要素があるのだろうか?
そもそも、QtCreatorがインストールされてExplorerがQtCreatorを指しているときから、assocは変更されていない。
つまり、最初からassocは無視されているのだ。


こちらに、関連づけがどう動作しているのか説明された文書があった。
http://www.glamenv-septzen.net/view/14
.Hファイルを例に見ていこう。
QtCreatorインストール前は、EmEditorに割り当てられていた。
HKLM\SOFTWARE\Classes.hというキーがあり、そこに(既定)として「emeditor.h」が登録されていた。
emeditor.hというキーもあり、(既定)は「Hファイル」になっている。
openもEmEditor.exeになっている。
うーん・・・。
うん?
.hキーの下に「PersistentHandler」というキーがある。
削除するといけるか・・・だめか。
Explorerのフォルダオプションで見ると拡張子Hは「C++ Header file」なのだが、ヘッダファイルを右クリックして開くプロパティから見ると「Hファイル」になっている。
emeditor.hは「Hファイル」なのでプロパティとは一致しているのだが、フォルダオプションとは違っている。
他のも見てみると、H++なんて拡張子もQtCreatorに関連づけられているのだが、Classes以下にはそんなキーはない。
つまり、キーがなくても関連づけをできる仕組みがあるということだ。


おっと、上のリンク先の続きを見ると、auto_fileというしくみもあるようだ。
これは自動で関連づけするものらしい。 レジストリエディタで検索をすると、HKEY_LOCAL_MACHINEの下ではなく、HKEY_USERS\(ユーザID)\Software\Classesの下にあった。
なるほど、こちらが優先されるのか・・・。
HKEY_CLASSES_ROOTを見ると、確かにそうなっている。
assocやftypeはこっちを操作してくれないってことですかね。
試しに、HKEY_CLASSES_ROOT\.hを削除してみた。
フォルダオプションはEmEditorに戻った。
Hファイルのプロパティはまだqtcreatorになっているが、ダブルクリックするとEmEditorが起動した。
再起動すれば直るんだろう。
auto_fileキーのみを削除してみたが、これだと関連づけがなくなってしまうだけだった。
やはりHKEY_CLASSES_ROOTから拡張子のキーを削除してやらんといかんらしい。
しかし、それはそれで危険だなぁ。
HKEY_USERS\(ユーザID)\Software\Classesの下にある方を削除すれば、少なくともassocなどの設定が削除されることはないんだろうけど、すっきりしない。

というところまで調べてネットで検索すると、同じことをやってる人がいた。
まあ、そうだよねぇ。。。
EmEditorでも関連づけができるのでやってみると、HKEY_USERS\(ユーザID)以下にある方を書き換えていた。
ユーザごとに拡張子の関連づけを変更するんだったら、それしかないというところか。
しかし、それを設定する方法が標準で提供されていないのがつらいところだ。
ならば作るまでよ!
というわけで、あれこれ迷いながら作成。
assocなどは使えないので、レジストリのインポート用ファイルを作ることにした。
UTF-16LEで保存する方法がわからなかったので、こちらからいただきました。ありがとうございます。
VBScriptでまとめてしまえばいいんだろうけど、もういいや。
使いたい方は、batファイルの中身を必ず書き換えてから使ってください。
動かんごとなっても、責任はとらんのであしからず。
デフォルトだと、うちの拡張子割り当てになるし、デフォルトのインストールパスなわけでもないので動かんでしょう。
また、そのままだとreg.regというファイルを作るだけなので、自分でレジストリに登録してください。
めんどうなら、自動でそこまでやってもいいんでないですかね。
https://sites.google.com/site/hiro99ma/home/windows/%E6%8B%A1%E5%BC%B5%E5%AD%90.zip?attredirects=0&d=1



うーん、新規作成にテキストファイルが出てこなくなった・・・。
Tweakなどで追加しても出てこない。
まずいなぁ。
まずいかも。

2011/12/03

[llcp]toolsのserverとclientを動かすが、うまくいかん

うまくいかんシリーズです。

前回、clientはInJumpForDepを実行して、ACKは返ってくるのだが失敗が返ってきた。
それは、相手がいないからだ。
ではserverをtargetにしてやればいいはず。

コンソールを2つ立ち上げ、

$ tools/llcp-test-server/llcp-test-server --mode=target

$ tools/llcp-test-client/llcp-test-client --mode=initiator -t1

それぞれ実行。

ログは長いので載せないが、serverは生きたままなのだがclientはやはりエラー終了になる。
やはり、InJumpForDEPで失敗になる。
PN533のドキュメントによると、エラー理由は「Timeout」。
コンソールにも、タイムアウトしたことが出力されている。
しかし、InJumpForDEPの引数にタイムアウト時間があるわけではない。
それに、受信しそうなターゲットをかざさない限りタイムアウトもせずに待っている。
だからこのタイムアウトは、RFプロトコルをやりとりし始めてからのタイムアウトなのだ。

なんだろうねぇ。

[llcp]llcp_test_client

nfc-tools/libnfc-llcp/toolsの下に、llcp_test_clientというものがある。
READMEを見ると、テスト用っぽい。

何が動くのかわからんが、やってみよう。


$ tools/llcp-test-client/llcp-test-client -T
Available tests:
  1 - Link activation, symmetry and desactivation
  2 - Connectionless information transfer
  3 - Connected information transfer
  4 - Connected information transfer (using SN)

$ tools/llcp-test-client/llcp-test-client -t1
[stderr] 20111203 01:24:03.810 ALERT    libnfc-llcp.mac.link- mac_link_activate() will behave inconsistently
[stderr] 20111203 01:24:03.810 INFO     libnfc-llcp.mac.link- (Sony / RC-S370/P - PN533 v1.48 (0x07)) Attempting to activate LLCP Link as initiator
[stderr] 20111203 01:24:03.834 DEBUG    libnfc-llcp.mac.link- (Sony / RC-S370/P - PN533 v1.48 (0x07)) nfc_initiator_init() succeeded
[stderr] 20111203 01:24:04.185 INFO     libnfc-llcp.mac.link- (Sony / RC-S370/P - PN533 v1.48 (0x07)) nfc_initiator_select_dep_target() failed
REASON: Timeout
lt-llcp-test-client: Cannot activate link


最初のALERTは、動作モードがinitiatorなのかtargetなのかを指定していないので出ている。
その場合、initiatorで初期化してみて、だめだったらtargetで初期化している。
ここではinitiatorでの初期化に成功したので「as initiator」となっている。
<訂正>
違った。
initiatorで初期化して失敗したらエラーを返す。
成功したらtargetで初期化して、失敗したらエラーを返す。
成功したら、エラーを返す。
って、エラーにしかならんやん。。。
なんか意図が違っているように思えるので、ソースを変更した。
コマンドの引数で、--mode=initiator、みたいにするのが正しいのだろうな。

 

次に失敗しているのは、携帯電話を載せたからだ。
initiatorなのでPoll Modeになって無線を出し始めているのだが、それにはInJumpForDEPを使っている。
携帯電話を載せると、その応答コードとして0x01が返ってくるので、エラーにして終了しているのだ。

という部分は、このログを見ただけではわからない。
libnfcのログまで出さなくては。


このテストプログラムはちょっと今ひとつで、

  • UTF-8に一部なってる
  • setUpとtearDownがない(うまく動いてない?)ので、途中で失敗すると搬送波が出っぱなしになる

などがある。
まあ、テストだからねえ。

とはいえ、搬送波を出しっぱなしというのも困るので、修正。
これは、libnfcのpn53x_idle()に手を加えた。
InReleaseなどに失敗してもエラー終了させず、とにかく一連の流れを終わらせるようにしたのだ。
これは自作のドライバでも迷ったところであるが、アイドル状態にどうしても戻したいのであればエラーを無視するしかないと思う。

[nfc]PollとListen

NFC Forumのドキュメントを読むと、「Poll Mode」と「Listen Mode」がよく出てくる。
「Initiator」と「Target」も出てくる。

Poll Modeは、RFを出して他のデバイスをポーリングするデバイスの初期モード。
Listen Modeは、RFを出さずに他のデバイスのRFを受け取るデバイスの初期モード。

と書かれているように読んだ。
気になるのは「初期モード(initial mode)」という言葉だ。
たとえばPICCなんかは自分でRFを出せないので、常にListen Modeになる。
では、DEPみたいにお互いが出し合うようなものはどうなんだろう?

その疑問に、InitiatorとTargetが拍車をかける。

Initiatorは、Poll Modeになったデバイスの役割。
Targetは、Listen Modeになったデバイスの役割。

と書かれているように読んだ。
"reached"ってあるが、これはコマンドとかいろいろ使ってそのモードになった、という意味でとらえたのだ。
で、英文に「Activities」という言葉が出ている。
ACTIVITYドキュメントに書かれているようなので、読まんといかんのか・・・。


Listen Modeが聞く方のRFを「Remote Field」、Poll Modeが出す方のRFを「Operating Field」としている。

Listen ModeとPoll Modeにはそれぞれステートがある。
ドキュメントは、その辺が細かく説明してある。

ということは、そんなに深く知らなくてもよさそうだ。
DEPで、毎回送信する人がInitiatorになるのかどうかを気にしていたのだが、どうでもよくなったので、それもいいや。

[tool]mscgen

シーケンス図を、文字列から生成することができるツール、mscgen。
ルールに従ったテキストファイルを作成し、mscgenを実行すると、pngなりなんなりのファイルにしてくれる。
libnfc-llcp/docにはmscファイルがあったので、mscgenをapt-getでインストールして実行すると、シーケンスを作ってくれた。
他に、ドキュメントは作ってくれなさそうなのよねぇ。
dotファイルがあるのだが、これが何のツールに対応しているのか知らんのが残念だ。
と思って調べると、dotはgraphvizだった。
doxygenの準備はしているけど、まだ整っていないというところか。
ソースを見たけど、コメントがほとんどないのよね・・・。
関数の説明もないので、なんだかわからんな。
そして、staticな関数が1つもない!
うーん、これを仕立てるのは厳しいなぁ。。。。

[無駄話]マクロをdo-whileで囲むか否か

続けて無駄話だ。
今、仕事でマクロをばしばし使っている。
inline関数はないし、関数呼び出しするといろいろとオーバーヘッドがかさむからだ。
直に書いてもいいけど、メンテナンスを考えるとマクロでやるか、という状況だと思っておくれ。

さて、関数マクロの場合、私はdo-whileで囲むことが多い。
#define MACRO_FUNC(x,y) \
do { \
 y = (x) * (x); \
} while(0)
習慣みたいなものだが、静的解析ツールにかけると「while内が固定なので変だ」みたいな警告が出てくる。
うーん、この書き方は市民権を得ていないのか・・・。
do-whileなしでも、括弧だけで十分という気もする。
薄れた記憶からすると、括弧だけでは対処できないパターンがあるのでこの文法が使われていたと思う。
なんだっけ・・・。最適化が絡んでいたような。
Google検索
ああ、if文で途切れるのね。
if(xxx)
 MACRO_FUNC(x,y);
else
 //to do
で、MACRO_FUNCが{}だけだと、
if(xxx)
 {
  y = x * x;
 };
else
 //to do
となり、
if(xxx) {
 y = x * x;
}
;
else
 // to do
となってしまい、elseが浮いてしまうのだ。
でもまあ、コーディング規約で「必ず括弧で囲め」とやってるから、別にいいんだけどね。
コンパイルエラーになるから、動作がおかしい、ということにはならないし。

[無駄話]ハードTABは4か8か

ハードTAB、文字コード0x09。
私はソースを書くとき、インデントをTABキーを使って入れる。
うちのテキストエディタは、TABキーはそのまま0x09が入るようにしている。
その設定は、ソースコードは4文字、それ以外は8文字にしている。

Linuxの場合、2文字インデントが結構多い。
2文字インデントが4つになると、ハードTABになってたりするので、テキストエディタで見るとインデントが崩れてしまう。
まあ、設定を変更すればいいんだけど、どういう設定の人が多いのかは気になる。
私の予想では、こんな感じではなかろうか。
  • ハードTABは4文字で、インデントはハードTABのみ
  • ハードTABは8文字で、インデントはハードTABのみ
  • ハードTABは8文字で、インデントは4文字。2インデントでハードTAB1つ。
  • ハードTABは8文字で、インデントは2文字。4インデントでハードTAB1つ。
  • ハードTABは使わず、インデントはスペースのみ。
つまりまあ、スペース文字を混在させるか否か、というところだ。
「この設定はだめだ」みたいな狭量なことをいうつもりはないのだが、バラバラなのも困るような気がする。
気がするのだが、何十年もこんな状況が続いているのだから、そんなに困ってないのかも。

困るというか気になるのは、自動的にインデントを設定してくれるエディタだ。
親切なのはいいんだけど、なんでこの位置なんだろう?と疑問に思うことがしばしばあるのだ。
長いものに巻かれるってわけでもないが、人に不審な思いはさせたくないので、一般ルールがあるならあわせてもよいと思っている。
ありがちなのは、ifの条件文中で改行したい場合。
私は4文字インデントなので、こういう場合は2文字のインデントにして区別するようにしている。
    if(aaa && bbb && ccc
      && ddd && eee && fff) {
        // todo ......
    }
あとは、引数の途中で改行したい場合。
このときは、ばさっとずらす。
 function(aaa, bbb, ccc,
    ddd, eee, fff);
まあ、何が正しいってのはない世界だけど、自分ルールを持っていないと困るからねぇ。
自分ルールがあると、仕事でコーディング規約を与えられたときに反発してしまうという弊害があるが、そこはご愛敬だ。

2011/12/01

[felica]Suica/PASMOのFeliCaポケット解禁

FeliCaポケット機能が、SuicaやPASMOで使えるようになるらしい。

http://www.sony.co.jp/SonyInfo/News/Press/201111/11-151/

 

もともと搭載していた機能を、12月から使用許可したということらしい。
FeliCaポケットというのは、たとえば1枚のSuicaカードで、買い物のポイントや行政サービスや切符の購入などができるようにすることなのだが、これは「Suicaの情報を他のサービスにも使えるようにする」ではなく「Suicaで使っていない領域を他のサービスにも使えるようにするから勝手にやって」というものだと思われる。

まあ、勝手にやって、といっても誰かが管理するんだけど。

 

FeliCaポケット自体は少し前、いやかなり前からある機能だ。
Suica/PASMOにそれがあることすら知らんかったし、公表されてなかったんじゃないかと思う。
サービスを始めたわりには、宣伝も特にしてなかったし、採用されたものも知られてないと思う。
(私が知らんだけか?)

 

最初にガツンと宣伝しないとダメなのでは・・・と思ったけど、そうでもないかも。
当時にこれを大々的に宣伝したって、何に使うの?、みたいな感じで流されてしまい、印象が悪くなってたかも。
今なら、NFCってのが以前よりも市民権を得てきたので、やってもいいかも、と思う業者があるのかな。
いっそのこと「新サービス FeliCaポケット!」って言い張ってもいいのかも。

 

このサービスはセキュアなことが売りなので、NFC Forumで公開されている情報ではアクセスできないはず。
セキュアってなった途端、FeliCaは日本+αローカルになってしまうのがつらいところだ。

2011/11/30

[llcp]cygwinでlibnfc-llcpはビルドできるだろうか (1)

普段、Windows XPを使っている。
週末やビルドの時にはLinuxを立ち上げ直しているのだが、Windowsでもビルドできるとよい。
libnfcはやったので、libnfc-llcpをやってみよう。

いつも1回でうまく行くことはないので、(1)とつけた。


cygwinでやる。
だめだったら、Mingw64でやろう。

./configureすると、libtoolがない、といわれた。
cygwin.exeを使ってインストール。

./configureすると、shtoolがない、みたいなことをいわれた。
cygwin.exeには、出てこない。
検索すると、どうも何かやってやればいいものらしい、という気持ちになった。

 

$ libtoolize --force
libtoolize: putting auxiliary files in `.'.
libtoolize: linking file `./ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIR, `m4'.
libtoolize: linking file `m4/libtool.m4'
libtoolize: linking file `m4/ltoptions.m4'
libtoolize: linking file `m4/ltsugar.m4'
libtoolize: linking file `m4/ltversion.m4'
libtoolize: linking file `m4/lt~obsolete.m4'
$ aclocal
$ autoheader
$ automake --force-missing --add-missing
configure.ac:8: installing `./config.guess'
configure.ac:8: installing `./config.sub'
configure.ac:14: installing `./install-sh'
configure.ac:14: installing `./missing'
examples/nexus-get-tag/Makefile.am: installing `./depcomp'
Makefile.am: installing `./INSTALL'
$ autoconf
$ ./configure

お、通った。
しかし、makeするとlibnfcがないといわれた。
そうか・・・そういえばlibnfcはMingw64でビルドしたんだった・・・。

ためしにlibnfcをcygwinでビルドさせたが、uart_posixあたりでエラーになった。
タイトルにはcygwinって書いてしまったしなぁ。
Mingw64でlibnfc-llcpのビルドが通るなら、もういいや。

./conftest.exe

あー、これでエラーになるか。
ここは避けられんので、cygwinでもう少しがんばるか。
まあ、今週だけだと思うけどね。

2011/11/26

[libnfc]pn53x_TgInitAsTarget

LLCPがうまくいかんのだが、ログを見ていくとTgInitAsTargetのGeneralByteあたりがPN533のドキュメントと違う。
バグにしてはみんな問題なさそうなのだが・・・。

関数はpn53x_TgInitAsTarget()。
見ると、PN531 or RCS360の場合にはLEN Gtを書き込まずにGt[]のみ、それ以外はLEN GtとG[]というようになっていた。
ログからすると、RC-S620/SはRCS360扱いされているようだ。
うむ、実装通りだ。


さて、RC-S620/SのTgInitAsTarget。
コマンドの仕様が手元にない。
うーむ。

では、libnfcがどうやってRCS360と判定しているか見ておこう。
これはVID/PIDで見ているのかと思ったらそういうわけでもなく、GetFirmwareVersionコマンドの戻り値を使っている。
ICが0x33でVerが0x01だと、RCS360で、Verがそれ以外だとPN533になっている。
Revまで見ないといかんのかもしれんが、いかんせん情報がない。
うーむ。

では、とPN533形式にあわせたけどだめ。
他の要素か?と思っていろいろ変更していくと、結果としてはSENS_RESの値が問題だった。
どうも、RC-S620/Sで受け取ることができる値が決まっているようだ。


しかし、だ。

RC-S360もRC-S370もRC-S620/Sも、RC-S956を使っているとSONYのページには書かれている。
そう考えると、LEN Gtのようなプロトコルのレベルで書き方が違うってのは考えにくいなあ。
こればっかりは、General Byteを使うような通信をしてみないとわからない。
けど、ここはPN533とRC-S956で違う仕様なのだと考えた方が自然な気がする。

そんなわけで、今回はpn53x_target_init()のところで、RCS360な0x0004を設定するだけにしておこう。

      // Set ATQA (SENS_RES)
      if(CHIP_DATA(pnd)->type == RCS360) {
        //ueno add
        abtMifareParams[0] = 0x00;
        abtMifareParams[1] = 0x04;
      } else {
        abtMifareParams[0] = 0x08;
        abtMifareParams[1] = 0x00;
      }

mayu-linux

Linux版の窓使いの憂鬱。
infoseekのサイトにあったけど、移動したのか別の人が管理するようになったのか別の場所になっていた。
ありがたく使わせていただく。

FirefoxにWOTを入れていると「信頼性が低い」といわれたので、リンク先に飛ぶかどうかは自己判断で。

http://www42.tok2.com/home/negidakude/

aguse.jpでの調査結果からすると、別に悪くはなさそうだけど、どういう基準なのかなぁ。
http://www.aguse.jp/?m=w&url=http%3A%2F%2Fwww42.tok2.com%2Fhome%2Fnegidakude%2F&x=0&y=0

2011/11/25

[libnfc]log4cの出力はlog4crcがあればいいというものでもない

libnfc-llcpのログがでらんといっていたが、出るようになった。
libnfc/trunkにあったlog4crcファイルを~/.log4crcとしてコピーすると何とかなるんだろうと思っていたが、そういうものではないらしい。

libnfc-llcp/test/log4crcを使うとうまくいった。
そうか、このファイルは出力フォーマットだけでなく、出すログも選択できるのか。

$ tools/llcp-test-server/llcp-test-server --mode=target
[stderr] 20111124 15:28:28.754 TRACE    libnfc-llcp.llc.link- service 0x15560f0 bound to SAP 1
[stderr] 20111124 15:28:28.754 TRACE    libnfc-llcp.llc.link- service 0x1556480 bound to SAP 16
[stderr] 20111124 15:28:28.754 TRACE    libnfc-llcp.llc.link- service 0x1559f90 bound to SAP 17
[stderr] 20111124 15:28:28.754 INFO     libnfc-llcp.mac.link- (Sony / RC-S370/P - PN533 v1.48 (0x07)) Attempting to activate LLCP Link as target (blocking)
[stderr] 20111124 15:28:28.780 ERROR    libnfc-llcp.mac.link- Cannot establish LLCP Link
lt-llcp-test-server: Cannot activate link

できれば、libnfcのログも一緒に出したいなあ。

log4c4のファイルを見比べると、最後の方にあるcategoryというタグが違った。
libnfcのものは「name="libnfc"」、libnfc-llcpのものは「name="libnfc-llcp"」。
じゃあ、両方書けばログが出るんじゃないか?

あたーりー。

2011/11/24

ポーリング間隔

Android携帯電話の消費電力計測をしているところがあった。
http://bs-power-save-project.blogspot.com/2011/11/nfconoff.html

電話用のポーリングは2.5秒間隔、NFCのポーリングは0.4秒間隔、ということになるだろうか。
電話用なのかメールみたいなものなのかはわからんがね。

2011/11/23

[libnfc]LLCP側のデバッグログが出てこん

nfc-toolsのlibnfc-llcpを試しているのだが、うまくいかん。
とりあえずログを出したい。

いろいろと参考にしながら、まずはlibnfcのデバッグ出力を。
の前に、log4cのインストール。

$ sudo apt-get install liblog4c-dev

libnfcのデバッグ出力

$ ./configure --with-drivers='pn532_uart,pn53x_usb' --enable-serial-autoprobe --enable-debug
$ make clean all
$ sudo make install

libnfc-llcpの方も同じく

$ ./configure --enable-debug

log4crc(CRC、ではなく、log4cのRC)を準備。
libnfcのtrunkに入っているものを使う。

$ cp log4crc ~/.log4crc

この設定でいけると思ったのだが・・・。

[stdout] ERROR    libnfc.driver.pn53x_usb - Application level error detected

こんな感じで、libnfcの方しか出てこん。
config.hを見ても、LOG4Cは有効になってるんだけどなあ。

[libnfc]libnfcとRC-S620/S

LLCPの動作確認をするには、R/Wが2つないとだめだ。
うちにあるのは、パソリとRC-S620/S。
ならば、RC-S620/Sをlibnfcから使うことができるならばよかろう。

使うのは、RC-S620/SとUSB-シリアル変換(CP2102)を接続したもので、Linuxでは/dev/ttyUSB0として認識されている。


幸い、libnfcには「pn532_uart」というシリアル向けのドライバが入っている。
RC-S956もPN532も似たようなもんじゃないだろうか?

$ ./configure --with-drivers='pn532_uart,pn53x_usb' --enable-serial-autoprobe
$ make clean all
$ sudo make install
$ utils/nfc-list
utils/.libs/lt-nfc-list uses libnfc 1.5.1 (r1182M)
No NFC device found.

うーむ。


こちらを参考にデバッグ。
http://code.google.com/p/libnfc/issues/detail?id=176

$ ./configure --with-drivers='pn532_uart,pn53x_usb' --enable-serial-autoprobe --enable-debug
$ make clean all
$ sudo make install
$ utils/nfc-list
utils/.libs/lt-nfc-list uses libnfc 1.5.1 (r1182M)
libnfc.general - 0 device(s) found using PN53x USB driver
libnfc.driver.pn532_uart - Trying to find PN532 device on serial port: /dev/ttyUSB0 at 115200 bauds.
libnfc.bus.uart - Serial port speed requested to be set to 115200 bauds.
libnfc.chip.pn53x - Diagnose
libnfc.chip.pn53x - Timeout values: 1 s, 0 us
libnfc.bus.uart - TX: 55  55  00  00  00 
libnfc.chip.pn53x - SAMConfiguration
libnfc.chip.pn53x - Timeout values: 1 s, 0 us
libnfc.bus.uart - TX: 00  00  ff  03  fd  d4  14  01  17  00 
libnfc.bus.uart - RX: 00  00  ff  00  ff  00 
libnfc.chip.pn53x - PN53x ACKed
libnfc.bus.uart - RX: 00  00  ff  02  fe 
libnfc.bus.uart - RX: d5  15 
libnfc.bus.uart - RX: 16  00 
libnfc.chip.pn53x - Last command status: Success
libnfc.bus.uart - TX: 00  00  ff  09  f7  d4  00  00  6c  69  62  6e  66  63  be  00 
libnfc.bus.uart - RX: 00  00  ff  00  ff  00 
libnfc.chip.pn53x - PN53x ACKed
libnfc.bus.uart - RX: 00  00  ff  08  f8 
libnfc.bus.uart - RX: d5  01 
libnfc.bus.uart - RX: 6c  69  62  6e  66  63 
libnfc.bus.uart - RX: bc  00 
libnfc.chip.pn53x - Last command status: Success
pn53x_check_communication:
Success
(中略)
libnfc.general - 0 device(s) found using PN532_UART driver
No NFC device found.

いやいや、待ってくれ!
成功しとうやん。
なぜなんだ・・・。


ログを追加してわかったのは、最後に

pn53x_check_communication: Success

といってるけど、これはエラールートを通っているのだ。
Successにだまされてはいけない。

pn53x_check_communication()の中でDiagnoseコマンドを発行しているのだが、期待値が異なるようだ。
先頭の1byteが返ってこないのか何なのかわからんが、そうなっている。

ここでようやく、PN533のドキュメントを読む。
Diagnoseコマンドは、ペイロードの1byte目が診断コード、それ以降がデータ部になっている。
ここでは診断コード0x00で、データ部として「libnfc」を送信している。
その戻り値は、PN533では「診断コード+データ部」ということで、エコーバックみたいな形で戻ってくる。
RC-S956で同じことをすると、診断コードは戻ってこずにデータ部だけが返っている。
まあ、そういう仕様ってことだろうな。

期待値の先頭を削ることで、認識するようになった。


パソリと同じように、nfc-pollでMifare 1Kのカードを見てみる。

examples/.libs/lt-nfc-poll uses libnfc 1.5.1 (r1182M)
fail: pn53x_check_communication: Input/output error
Connected to NFC reader: PN532 (/dev/ttyUSB0) - PN533 v1.48 (0x07)
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04 
       UID (NFCID1): 3d  c5  73  b0 
      SAK (SEL_RES): 08 

エラーが出てるのは、PCのttyS0か何かだろう。
シリアルを自動認識させようとしてるからよくないな。
固定でもかまわないのだが、どうやって指定するのだろうか?

ソースを見ていった限り、pn532_uartでは指定できなさそうだ。
autoprobeを無効にして、環境変数からとってくるような仕組みにすればいいんだけど、まあいいや。

[libnfc]svn版のlibnfcはconfigureがなかった

最新版のlibnfcは、svnからとってくるようだ
最新版というか、開発版というか。

とってくると、configureがなかった。
make_release.shというスクリプトがあったので、実行。
・・ACR122のビルドができんと怒られた。
これは、別のライブラリを使っているからのようだが、私にはいらんのでmake_release.shのconfigureに--with-driversを指定。
今度はdoxygenがない、と。
ドキュメントは一応作っておきたいのでapt-get install。

そうするとビルドまで済んで完了。
rootでビルドしてないからinstallはされてなさそうなので、make installを実行。
・・・したが、installがなくなっている。
libnfc-1.5.1.tar.gzができたところからすると、このスクリプトはファイル名通り、リリースするためのファイルを作るためのものってことらしい。

 

そしてよくあるように、答は最後にわかった。
http://code.google.com/p/libnfc/

教訓。
リリース元のサイトも先に確認しましょう。

[nfc]nfc-toolsをビルドしてみよう

libnfc用にnfc-toolsというものがある。
この中にlibnfc-llcpという名前があるので、これはきっとLLCPを実現してくれるのだろう。
ビルドしてみた。

環境は、Ubuntu 11.10 (64bit)だ。


$ ./configure

特に何もない。

$ make
libtool: Version mismatch error.  This is libtool 2.4 Debian-2.4-2ubuntu1, but the
libtool: definition of this LT_INIT comes from libtool 2.2.6b.
libtool: You should recreate aclocal.m4 with macros from libtool 2.4 Debian-2.4-2ubuntu1
libtool: and run autoconf again.

インストールされているlibtoolは2.4-2ubuntu1だけど、定義が2.2.6bのものだ。
だからaclocal.m4を2.4-2ubuntu1のマクロで作り直してautoconfしなおせ、ということか。

さて・・・aclocal.m4を作り直す、というのは何すりゃいいんだろう?
http://www.fireproject.jp/feature/automake/basic/autotools.html
aclocal.m4は、configure.inを入力としてaclocalコマンドで生成されるようだ。
では、

$ aclocal
$ autoconf
$ ./configure
$ make

なんかできたみたい。

$ sudo make install

とりあえずインストールしておこう。
以下がコピーされたようだ。

libnfc-llcp.la
libnfc-llcp.so.0.0.0
libnfc-llcp.lai
libnfc-llcp.a


さて・・・何ができたのだろうか。

examples/nexus-get-tag/nexus-get-tag
tools/llcp-pdu-explain/llcp-pdu-explain
tools/llcp-test-client/llcp-test-client
tools/llcp-test-server/llcp-test-server

たぶん、こんなところだろう。
それっぽい名前の、nexus-get-tagを実行。

$ ./nexus-get/tag -o xxx
lt-nexus-get-tag: No NFC device found

ソースを見ると、libnfcを使ったデバイス検出に失敗しているようだ。
いまさら、libnfcはWindowsでしか試していなかったことに気づく。


libnfcをビルド。
ドライバは、pn53x_usbのみにしておこう。

$ ./configure --with-drivers='pn53x_usb'
$ make
$ sudo make install

$ cd examples
$ cd ./nfc-poll
libnfc-1.5.1/examples/.libs/lt-nfc-poll uses libnfc 1.5.1 (r1175)
No NFC device found.

すでにだめだったんだ。
そういえば、LinuxでUSBを使うときにはrulesファイルが必要だったと思う。
pn53x.rulesというファイルがあるから、これを使うと良さそうだ。

$ sudo cp pn53x.rules /etc/udev/rules.d/60-pn53x.rules
$ sudo service udev restart

パソリを挿し直して

$ ./nfc-poll
libnfc-1.5.1/examples/.libs/lt-nfc-poll uses libnfc 1.5.1 (r1175)
Connected to NFC reader: Sony / RC-S370/P - PN533 v1.48 (0x07)
NFC device will poll during 30000 ms (20 pollings of 300 ms for 5 modulations)
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04 
       UID (NFCID1): 3d  c5  73  b0 
      SAK (SEL_RES): 08 

やれやれ。
ちなみにこのときは、パソリの上にMifare 1Kのカードを置いている。


では、改めて。

$ ./nexus-get-tag  -o xxxx
lt-nexus-get-tag: Cannot activate MAC link

相手がいないってことですかね。
では、待ち受けるサーバだったらいいだろう。

$ ./llcp-test-server

待ち状態になった。
P906iを近づけると・・・

REASON: Timeout
lt-llcp-test-server: Cannot activate link

と出て、搬送波が出っぱなしになりながらもアプリ終了。。。
もう一度実行すると、固まってkillせんといかんかった。
パソリを挿しなおさないと、もう復活できなかった。

 

まあ、何か動いてるってことはわかったので、いいや。
ここらへんで、NexusSとやりとりできてるってこともわかった。
http://www.libnfc.org/community/topic/444/solved-nfcdepinitiator-against-a-nexus-s/

試すことはできんが、うまくやればAndroid Beamができるんじゃなかろうか。
問題は「試すことはできん」というところなんだけどね・・・。

2011/11/22

Expresspay test

ネットワークオペレータ(日本で言うキャリア)のソフトバンクと、セゾンカードのクレジットセゾン、アメリカン・エキスプレスは、大日本印刷とGemaltoが提供するNFC技術を用いて、SIMベースのNFCペイメントをAndroid携帯で試すそうだ。

 

でいいのかな?

http://www.nfcworld.com/2011/11/21/311410/japan-gets-nfc-expresspay-test/#utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+nfcw+%28NFC+World%29

 

3ヶ月は、アメリカン・エキスプレスのExpresspayサービスを試すみたい。

 

SIMベースのNFCって、SIMにSEが載っているだけでなく、NFCチップ自体が載ってるの?
チップはまだしも、アンテナは載らないような気がするから、やはりSEだけなのかしら。
だとしたら、NFCチップとアンテナは本体になくてはならないので、専用の端末を作るのだろうか。
あるいは海外から入手して手を入れるだけだろうか。
テストするっていうくらいだから、数は少ないだろうけどそこそこの数も必要だろうから、入手する方向かな。
んで、それをテスターの人に配って使ってもらう、とかだろうか。

2011/11/21

[felica]うまくいってないけど、ソースを載せよう

ホークスおめでとう!
というわけで(?)、うまくいっていないけどFALP受信ソースを載せておく。
https://sites.google.com/site/hiro99ma/home/windows/FalpRecv.cpp?attredirects=0&d=1

Windowsでの作り方がよくわからんので、そこで間違ってるのかも。
FALPライブラリ側も送受信のためにスレッドを立ち上げるので、アプリ側とメッセージをやりとりするための番号が必要になる。
そのために、RegisterWindowMessage(文字列)を使う。
まず、お互いで文字列を決める。
今回で言えば、アプリ側で文字列を決め、set_falp_target_callback_parameters()でライブラリに文字列を渡す。
そしてお互いがRegisterWindowMessage()に同じ文字列で登録すると、やりとりするための番号が決まる。
これが同じ番号になるのか、別の番号がプロセスごとに割り当てられてOSがなんかうまいこと変換するのかは知らないけどね。
同じ数字になるなら、アプリ側が番号を決めて数字だけを渡せばいいと思うんだけど、何かあるのかな?

2011/11/20

NFCフォルダのファイル

packages/apps/Nfc以下にあるソースに、FireflyRenderThread.javaってのがある。
蛍のことらしいが、NFCとは直接関係なさそうだ。
使っているのは、SendUI.java。
FireflyRenderThreadもSendUIも、NFC関係のものをimportしていないので、UIなのだろう。

こんな感じで、NFCフォルダにあるものすべてがNFCのことをやっているわけではない。


フォルダも増えている(いつと比較してなのか忘れたけど)。

ndefpushは、前からあった。
snepができている。
そして、nxpがある。

nxp ?
これは、Nativeなんちゃらってファイルをまとめたフォルダみたいだ。
ってことは、NXPのチップから変更するなら、ここのnxpとjni、external/libnfc-nxpなんかを置き換えればいいってことかな。


libnfc-nxpはちょっと巨大だな・・・。
最近見ているlibnfcと関係あるかと思ったが、ファイル名からするとまったく関係ない。
まあ、Linuxでのライブラリルールだと普通の名前だからなぁ。
ファイルヘッダなんかを見ると、libnfc-nxpはNXPがじきじきに作っているみたいだ。
http://www.nfc.cc/technology/nxp-fri

時代としては、ハードを広く採用してもらうためにソフトを無料で出す、ということなのだろうか。
最近「フリー」って本を読んだので、そんなことを考えてしまう。
Linuxのカーネルにもドライバが組み込まれたので、NXPの戦略は当たったのだろう。
SONYの次世代チップも、そういった広がりを見せてほしいなあ。

[nfc]Android Beamって何だろう?

android-4.0.1_r1ソースもあることだし、Android Beamのことを調べてみよう。
といっても、何から始めてよいものやら。


まず、どういう動きをするものなのかネットで調べよう。

http://itpro.nikkeibp.co.jp/article/COLUMN/20111115/374500/

動画で説明されていた。
送信側でブラウザを、受信側はホーム画面を表示させておく。
そして向かい合わせると、送信側にダイアログが表示されている。
よく見えないのだが、それをタッチすると受信側にもブラウザが表示されていた。

  • 送信側は常時ポーリングするなどして受信側を検知?
    受信側がホーム画面でのみポーリングし、検知したら送信側に通知?
  • 受信側は、無条件で受けとっている。

とにかく、送信側のダイアログを表示するトリガを探せばよさそうだ。


packages/apps/Nfc/src/com/android/nfc/SendUi.javaってのがいかにもそれっぽい名前なのだが、どうなのだろう。
とにかく、スクリーンショットを撮っているってのが気になる。
以前はDDMS経由でしかできなかったと思うが、APIが追加されたのかな?

 

ここのフォルダには、snepとndefpushがある。
それらを見るより前に、NfcService.javaを眺めておこう。
・・・NFC-EEとかNFC-Cとか、よくわからん単語が出てくるな。
NFC-EEは、NFC Execution Environmentのことらしい
frameworks/base/nfc-extras/java/com/android/nfc_extrasにもそういうファイルがあるな。

しかし、ダイアログっぽいものがよくわからん。
もう少し詳細がわかれば・・・。


YouTubeとかにも動画があった。
どうもダイアログと言うよりも、スクリーンショットを撮って縮小された画像が画面の真ん中に出てきて、背景では星っぽいものが迫っているようなアニメーションになっているようだ。

これはさっきのSendUI.javaでやってそうではないか。

タッチすると、コールバック関数のonSendConfirmed()を呼び出している。
SendUi.Callbackをimplementsしているのは、P2pEventManager。
そこでさらに、コールバック関数のonP2pSendConfirmed()を呼び出している。
だんだん自信がなくなってきたが、これはP2pLinkManagerだろう。
ここでようやく、sendNdefMessage()になった。
が、そこでやっているのは送信タスクの起動。
まだ本体にはたどり着かない。。


あ、SendTaskは比較的素直なようだ。
よかった。

  1. SNEPでの送信を試みる
  2. だめだったらNDEF Pushする。

こういう流れのようだ。
SNEPの接続に成功したら、送信に失敗してもNDEF Pushはやらない、という作りになっている。


SNEPはNFC Forumでドキュメント化されているけど、NDEF PushはAndroid独自のものだ(確か)。
だから優先されているのかな。


さて、送信するNDEFはどうなっているか。

これはコールバック関数のcreateMessage()に依存するらしい。
コールバック関数がない場合やメッセージがない場合は、Android Marketへ接続しそうなURLのNDEFを作っているように見える。

 

あとは、SNEPの話だ。
LLCPとかあの辺がないと動かないので、試したいならそこから作らねば。

ようやくlibnfcの話に戻れるようだ。


Android BeamってPUSHだ(今のところ)。
通信部分にSNEPを使えるようにしたってのはあるかもしれないが、NPPも使えるところからすると、RFに関しては新しいわけではない。
FeliCaにもFALPがあるし、iC通信ができるくらいだからAndroid Beamみたいなことはできるし、実際にやっている。

ただ、使う手間が違う。
有効にしておけば端末を向かい合わせてタッチするだけで使える、という手軽さはなかったものだ。
これは「端末に何かするときにはユーザの許可を求める」という考え方とは異なるものだ。
私も動画を見て「あ、受信側は許可を求められないんだ」と思ったものだ。

でもまあ・・・私はこれを勝手にされたら嫌だろうな。
パケホーダイみたいなものじゃないから、勝手にブラウザを立ち上げてURL先を見に行ったりされると「金がかかるじゃないか!」と抗議しそうだ(お金の問題じゃないけどさ)。

ただ、向かい合わせるだけで送信準備ができるというのはよいな。
そのためにはポーリングを消費電力など気にせずやる、という動作が必要だ。

あ、ポーリングするのが送信側なのか受信側なのかを見るの忘れた。
以前と同じ仕様なら、確かホーム画面でロックされていない場合にはポーリングする、だったと思う。
おそらく、それを引き継いでいるんじゃないかな。

[felica]FALP受信でエラーが起きているようだが、よくわからん

まだまだやってるFALP受信。
何のためにやっているかというと、とりあえずは画像をPCに送りたいというだけ。
うちにはあまりいいデジタルカメラがなく、携帯電話のが一番いい。
それをパソコンに持っていこうとすると、microSDカードに入れて、アジャスタを噛ませてSD R/Wに入れて・・・という手順がいるので、めんどくさい。
USBケーブルを挿すって手もあるけど、せっかくFALPが使えるんならやりたいではないか。


こんな手順で受信を開始している。

  1. initialize_library()
  2. open_reader_writer_auto()
  3. transaction_lock()
  4. ウィンドウ作成
  5. Listen用メッセージ登録
  6. set_falp_target_callback_parameters()
  7. falp_listen()
  8. PeekMessage() & GetMessage()によるメッセージループ

エラーは発生していないのだが、P906iから送信しても携帯電話側でエラーだとみなされている。
ソフトの方は、特に動きがない。

 

falp_dump_log_to_file()でログが取れるのでやっているのだが、開始時にエラーが出る。
出るけど、動いているからまあいいだろう。
このログの見方がよくわからないのだ。

なんとなくこのログは、ライブラリのログと言うよりもドライバのログのような気がする。
ログは1行ごとに時間と種類があり、種類はこんな感じになってるんじゃないかと思う。

  • CALL : ドライバI/Fの呼び出し
  • RETURN : ドライバI/Fからの戻り値
  • FCMD : R/Wに送信したデータ
  • FRES : R/Wから受信したデータ
  • STATE : 状態
  • RWAIT : ? 受信待ち?
  • ERROR : エラー

P906iから送信すると、FRESに値が載ってくるので、何かしら受信はしているようだ。
受信すると、STATEが「Propose待ち状態」になり、RWAITする。
その後、2回受信して、ERRORになるのだ。
ERRORのあとは、STATEが終了になっている。

エラーの種類は書いてあるのだが「その他エラー(code=-204)」。
うーん、わからん。


推測するしかないのだが、受信してエラーとしているのだから、受信データに問題があるのだろう。
想定していないパケットが来た、とか。
アプリにまで通知していないところを見ると、FALPの受信シーケンスとして想定していないものが来た、ということだろうか。

でも、P906iだって製品になっている以上、FALPのCTS試験は通っているはず。
変なものを送信しているってのは考えにくい。

 

もう少し試そうとしたのだが、P906iの電池が切れてしまった。
そして、充電中はiC送信できないということを初めて知った・・・。

falp_listen()のままずっといると、WM_TIMECHANGEが発行された。
うーん。
うーーーーん。


こういう結論に至った。

  • 私は間違っていないか、根本的な考え違いをしている。
  • FALP受信のサンプルができるのを待とう。

わからんものは、わからんのだ。
あきらめよう。

 

やっていて思ったのだが、スマートフォンみたいに自分で対抗機を作ることができるものがないと、面白くない。
自由が全くないので、できることが本当に限られてしまうからだ。
そりゃ、想定していないと言われても仕方ないわなぁ。。。

[c/c++]コーディングをときどき考える

さて、さっきはAPIについて偉そうに書いたが、そういう自分はどうなんだといわれるとつらい。
精神的には「動けばいいやん」派だ。

ただ、昔は自分の書いたソースがそのまま製品になっていたからチェックする人がいなかったんだけど、今は、ソースを納品する、という立場になったので、自然と気にするようになった。

一番嫌なのは、自分のコーディングルールをねじ曲げられるところだ。
もちろん、プロジェクト開始時にルールが適用される前にいろいろ文句をつけるのだが、だいたい「会社ルール」という名目で捨てられる(当たり前)。
わかっていても、ルールを押しつけられるというのはストレスがたまるのもわかっているので、なるべく抵抗する。

でも、だめなのもわかっているので、そのコーディングルールが適用されたときは、他のソースを書くときも同じルールで書くようにしている。
自分のソースとかね。
幸い、複数のプロジェクトを掛け持つことはないので、そこは気にしなくてよい。


本来、そろそろ後継者を育てないといけないのだけど、組み込み専門の会社なわけでもなく、自分の下に後輩が付いているわけでもないとなると、育てる人がいないってことになる。
組み込みって、育つのに時間がかかるから、メーカーみたいなところじゃないと育成できないのよね。
ただ、昔みたいに少人数ではとても開発できなくなってきているので、誰でも開発できるような体制を敷かざるを得ない。
そうなると、細かいところに配慮するような日本的な利点は足かせになってしまう。
人数が増えてグループを分けて作業するようになると、細かい作業ってのはグループ間の連携という作業が発生してしまい、工数が増えてしまう上、バグも出やすくなるからだ。
大陸的な開発をすると、そりゃ元々やってるところには負けるわな。

んで、そういうのはネットで複数の人が開発するようなシステムではさらにやりにくい。
できないわけではないけど、時間がかかるし、めんどくさい。
同じ場所にいて意識を共有しながら作るという作業は、けっこう重要なのだと思うよ。


まとまりがなくなってしまったが、いいたいのは「自分の製品が作りたいなー」ということかな。
独立したいとかそんなのではないけど、よその会社の製品に力を注いでいても人が育たないって状況がやだ。

[felica]FALPのAPI

SDK for NFC Starter Kit beta2。
FALPができるのだが、まだ受信できてない。

それはまあいいとして、ライブラリ実装がなんか不自然なのが気になる。
なんというか、静的解析ツールくらいはかけてからリリースした方がいいと思う。
自分では持っていないから何とも言えないが、見ただけで変なところもあるので、ちょっと書いておく。


felica_basic_lite_s.h

 

L.7
マクロ名の先頭がアンダーバー2つっていうのは、システム側で使用するものなので、普通は避ける
一致しなければ別にいいんだけど。
この辺は間違って覚えている人が多いので、ありがちといえばありがちだ。

 

L.41
Visual C++なら通らないからいいけど、そうでなければコンパイルエラーになると思う。
#elif、だ。
よく知らんが、最近は#else ifなんて構文もあるのか?

 

L.42
Cにはboolがないから定義したのだろうが、せめてtypedefしてほしいところ。
boolのサイズはけっこう処理系依存だと思うけど、unsigned charで大丈夫なのか?
下の方でextern "C"してるから、boolは使わない方がいいと思うんだけどね。
戻り値も定義した方が、ソースとしては一貫性があるだろう。

 


felica_mobile2_lite_s.h

 

L.94
このAPIだけ、他と違って変。
違う人が作ったのかな?

 

L.101
XPは32bit版だけだったけど、それ以外は64bit版もあったような。
APIが違うのはドキュメントに書かなくていいのだろうか・・・。


なんとなくFeliCa関係のソースは結構適当なできばえという印象がある。
動くからそれでいいやん、というのもそれはそれでいいんだけど、金を出して買った方からすると「品管は大丈夫なの?」なんて心配をしてしまう。

だって、ソフト仕様書とヘッダファイルなんて、製品で言えば筐体に当たるものやん。
もう少し気を遣った方がよい。

 

ソフトって、OJTだけでは成長しないので、ちゃんとした教育をしないといけない。
動くソフトとちゃんとしたソフトの差は大きく、やはりそれなりの教育がどうしても必要なのだ。

私も長いこと「動けばいいやん」派だったけど、この歳になってようやくわかってきたと思う。
セミナーとかによく参加させられて、「それなら仕事させてくれー」と上司に反発していたのだけど、悔しいが役に立っている。

ただ、教育を受けてしまうとソフトの考え方が固くなってしまうので、それはそれで面白くない。
なので結局、仕事用のソフトと遊び用のソフト、みたいな作り方をするようになってしまう。

とはいえ、こればっかりは難しいのよねぇ。

2011/11/19

[a4]android-4.0.1_r1のビルドエラーが続くが、Ubuntu 10.04以降はmasterの方がいいらしい

android-4.0.1_r1をビルドしているが、エラーが続く。
コンパイラのバージョンかなぁ。


In file included from external/oprofile/libpp/arrange_profiles.cpp:24:0:
external/oprofile/libpp/format_output.h:94:22: エラー: reference ‘counts’ cannot be declared ‘mutable’ [-fpermissive]

-fpermissiveは、非適合エラーを警告に格下げするものなのであるが、ここは「-fpermissiveを指定すると無視できますよ」という意味で出てきているのだろうか。
mutableは、constメンバ関数内でも変更できる変数にするやつなのだが、ここでは参照&にしているものをmutableにしているので、そりゃいかんですよ、といっているのだ。
まあ、そういう気もするが、別に本人がそれでいいんだったらいいんじゃないの、という気もする。

とりあえずmutableを消して逃げる。


external/gtest/src/../include/gtest/internal/gtest-param-util.h:122:11: エラー: ‘ptrdiff_t’ does not name a type

gtestってなんじゃ?
READMEによると、google C++ Testing Frameworkらしい。

ptrdiff_tってなんだろう、と思ったら、ポインタを引き算したときの型らしい。

#include <stddef.h>の追加でよいかな。


しかし、ここまでビルドできないと妙だな。

$ gcc -v
組み込み spec を使用しています。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6.1/lto-wrapper
ターゲット: x86_64-linux-gnu
configure 設定: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
スレッドモデル: posix
gcc バージョン 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)

linaroだから?
いやいや、androidは自分で持ってるgccでビルドしてるはずだ。関係ない関係ない。

 


out/host/linux-x86/obj/STATIC_LIBRARIES/libLLVMSupport_intermediates/libLLVMSupport.a(Signals.o): In function `PrintStackTrace':
android-4.0.1_r1/external/llvm/lib/Support/Unix/Signals.inc:219: undefined reference to `dladdr'
(ずらずら)

めんどうだなー、と思ってネットで探すと、同じようなことをやってる人がいた。

https://groups.google.com/forum/#!topic/android-building/AgeruY7XIwQ

ああ、これを見ながらやろう。
と思ったら、JBQ氏が何かおっしゃっている。

https://groups.google.com/forum/?hl=en_US#!topic/android-building/uOxx-vlRrSc

ようがす。
masterを落としてやり直しましょう。

・・・・

やり直して、何事もなくビルドが終わることが確認できましたとさ。
めでたしめでたし。

LinuxにAndroid SDKを入れる

Ubuntu11.10にしたので、久しぶりにAndroid SDK環境も入れ直すことにした。
なんとなく、Linuxではプラットフォームを、Windowsではアプリを、とやっていたので、Android SDKはあまり使っていなかったのだ。
android-4.0.1_r1のソースも公開されたので、そっちもやった。

SDKをダウンロードして、解凍。
最初にやるのはなんだっけ・・・・としばし悩む。
Readmeを読み、tools/androidを起動することだとわかる。

起動すると、Android SDK Managerが起動するので、適当にインストール。
Platform Toolsは必須じゃないかな。

eclipseを起動して、ADTも新しくした。


さて、とりあえずAVDを作成して、android 4を起動させた。

ほほう。

個人的にうれしいのは、設定アイコンが変わったことだ。
前は、車のタイヤみたいなのだったから、一瞬迷っていたのだ。
今回はつまみがついたようなアイコンなので、わかりやすい。


ソースは、いつものようにrepoで入手。
masterはだめだったのだが、android-4.0.1_r1はうまくいったので、まあいいや。

今makeしたのだけど、エラー発生。
yaffs2など使わないから外してもいいんだけど、どうもそういう問題でもなさそうだ。
-Werrorにしているのを外せば解決しそうだけど、それもなんかいやな感じだ。

_FORTIFY_SOURCEの2重定義なのだけど、Android.mkにはないから、build/coreあたりにあるんだろう。
とりあえずだが、build/core/combo/HOST_linux-x86.mkの56行目をコメントアウトした。

<組み込み>:0:0: 備考: ここが以前の宣言がある位置です<組み込み>:0:0: 備考: ここが以前の宣言がある位置です

といわれるから、デフォルトで有効になったのだろうな。

2011/11/18

[felica]HID ?

http://www.sony.net/Products/felica/business/information/111114.html

英語がさらさらっと読めるといいのだが、あいにくそういう能力はない。。。
ここの最初を読んだだけだと、SONY社とHID社がタブレットなどに向けたNFCリーダを作る、みたいな感じだろうか。
iClass SE、なんて言葉も出てきたので、もうちょっと読まんとわからんな。




全然関係ないけど、タイトルに「[無駄]」って書くのはよくないな。
技術に関係のない無駄話を書いているので見分けたかっただけなのだが、「俺はこういうのは無駄だと思うぜ」と主張しているように見えてしまう。
省略の仕方がまずいなぁ。

2011/11/16

[無駄話]PN544のキット

疲れたときは、よそ様のサイトを見て感想を書こう。

http://www.paymentnavi.com/cardnavi/19274.html
ソフィアシステムズ、大日本印刷、バイテックの3社が共同で「NFC組込開発キット」なるものを発売するらしい。
PaSoRiみたいなやつかなーと思ったら、さにあらず。
PN544だ。
つまり、SEなんかに接続できるやつである。
ほほぅ。

面白いのは、ソフィアシステムズさんは開発ボードを、大日本印刷さんはNFCモジュールを、バイテックさんはNFCチップをそれぞれ供給するらしい。
さて、NFCモジュールとNFCチップの違いは何だろうか?
おそらく、PN544をバイテックさんが供給し、大日本印刷さんはそれを使って無線周りを仕立てるのだろう。
私の持ってる知識からすると、高周波の基板ってのは設計がめんどくさい(という話を聞いた)。
それに、PN544だけでNFCができるわけもなく、アンテナとか電源とか、周辺にいろいろといる。
そこらへんを大日本印刷がやるのだろう。
もし、大日本印刷さんがPN544を直接購入できるようであれば、バイテックさんは絡まなかったかもしれない。
だって、モジュールを作る技術はあるんだから、チップがあれば自分でやるはずだ。
そうなっていないところを見ると、購入ルートがなかったということだろうか。

まあ、どうだっていいのだけどね。
単に事情通っぽいことを書いてみたかっただけで、何の根拠もないことを許してくだされ。

さて、これが販売になったとして、一般人が入手できるようになるだろうか?
ソフィアシステムズさんが入っているので、セット販売っぽくなるのではなかろうか。
既に購入済みだったら、NFCボードだけ買えるとか。
PN544のカタログを見ると、ホストとはUART/SPI/I2Cで接続ができるようだ。
だったら、うまくやればBeagleBoardやPCとも接続できそうだ。

が、買えなさそうな気がする。
SDB-200だって、一般人には買えないではないか。
そう考えると、ねぇ。

謎のJBQ氏

AndroidのMLで、よく出てくる人がいる。

それがJBQ氏。
的確な短い回答が心地よい。

しかし・・・謎だ。

 

今回、Android4.0のソースが公開されたという記事があった。

http://www.itmedia.co.jp/enterprise/articles/1111/15/news029.html

そこに「ジャンバプティステ・クエル氏」なる名前が。

 

ああ、この方が!
安心した方も多いのではなかろうか。

読んでないけど、このメールなのかな。
https://groups.google.com/forum/#!topic/android-building/T4XZJCZnqF8

[felica]FALPテキスト送信サンプル(P906iへ)

SDK for NFC Starter Kit beta2を使ってFALPサンプルを作っていた私だったが、一番の心配事は動作環境がフィーチャーフォン(P906i)向けということだった。
Androidおサイフケータイを想定しているのに、これは大丈夫なのか??

しかし、想定していないだけで「実害はない」ということだったので、ビルドした実行ファイルとソースファイルの大半を置くことにした。

https://sites.google.com/site/hiro99ma/home/windows

ここの「Falp1.zip」がそうだ。
解凍すると、Falp1.exeとFalpSend.cppが出てくる。
Falp1.exeと同じフォルダに「test.txt」というテキストファイルを作り、中にShift-JISで文章を保存しておく。
そしてPaSoRiをつなぎ、携帯電話をFALP受信できる状態にする。
SDK for NFC Starter Kit beta2に付属のドライバをインストールしておけば、Falp1.exeを実行するとメモとして転送される・・・はず。
開発は、Windows XP SP3(32bit)をVisual Studio 2010 Express C++。
SDKサンプルのFalpSend.cppをちょっと変更しただけだ。
ビルドも、includeパスとlibパスを通して、felica.libを使うようにするだけ。
簡単だ。
簡単と言えば、OBEX変換の簡単な実装もついたお得商品だ。
・・・見てがっかりしないように。

が、最初に「ソースファイルの大半」と書いたように、全部のソースファイルを置いていない。
どの部分かというと、APPIDだ。
P906iというか、携帯電話に対する値がどこにも見つからないのだ。
これは、それこそ「知っている人しか知らない」値なのかもしれん・・・。
各社の携帯電話でiC通信はできるので、公開してくれてもいいと思うんだけどなぁ。
SONYさんやFNさんが管理しそうな値ではないとは思う。

2011/11/15

[felica]SDK for NFC Starter Kit β2版の使用許諾契約

Androidじゃない携帯電話にFALP送信できるサンプルができたので、世のため人のため(?)記事に載せてみようかと思った。

が、待つのだ。
使用許諾契約に違反しないか、確認せねば。

前回、Arduinoライブラリを見ながら移植したときは、よくよく読んで問題ないと思う範囲でやっていたつもりだったが、その解釈がよろしくなかった。
まあ、そのときは後付けで使用範囲が広くなったのだが、今回は慎重にやってみよう。

 

こういうのの読み方を説明してあるサイトはないかなぁ。。。


http://blog.felicalauncher.com/?page_id=3373
全文引用はよくないだろうから、上記リンク先を読んでくだされ。

 

第1条が基本で、それ以外の条文は補足だったり、一般的なことだったりのようだ。

ふむふむ、ホームページに書いてある動作環境かつ指定したターゲットで、指定するOSとR/Wを使え、と。
うちのOSはWindows XP Professional 32bitだから、OSは満たしている。
R/Wも、RC-S370だから、OKだ。
Visual Studioも、Expressではあるが2010だからOKだ。

・・・あれ、β1の動作環境では、2008って書いてある。
でも、もう2005とか2008ってダウンロードできないよなぁ。
あ、使用許諾には「動作環境」とは書いてあるが「開発環境」とは書いていないな。
セーフ。

 

むむむ?
FALPライブラリは「おサイフケータイとの」と書いてあるが、本文をよく読むと「おサイフケータイAndroidスマートフォン」という言葉も出てくるな。
β1の「カード」にも、「おサイフケータイ対応Android携帯電話」と書いてある。
そして・・・私が作ったのはP906i対応なので、Androidではない。

しゅうりょー

 

ええっと・・・違反した場合は・・・第5条、解約か。。。

さすがに被害は出していないと思うから、請求は勘弁してもらえるだろう。。。
「まさか "おサイフケータイ" にAndroidかそうでないかが含まれるなんて気付かなかったんです!」
と、弁護するしかあるまい。

2011/11/13

[felica]FALPターゲットになれん

SDK for NFC Starter Kitを使って、FALPターゲットになろうとしているが、うまくいかん。
まあ、うまく行かんシリーズみたいなもんだ。

 

とりあえずねぇ、ドキュメントに間違いがあるのが困る。
前も書いたようにFALPのだけじゃないんだけど、どこまで当てにしていいか迷う。
APIの引数がIN/OUTで間違っているくらいなら、まだなんとか予想できる。
でも、状態遷移が間違っていると、なんだかなぁ。

p.14に、FALP関連APIと動作モードの一覧がある。
R/WをオープンするAPIがあるのだが、それを呼ぶと「FALPモードへ移行」と書いてある。
FALPモードへ移行するとFALPターゲットモードにはなれないから呼んだらいかんなー、と思ったら、呼ばないとFALPターゲットになれない。

などなど。

 

まあ、それはやってみればわかるからいいんだけど、うまく行かない理由がまだわからん。
ログが取れるのでやってみたけど、ログを見ても意味がわからん・・・。
falp_listen()はうまくいくけど、Windowメッセージがうまくさばけていないのか、間違っているのか・・・。

 

今日はこの程度までだな。

[felica]FALPのサンプルをシーケンス図に落とす

P906iに向けてvNoteデータを送ろうとしているが、うまくいかん。
よく考えると、OBEXはデータだけじゃだめで、シーケンスをちゃんと動かさなくてはならない。
となると、今のFalpSendサンプルではちゃんと動かないだろう。
改造するために、どういう動きをしているのか把握せねば。


    FalpSend

 

astah* communityで作ったんだけど、でかいなぁ。。。
まあ、いいや。
ライブラリの中がどうなっているかはわからないけど、まあ大きくは間違ってないだろう。


これをOBEX CONNとOBEX DISCで挟んでOBEX PUTすると、ちゃんとvNoteが携帯電話に送ることができた。

 

OBEXデータを作る関数は作ってたんだけどなー、と探しているが、見つからん。
もったいないなぁ。

2011/11/12

[無駄]FALPの使い方を考える

SONYさんの SDK for NFC Starter Kit β2を使うと、FALPの送信ができることがわかった。
まあ、FALP受信もできることだろう。

これを使って、何かできるだろうか。

うちで簡単に動かせるのは、Android 3.1が載ったA500。
これでPaSoRiを動かすことはできている。
要領はRC-S620/Sの扱い方と同じなので、これといって難しいことはない。

RC-S620/Sの扱い方とPaSoRiの扱い方は同じなので、FALPもまた同じようにできるはず。
ライブラリの移植は無理なので、プロトコル解析して実装、というような手順にはなるだろうがね。
そしてそれは、見た目だけの実装になるので、たぶんFALP仕様通りではない。

それはなんだかなぁ。


前回の携帯電話との接続実験をしていて思ったのだが、FALPの上にLLCPを実装するといいんじゃなかろうか。
やっていることは重複してしまうので、無駄はかなり多い。
多いのだが、LLCPから上はNFC-DEPでもFALPでも共通にすることができる。
今のフィーチャーフォンはFALPの上にOBEXが載っているが、スマートフォンではOBEXは使わなさそうな感触だった。
でも、FALPはFALPが対向にならないと通信できないから、意味はないか。。。

[felica]FALPのサンプルを動かす

http://blog.felicalauncher.com/?p=3639

 

SDK for NFC Starter Kit β2にはFALPのサンプルソースがあったので、動かしてみた。

うちの環境

  • Windows XP SP3 32bit
  • Visual Studio 2010 Express C++
  • PaSoRi RC-S370
  • [受け側]DoCoMo P906i

 

test.jpgというファイルを送信するサンプルっぽい。
実行結果

initialize_library()...
open_reader_writer_auto()...
transaction_lock()...
polling_and_get_card_information()...
falp_open()...
falp_connect()...
falp_connect() error.


接続エラーっぽい。

携帯電話はLEDが点いたので、PaSoRiから搬送波は出しているようだ。
まあ、ログ通りに、ポーリングはうまく行くけどFALPの接続で失敗している、というところだ。


サンプルの説明が、こうなっている。

〇おサイフケータイ対応Android携帯電話とFALP通信を行う

まあ、確かにうちの携帯電話はAndroidではない。
とはいえ、これはFALPライブラリなので、サンプルをいじれば何とかなるだろう。

unsigned char appid[] = {0x02, 0x00, 0x54, 0x45, 0x53, 0x54, 0x49, 0x44 };

まあ、これだろう。
これを書き換えて、実行。

initialize_library()...
open_reader_writer_auto()...
transaction_lock()...
polling_and_get_card_information()...
falp_open()...
falp_connect()...
falp_wait_event()...
falp wait event: 8
falp_shutdown()...
falp wait event: 4
falp_close()...
transaction_unlock()...
close_reader_writer()...

惜しい。
ログからするとうまくいっているように見えるが、携帯電話側がエラーを出している。
つまり、データを読んで失敗しているのだ。

これはあれだな。
送信側がOBEXデータを送ってないからだな。
なので、あとは送信データだけの問題で済みそうだ。

 

このデータでスマートフォンとはやりとりできるようなので、あっちは結構自由度が高そうだ。
持っていれば試すところだが、持っていないので試せない。
携帯電話はあまり好きではないので、買い替える気もないし、壊れて買い替えるとしても同じような機種にするだろうなぁ。

[win]拡張子の関連づけを取り戻せ

Windowsは、嫌いではない。
Microsoftも、そんなに嫌いではない。
Visual Studioも嫌いになるほどには使ってはいないのだが、1点ものすごく嫌いなことがある。

それは、インストールしただけで拡張子の関連づけを勝手に代えてしまうことだ。
せっかくテキストエディタに割り振っていたものを奪い取られるので、その腹立たしさは並ならぬものである。
そしてサービスパックを当てたら当てたで、また奪い戻される。
さっき奪われた。。。

 

えーい、ならば取り戻すまでよ。

というわけで、こんなバッチファイルを作成した。

set EXEC="C:\Winappli\EmEditor\EMEDITOR.EXE"
set PARAM="%%1"

call :attach c cpp cs def h hpp inc inl java log s asm mak map txt
pause
goto end

:attach
assoc .%1=emeditor.%1
ftype emeditor.%1=%EXEC% %PARAM%
shift /1
if "%1"=="" goto attach_exit
goto :attach %*
:attach_exit
exit /B 0

:end

 

バッチファイルなんてめったに書かないから、えらく時間がかかってしまった。
EXECに関連づけたい実行ファイルを、PARAMにその引数を書く。
んで、callの行に関連づけたい拡張子をずらずら書くだけだ。

[felica]FeliCa Lite-S

珍しくFeliCaがらみの話が連続してしまった。

http://www.sony.co.jp/Products/felica/business/information/111111.html

 

噂のFeliCa Lite-Sが公式に出てきた。

書いてある以上のことは知らないのだが、FeliCa Lite-Sの大きな特徴は「ライトアクセス権制御」だろう。
FeliCa Liteでは書き込み制御ができるPADがなかった。
なので、お金に関するような情報は書き込みたくないようになっている。

あれ・・・FeliCa Liteにはリードアクセス権制御があるって書かれているな・・・。
そんな機能あったっけ?
Read w/o Encryptionだから、どっからでも読めたと思うのだが。
そうではなく、MCレジスタへ書き込むとブロック単位でRWかROが決定できる、ということを指しているのかな。
ここにWOが追加されるということだろうか。

 

ともかく、MACを使った相互認証ができるので、FeliCa StandardみたいにFNさんに許可を得る必要はなく、安く実現できるのが嬉しい(確か、毎年数十万円必要だったような気がする)。
地域通貨みたいなものができると面白かろう。


全然関係ない話だが、説明文に出てくる「シングルジャーニーチケット」が気になった。
どうやら、再利用可能な1回乗車券、というものらしい。
今だと発券機にお金を入れると、紙の券が出てくる。
紙だと、使い終わったら捨てるしかない。
だからRFIDを使って再利用できるようにしようではないか、というもののようだ。
ほー。

 

韓国でやっているらしい。
http://response.jp/article/2009/07/13/127214.html

T-money、というらしいので調べてみると、位置づけとしてはnimocaやSuicaと同じものっぽい。
http://www.konest.com/data/traffic_info_detail.html?no=1259

 

でも「シングル」と言い切っているところをみると、チャージするというようなイメージよりも、その料金区間を1回だけ乗ることができる、という使い方になるような気がする。
FeliCa Liteではできなかったことだな。

2011/11/11

[felica]CXD2235AGG

SONYから、モバイル向けNFCチップが商品化されたという記事があった。

http://www.sony.co.jp/SonyInfo/News/Press/201111/11-145/

 

図を見るとわかるように、FeliCaセキュリティチップとSIMカードにアクセスできる。
これはNTTドコモの次世代向けだと思われる。
SWPに対応したってのが大きいな。
このチップを搭載したおサイフケータイであれば、Android APIのNFC機能を使うことができないこともないだろう。
でも、現状でもNFC-FだけAPI対応する、というような技は見せていないから、なんかMFC搭載の携帯電話に対する制約が課せられているのかね。

 

不思議に思ったのは、ARM。
脚注に「"ARM"はARM社の商標です」と書いてあるのだが、記事にARMは出てきていない。
なんだろう?
構成例がスマートフォンなので、ホストコントローラがARMになってた名残だろうか。

2011/11/09

[felica]FALPも使えるPC向けライブラリ

昨日、FeliCa Developers' Blogで見逃していた記事があった。

http://blog.felicalauncher.com/?p=3639

なな、なんと!
FALPがPCからでも使えるようになるライブラリが入ったのだ。

わしが生きている間にこれが実現するとは(オーバー)。


ちょっと実装してみる時間が取れないのが悔しいところだ。
まあ、FALP送信だけなら自前ライブラリでもやれるので、まだいいんだけどね。

 

ドキュメントを眺めていて気になったのが、structure_device_information。
どういうときに使うのか知らないけど、device_info_typeの中に「ワイヤレスキーボード」がある。
それ以外は、PaSoRiの機種名っぽいのに。
ワイヤレスキーボードでPaSoRiつきがあるのかな?
タイムアウト時間も、ワイヤレスキーボードが長めになってるみたいだし。

 

まあ、いい。
使ってみればわかることだ。

[c++11]autoってのがあるんだ

発端は、この記事であった。

http://news.mynavi.jp/news/2011/11/04/014/index.html

 

C++好きだといいながらも、あんまり最近C++使ってないし、動向も見てなかった。
せっかくなので、この記事を眺めて雰囲気だけでも味わってみよう、などと考えていた。

 

しかし、最初の項目を見て驚いた。

map<int,string>::iterator i = m.begin();  //C++98

auto i = begin(m);  //C++11

 

なんと!
autoって、自動変数のautoかと思ったら、定義自体が違うではないか!!

そしてこれは、理にかなっていると思った。
C++には引数が異なる関数の多重定義はあるけれども、戻り値が異なる多重定義はない(よな?)。
だから、引数が決まった時点で、戻り値も決まることになる。
一時的に使いたい変数程度なら、わざわざ型指定とかしなくてもautoでいい、ということになる。
そしてそうした方が、戻り値の型を書くよりも安全だ。

 

組込みでソースを書いていると、型をきっちり、ということを強いられる。
で、これがけっこうめんどくさい。
ソースが流動的なときなんかは、戻り値の型が変わってしまったりして、関係するところを洗い出さないといけん、とか。

まあ、静的解析ツールにかけたり、コンパイラでwarningレベルを上げたりってのもあるけど、言語レベルでサポートされると気が楽だ。
コードレビューの時なんかは、「autoを使っていないとこだけ確認」とかで済むし。

 

それよりも、というと変だが、autoの意味合いが変わっているところに驚きを感じた。
これはもう、C/C++ではなく、C++11という言語と考えてもいいんじゃないだろうか。
もっと知らねば・・・。

 

とりあえずC言語でもほしいのは「namespace」「新auto」「nullptr」かな。
nullptrは、以前から疑問に思っていたNULLチェックに対して答を与えてくれるものかもしれない。
今日は読んでないのだけど、早く読んでしまおう。

2011/11/07

[boost]リンクの順番か・・・

cygwinで、同じソースをビルドしてみた。

$ g++ -o tst -lboost_regex-mt regex.cpp

これならできるだろう・・・できない。
やはりリンクエラーになる。

ふっと思い立って、こうしてみた。

$ g++ -o tst regex.cpp -lboost_regex-mt

あ、通った。

Ubuntuに戻って、同じことをしてみた。
・・・通る。
そういうことか・・・・。

つまり、do_assign()はヘッダにあるけれども、やはりライブラリが必要なのだ。
nmで確認したが、do_assign()は「U(ndefined)」のままだった。
shared libraryでリンクされるから、そのままになっているのだろう。
-staticで静的にリンクさせて確認しようとしたが、あれやこれや無いと言われたので、やめた。

gccの場合、順番にリンクするんだったと思う。
標準ライブラリなんかは、書かなくても自動でリンクするんだけど、あれは一番最後に追加されていたんだったはず。


んで、一方のmayu。
Makefile.inを書き換えれば済むかと思ったけど、うまくいかん。

$ LIBS=-lboost_regex ./configure
$ make
$ sudo make install


Makefileを見ると、リンクの最後に$(LIBS)を見ていたのだ。
逃げた私を許して・・・。

[ubuntu]結局、xubuntuにした

$ sudo apt-get install xubuntu-desktop

 

そんな感じでやった。
うん、確かにgnome2に近い。

あとはboostの件が解決すれば、環境周りは片付くんだけどなぁ。。。

InstallShieldのアップデートを削除

http://kb.flexerasoftware.com/selfservice/microsites/search.do?cmd=displayKC&docType=kc&externalId=Q111106&sliceId=1&docTypeID=DT_HOWTO_1_1&dialogID=91533023&stateId=0%200%2091525880

ときどき出てきては、異常終了するので正式に消したかったのだ。
でも、Program Files\Common\InstallShield\UpdateServiceにはファイルが残ってるなぁ。
まあ、様子を見てみよう。

2011/11/06

[boost]regexのリンクがうまくいかん

うまくいかんシリーズ。
boostのregexで、リンクがうまくいかんようなのだ。
使っているboostは、1.47.0。
コンパイラは「gcc バージョン 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) 」だ。

#include <boost/regex.hpp>
int main()
{
	boost::regex  r("");
	return 0;
}

$ g++ -o tst -I/usr/local/boost/include -L/usr/local/boost/lib -lboost_regex regex.cpp
/tmp/ccaCv8B6.o: In function `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)':
regex.cpp:(.text._ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j[boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::assign(char const*, char const*, unsigned int)]+0x2a): undefined reference to `boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'
collect2: ld はステータス 1 で終了しました

boost_regexがうまくいってないのかと思ってboost_regeとかにしてみると、ちゃんと「ライブラリがない」エラーが出た。
ってことは、libboost_regexがあることはわかってるんだ。
なのに・・・なぜ・・・。

これがリンクできない、といっているのはわかった。
_ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j

では、ビルドしたファイルのあるboost_1_47_0/bin.v2/libs/regex/build/gcc-4.6.1/release/threading-multiを見てみよう。

$ nm *.o | grep _ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE6assignEPKcS7_j

確かに、ない。
では、何ならあるんだ?

$ nm *.o | grep _ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traits
U _ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE9do_assignEPKcS7_j
W _ZN5boost11basic_regexIcNS_12regex_traitsIcNS_16cpp_regex_traitsIcEEEEE5imbueESt6locale

うーん・・・。

ちなみに今は、こんな環境だ。

Linux kurokiri 3.0.0-12-generic #20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux


これを対策できれば、いいんだと思う。
`boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::do_assign(char const*, char const*, unsigned int)'

boost::regexは、こういう定義だ。

typedef basic_regex<char>      regex;

なので、このエラーはboost::regexのことであることは間違いがない。
では、basic_regexクラスのdo_assign()を見てみよう。

class basic_regex : public regbase
{
(略)
private:
   basic_regex& do_assign(const charT* p1,
                          const charT* p2,
                          flag_type f);
(略)

宣言はある。
では、実装はどこにあるのだろう。

その下にある、これしかなさそうだ。

template <class charT, class traits>
basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p1,
                        const charT* p2,
                        flag_type f)
{
   shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp;
   if(!m_pimpl.get())
   {
      temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>());
   }
   else
   {
      temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
   }
   temp->assign(p1, p2, f);
   temp.swap(m_pimpl);
   return *this;
}

ヘッダにdo_assign()定義があるということは、ライブラリうんぬんは関係ないことになる。
なんかおかしい・・・。

とりあえず、プリプロセスを展開させよう。

__extension__ extern template basic_regex<char , boost::regex_traits<char > >&
   basic_regex<char , boost::regex_traits<char > >::do_assign(
      const char* p1,
      const char* p2,
      flag_type f);

定義がないのは、これ。

boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >
  ::do_assign(char const*, char const*, unsigned int)

もしcpp_regex_traits<T>がbasic_regexをtypedefしたものだったらいいんだけど、別のclassだ。
確かに、定義はないな。


しかし、変だ。
だって、basic_regex<charT, traits>::do_assign()って書いているのだから、traitsがcpp_regex_traitsから置き換わる、なんてのは考えにくい。
nmでbasic_regexのコンストラクタを見ると、

boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::basic_regex(char const*, unsigned int)

と、cpp_regex_traitsのバージョンしかなさそうだ・・・ん?
似たようなのがあったぞ。

boost::shared_ptr<boost::re_detail::basic_regex_implementation<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > >::shared_ptr()

すまん、もう訳がわからん・・・。
あ、でもこのshared_ptrは、do_assign()の実装で使われているものではなかろうか。

shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp;

do_assign()の定義は

template <class charT, class traits>
basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign()

なので、traitsとしてはbasic_regexと同じものが使われるべきで、regex_traitsが急に出てくるのはおかしいような。
でも、そもそもの話が、

typedef basic_regex<char, regex_traits<char> > regex;

なので、regexの定義としてはおかしくないのか。

でも、nmで見ると、regex_traitsは出てこず、cpp_regex_traitsしかないんだよなぁ。
まあ、今日はこの辺にしておこう。