ようやく平常運転だ。
nfc-smart-tagのソースを読んでからLLCP v1.1のドキュメントを読むと、意味がよくわかる。
個人的には忸怩たるものがあるのだが・・・LLCPのドキュメントを読んでも具体的な動きがわからなかったので、屈服せざるを得まい。
それに、私がやりたいのはInitiator側なのだ。
だからTarget側であるnfc-smart-tagの動きを知っておくことは大切なのだ。
うんうん、そういうことにしておこう。
では、過去を振り返りながらLLCPのLink Activationを復習しよう。
LLCPは、NFC Forumが想定しているP2Pの下層プロトコルだ。
最下層は、NFC-DEP。
NFC-DEP、LLCP、SNEPという3層構成になっている。
少し前まではSNEPがなく、LLCPで通路だけができていたところだった。
通路だけあって、そこに何を通すかが決まっていなかった。
一番最初に通った大物は、AndroidのNPP(NDEF Push Protocol)だろう。
Android4.0からは、SNEPとNPPが搭載されていて、まずはSNEPでアクセスし、だめだったらNPPを使う、というソースになっていた。
LLCPはNFCながらも、UDPみたいなコネクションレスの通信と、TCPみたいなコネクション指向の通信が定義されている。
Androidのlibnfc-nxpや、NfcServiceの下層にはどっちも入っているのだけど、NfcService事態にはコネクション指向の通信しか含まれていなかったように思う(NativeNfcManager止まり)。
NFC-DEPは、リーダライタに直接コマンドを出して行うような、低レベルの通信だ。
「低レベル」というと程度が低いとかそんなことを思ってしまいそうだが、英語だと「low-level」ということで下位層を指す。
もちろん、最下層はRF(Radio Frequency。高周波とか無線とか)だがね。
LLCPは、おおきく3状態ある。
- Link Activation
- Normal Operation
- Link Deactivation
Link Activationで2台の端末を接続し、データをやりとりしている間はNormal Operation、終わったらLink Deactivationというわけだ。
LLCP v1.0からv1.1にあがるとき、SDP(Service Discovery Protocol)が追加されたのだけど、nfc-smart-tagでは使ってなさそうだった。
なので、私もそこは見ないことにする。
最初は、Link Activation。
お互いがサポートしているLLCPのバージョンや、やりとりできるパケットサイズなんかを確認するところだ。
LLCPでは、LLCPのパケットをPDU(Protocol Data Unit)という単位でやりとりする。
PDUには名前が付いていて、たとえばLink Activationのやりとりで使うのはPAX PDU(PArameter eXchange)という。
いうのだが、ここに罠が(おおげさ)!
LLCPを始める前に、まずNFC-DEPを始めないといかんのだが、そのときにATR_REQ / ATR_RES (ATtRibute REQuest / RESponse)というRFプロトコルを使う。
このプロトコルには、汎用として使えるGeneral Bytesという部分がある。プロトコルの一番最後になっていて、50byteくらいは好きに使っていいようになっているのだ。
LLCPではこの領域を使うようになっている(LLCPドキュメント6.2.3.1など)。
General Bytesに、キーワード「Ffm」に続けてLink Activationで使うデータを載せることになっているのだ。
LLCPで通信しよう、と思ったときには既に行動は終わっているのだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。