2012年1月7日

[qt]QtからUSBアクセスするクラスはなさそうだ

ざっと見た感じだが、QtからUSBをアクセスする標準クラスはないように見える。
シリアルポートなんかもないようだ。
まあ、グラフィックみたいに基本的に1つしかないことが保証しやすいものはいいけど、USBやシリアルポートのように、あったりなかったり複数あったりするようなものは難しいところだ。

 

USBならば、libusbを経由させれば何とかできそうに思う。
検索してもだいたいそんな感じだった。
Windowsだけであれば、WinUSBという選択もあろう。

 

意外と難しいのが、シリアルポート。
Windowsだと「COM3」のようなポートになっているが、Linuxだと「/dev/ttyS2」のようになる。
(Macは使ったことがないので知らない。)
この名前がハードウェアと一意で決定するのであればいいけれども、そうもいかない。
libnfcでは「自動検索」か「ユーザ指定」という形にしているが、そういう解決方法しかなさそうだ。

2012年1月6日

Linux NFC Subsystemというものがあるそうだ

家に帰って余力が残っているようであれば、LLCPを検索して探している。
普段はNFCなどと関係ない仕事をしているので、仕方ない。
何を探しているかというと、NFCのLLCPについてよい資料がないかどうかだ。
弱気になっているのかもしれないが(そう、年末年始の私は非常に不安定だ)、NFC ForumのLLCPドキュメントを見ながら実装したとしても、まっとうに動かないんじゃないか、と考えてしまったのだ。
理論だけではなく、経験に裏打ちされた情報が必要なのかもしれない、と。

 

そうなると、また以前の考えに戻ってしまう。
「自分で実装するのが面倒なら、実装されたものを使えばいいじゃない」。
カードの情報を読み書きしたり、NFC-DEPでデータをやりとりするところは面白かったのだけど、LLCPみたいな上位層になってくると興味が非常に薄い。
薄いけど、ここまできたら動くところを見たいし・・・と、やっかいな気分である。


前置きが長くなった。
検索してみていると、Linux NFC Subsystem、という文字が目についた。
PDFになっていたので、ばさばさと目を通す。

libnfc-nxp、OpenNFC、libnfc、それぞれベンダーやハードウェアへの依存が強い。
APIもPOSIXっぽくないし。
新しく、ドライバ追加型にすることでハードウェア非依存にし、POSIXっぽくやろうじゃないか、というように読んだ。
socketとか、netlinkとか、そういうものにあわせるというやり方みたいだ。

残念ながら・・・私はそこまでLinuxで作り込んだことがないので「netlinkって、あったね」くらいなことしか言えない。
でも、そういうプラットフォームができるのなら、私もそれに合わせたいものだ。

2012年1月4日

[llcp]シーケンスが遅々として進まず

正月ボケを改善しようと思い、LLCPのシーケンスを引いていた。
が、英語の解釈に時間がかかり、遅々として進んでいない。
少しだけ更新できたので、アップした。
https://sites.google.com/site/hiro99ma/home/experiment/snepunit/llcp

個人的なものだと思うが、LLCPの英語は訳しにくい。
訳しにくいと言うか、何をいっているのかよくわからないことがしばしばある。
ひとことでいえば、相性が悪い、というところだろう。

引いていないシーケンスは、AggregationとSymmetry、1.1になって追加されたService Discoveryだ。
今まで引いたシーケンスの中では、タイムアウトの概念がなかった。
Symmetryはその関係みたいだ。
Aggregationはよくわかっていない。
LLC Link Managementのみが使用する、と書かれているのだが、いったい何のことやら。
集合体、みたいな意味なので、複数PDUをまとめて送信することで効率を良くするのかもしれない。
Service Discoveryは、SNEPとかそんなのと関係するのだろう。
まだまだこれから読まねば。

ここで5章のシーケンスを全部引っ張ったとしても、MACのところも読まないといかんだろう。
エラー系のことはまだ読んでないから、いつかは見なくては。
各PDUの詳細も知る必要があるだろうし、やることは山のようにある。
高いなあ、山が。
その次に実装だろう。
実装したときの動作確認相手は、nfcpyにお願いしよう。
まだ使ったことはないけど、今のところ一番信用できる。
私にできるのは、そこまでだろうな。
その間に、今年は何かNFCの遊び物が出てくるんじゃないかなー、と思う。

2012年1月3日

QtとNFC

今のところ、自分でRC-S620/SやPaSoRiにアクセスするのに、自前のインターフェースを作っている。
libnfcでもCard Emulationならいけそうなのだが、LLCPまでやりたいとなると自信がない。
せめて、自分でNFC-DEPがきちんと動かせるようになってからでないと、移植は無理だ。

 

ふと、Qtはどうなっているのかが気になった。
Nokiaさんだし、なんらかの形でサポートしているのではなかろうか?


検索して出てきたのは、こちら。
Qtではなく、Qt MobilityのAPIとして存在している。
ということは、デスクトップ向けではなく、携帯電話のような移動端末向けということなのだろう。
(サポートしている端末は限られているようだが。)

 

ざっと検索してみたが、QtのAPIとしてはなさそうだ。
やるなら、ネイティブAPIを組み込むか、ネイティブAPIをQt Mobility APIに合わせて実装するか。
そんなところだろう。


Androidもいいのだけど、やっぱり必要となるハードウェアは機能が高めになってしまう。
なので、なんでもかんでもAndroid、ということもないだろう。
エアコンや炊飯器にAndroidが使われるかというと、使われんと思う。
レジに入っているOSがAndroidになるかといえば、ならんと思う。
適材適所であろう。

私としては、次の候補がQtなのだ。
自身はOSとしての機能は持たないものの、GUIを持つプラットフォームである。
なら、OSとしては何を選ぼうか?
今のところ、Linuxしか思いつかない。
LinuxはLinuxで結構なパワーが必要だと思うが、Linuxが動かせないならQtも諦めてよさそうに思う。
まあ、私の指標でしかないがね。

2012年1月1日

Fukuoka NFC Hack 7に行ってきました

さて、私にとっては最後の参加になるかもしれないFukuoka NFC Hack 7に行ってきました。
(来月は、個人的な用事がありそうなので、無理かもなあ。。。)
@daichan4649さんに再び会えてよかった。
まあ、来月は会社を辞める予定なので、有休消化でまるまる休みにする予定なのだけどね。
それはさておき、私の知識が役に立ちそうなのはこういうときしかないし、人から新しい話を聞けるのもこういうときしかないので、新鮮なのだ。
普段は、仕事に埋もれてるんだよなぁ。。。

おなかがすいているので、箇条書きで済ませてもらおう。
  • IC免許証は、他にもNexus7で読めない人がいた!
    というより、読めた人は1人しかいなかった!!
    また、警察署か何かでは、ちゃんと読めたということだった。
    つまり、NFC-Bは検出方法によって検出の有無が制御できるとか、Android側ではじくとか、何かしら遮断されているようだ、ということがわかった。
    しかし、なぜ一人だけ読めたのかは不明である。
  • NFCのアンテナ部分について。
    以前計算したときは、ダイポールアンテナだと5メートルくらいじゃなかろうか、と思った。
    搬送波でLEDを点灯させるくらいなら長さは適当でよさそうだけど、FeRAMなんかを動かすのならちゃんと調整せんといかんのかな。
  • 本をめくる。
    という話は、「NFCタグを大量に書き込むのってどうやるんだろう?」という疑問から出た。
    実際はどうやってるんだろう?
  • 通信速度について。
    13.56MHzで106kbpsとかは、なかなかがんばっている。
    RFIDでは、5kbpsとかだったりする。
    TransferJetはもっと速い。実効レートで375Mbps(今調べた)。
  • Panasonicデバイス社のNFCタグICについて。
    Fukuoka NFC Labで評価キットをお借りできたので、その報告を簡単にした(私が借りてた)。
    どういうICなのかの説明を作っていなかったので、初見の方に申し訳なかった。
    こういう発表資料は、初めての人を想定して作らんといかんね。
  • Raspberry PiでRC-370を制御。
    初めてRaspberry Piを見たが、やはり小さい。
    いまは、2週間くらいで入手できるそうだ。
    libpafe + libpafe-rubyで動かす例が紹介された。
    BeagleBoardだと、空いたUARTが1.8Vなので、ちょっと使いづらいのよねぇ。
  • 組込みでNFC。
    NFCのことを説明するというのは、なかなか難しい。
いろいろ漏れているが、こんなところで許してくだされ。

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に載ってた値なので、よくわからん。