SlideShare uma empresa Scribd logo
1 de 24
LLCPのCPは
CarPの略かな?
LLは
Large Lengthらしいから
きっと私たちのことよ!
ふっ、愚か者たちめ。
SNEPのSがSUZUMEだと
いうことに気付かんとは。
第1章 NFCでのデータ交換
第2章 NFC-DEPって?
第3章 LLCPって?
第4章 SNEPって?
- 1 -
第1章 NFCでのデータ交換
はじめに
通信とは、データを交換するためのルールである。だと思う。
幅広く見ていくと、すべては通信で成り立っている。あいさつだって、一種の通信だし、そもそも会話自
体が通信といってもいいだろう。本を読むのだって、本からのデータを受けとっているわけだし、テレビ
だってそうだ。
ただ、「データ交換」と銘打った場合、それは通信のためにデータ交換をするのではなく、データ交換
のために通信を行う、ということになる。この特集も、 NFC デバイス同士でデータ交換を行うためにつ
いて説明することが中心となる。
いつもと違って、今回は文章がお堅いし、冗長になるかもしれない(冗長なのはいつもか)。それは、私
が「通信」というものに弱く、理解するのに時間がかかったからだ。自信があまりない、と言い換えても
いいかもしれない。
そんなわけで、気楽に読んでほしい。なお、このドキュメントでは RC-S620/S でのやり方を書いてい
く。他のデバイスの方は適宜読み替えていただきたい。
データ交換のためのプロトコル、 DEP
NFC Forum では、 Digital Protocol でいくつかの規定を行っている。大ざっぱにいうと、以下のように
なる。
1) Technology : 無 線 通 信 の 方 式 (NFC-A, B, F)
2) Platform : メ モ リ の 方 式 (Type 1, 2, 3, 4A, 4B)
3) Protocol : デ ー タ 交 換 の 方 式(NFC-DEP, ISO-DEP)
今回の話は、 3 番目の「 Protocol 」である。 DEP 、というのは"Data Exchange Protocol"の略であ
る。データ交換プロトコル、だ。これを使えば、 NFC でデータ交換できるのである。
そう思って読み進めていたのだが・・・正直なところ、さっぱりわからなかった。かろうじてわかったの
は、 NFC-DEP は、 Technology の NFC-A か F 、 ISO-DEP は NFC-A か B 、というところまでだっ
た。
NFC-DEP は ISO-18092(NFCIP-1)由来、 ISO-DEP は ISO-14443 由来、というところまではわかっ
た。 14443 は入手しづらいが、 18092 は ECMA にもあり、 ECMA は無料ダウンロードできたので、
そこから着手することにした。
月刊 NDEF 2013 年 8 月号
- 2 -
DEP に時間がかかった私
今にして思えば、 DEP のことを調べようと思ってから、 ISO/IEC にたどりつくまでが長かった。そし
て、たどり着いてからも長かった。
言い訳をしておこう。私が持っている NFC のデバイスは、 SONY の RC-S620/S というリーダライタ
のみである。このデバイス、いや通常の我々が入手できる既成製品で扱うことができるのは、あくまで
「有線コマンド」、すなわち UART や SPI などでしか操作することができない。そして、 ISO などのドキ
ュメントで規定されているのは「無線コマンド」である。まあ、 NFC というのは無線だから仕方ないのだ
が。
パソコンを使って印刷をしたいなら、パソコンでプリンタを制御しないといけないのと同じように、 NFC
リーダライタで無線コマンドをやりとりしたいのなら、有線コマンドで NFC リーダライタを制御しないと
いけないのだ。
NFC リーダライタとのやりとりは有線コマンドになるが、そのコマンドは各社で異なる。 RC-S620/S も
そうだった。しかし、 RC-S620/S は当時コマンドのマニュアルが公開されておらず、操作方法がわか
らなかった。そのため私は「 NFC Forum に書いてあるコマンドを使えば操作できるのでは?」と思
い、時間を費やしたこともあった。そう、当時の私は、有線コマンドと無線コマンドの違いがわかってい
なかったのだ。
いろいろ調べ、 RC-S620/S の有線コマンドがわかり、ずいぶんと操作できるようになったのは比較的
最近のことだ。それでも、無線コマンドを直接操作しているわけではないので、ときどき苦戦することも
ある。
まあ、そういうものだと割り切ろう。
操作 印刷
有線 無線
NFC R/W
割り切って
忘れてしまえ
月刊 NDEF 2013 年 8 月号
- 3 -
ISO/IEC-18092 の DEP
通称、 NFCIP-1 。これを読むのは、なかなかつらい。 ISO/IEC-18092 の DEP は「 NFC-DEP 」と呼
ばれる。
図を見ていって、必要になれば文章を読む、でもよいかもしれない。以下は、 ISO/IEC-18092 を読む
ときのポイントだ。
"General initialization and single device detection flow"■
SDD(Single Device Detection"という、デバイスを特定するまでの流れだ。
Passive ルートと Active ルートがあり、 Passive は相手の無線を待つ側、 Acitve は自分で無線を出
す側だ。
ただ、これは Initiator と Target の関係とは少し異なる。通常の NFC は、 Initiator が搬送波を出し、
コマンドを出す。 Target は Initiator からのコマンドを受信し、その搬送波に載せてレスポンスを返す。
ここでの Passive と Active は通信モードのこと。 Passive は片方が無線を出して片方が受けとるとい
う今の形だが、 Active はどちらのデバイスも無線を出す。
今のところ、 NFC Forum の Digital Protocol(v1.0)では、 Passive のみサポートすることになってい
る。
何となくわかった気分になればよいか。
Activation protocol in Passive communication mode■
これが基本的な Passive での DEP(NFC-DEP)の流れになる。
SDD して、属性要求が来たなら ATR_REQ を送信し、相手からの ATR_RES で相手の属性を取得
する。通信を変更する必要があるなら、 PSL_REQ で変更。
そして、左下で DEP する。これは、中で DEP_REQ と DEP_RES を何度も繰り返す。
通信を終わりたいとき、 DSL_REQ か RLS_REQ を送信する。すると、それぞれによって違う終わり
方をする。
Activation Protocol in Active communication mode■
Active での DEP になるが、 NFC Forum では今のところサポートしていないので省略する。
流れは、 Passive とだいたい同じ。
あとは、 ATR_REQ と ATR_RES の構造を見ておけばよいだろう。見ておかないと、 RC-S620/S の
コマンドリファレンスを読んでも、どういう値を返せばいいかわからないことになる。
月刊 NDEF 2013 年 8 月号
- 4 -
第2章 NFC-DEPって?
NFC-DEP の位置づけ
NFC-DEP は NFC Forum での呼び方で、 ISO/IEC-18092 規定のデータ交換プロトコル(Data
Exchange Protocol 、略して DEP)である。なお、もう 1 つ ISO-DEP というものもあり、こちらは
ISO/IEC-14443 規定のデータ交換プロトコルとなっている。残念ながら ISO/IEC-14443 は読んだこと
がないため、 ISO-DEP については省略する。
NFC Forum では、 NDEF のデータ交換を行うために、 DEP の上位層に LLCP 、その上に SNEP と
いう層を作っている。その DEP 層として NFC-DEP を使用するようになっている。
NFC-DEP でできること
1 パケット分のデータを、 DEP_REQ / DEP_RES のペイロードに載せて送ること。
DEP_REQ や DEP_RES というのは、無線コマンドの名称である。基本的に、 Initiator が送信するの
は XXX_REQ 、それを受けた Target が返すのが XXX_RES 、となる。また、 REQ や RES がつい
ているのは無線コマンドである。
ペイロードに乗せることができるサイズは、 DEP 前の属性情報交換(ATR_REQ / ATR_RES)で相手
に通知することになる。
・・・ここまで書いてきたが、具体例がないと説明しづらい。かといって概略を書いたとしてもわかりづら
いので、いろいろあきらめて、 NFC リーダライタの RC-S620/S コマンドリファレンスマニュアルと、
ISO/IEC-18092 が手元にある前提で話を進める。なお、 RC-S620/S コマンドリファレンスマニュアル
は、 SONY 社の使用許諾を了承すればダウンロード可能。 ISO/IEC-18092 は無料ダウンロードでき
ないが、それとほぼ同等の内容である ECMA-340 であればダウンロード可能である。
NFC-DEP
LLCP
SNEP
月刊 NDEF 2013 年 8 月号
- 5 -
Passive 通信モードで、自分が Target の場合
RC-S620/S コマンドリファレンスマニュアルを参照しながら NFC-DEP をやろうとすると、自然とこの
組み合わせで実現することになる。
理由は2つ。
・コマンドリファレンスマニュアルには Initiator で DEP モードになるコマンドが書かれていない
・ NFC Foruum ドキュメント(DigitalProtocol v1.0)では、 NFC-DEP は Passive 通信モード
もちろん、 RC-S620/S で Initiator で DEP になるコマンドは存在するのだが、それは何らかの理由で
SONY 社が一般には公開していない。
ストーリー■
1. 自分が Target になって、 Initiator を待つ。
2. Initiator が Target の検索(SDD)をしたら、応答を返す。
3. DEP するなら、 Initiator が ATR_REQ を投げる。
4. 自分は ATR_REQ の中身を確認し、 ATR_RES を返す。
この手順は RC-S620/S の手順というわけではなく、 NFCIP-1 で規定されているものである。
ここまで行えば、あとは DEP_REQ / RES を使ってデータ交換するだけとなる。
では、順番に見ていこう。
1. 自分が Target になって、 Initiator を待つ
NFC R/W は、コマンドによって自分が Initiator になるか Target になるかを選択することができる。こ
こでは自分が NFC タグのような Target になり、他の R/W から検出されるのを待つ。
Target になると、自分からはデータ送信ができないような気がするかもしれないが、 LLCP 層が上位
に載り、それがデータ方向の管理などを行っているため、気にする必要はない。
Android の場合、全員が Target になってしまうと誰も Initiator 役がいなくなってしまうため、定期的に
Initiator と Target を切り替えていると思われる。
Target Initiator
月刊 NDEF 2013 年 8 月号
- 6 -
RC-S620/S は、コマンド"TgInitTarget"を使用することで Target 状態になることができる。このコマン
ドはパラメータが難しい(と私は思う)。
Table 2-1 TgInitTarget コマンドのパラメータ
Activated 制限 0x02 。おそらく「 DEP 専用モード」を表す値と思われる。
106kbpsParams Initiator が 106kbps として SDD してきたときに返す値。
SENS_RES 0x00 0x04 、などか?
NFCID1 が single というところを指定すればいい
ような気もする。
nfcid11 ~ 13 NFCID1 の下位 3byte を指定する。
SDD で NFCID1 を取得した場合、最上位の
1byte は 0x08(DEP)を返す。
SEL_RES 0x40 とするのがよいだろう。これは、 NFC-DEP
設定になっていることを意味する。
212/424kbpsParams Initiator が 212k/424kbps として SDD してきたときに返す値。
NFCID2t NFCID2(IDm)を 8byte 分指定する。
NFC-DEP 対応にするので「 0x01 0xFE 」で始ま
る 8byte とするのがよい。
PAD PAD(PMm)を 8byte 分指定する。
RFU 2byte 分の空き。となっているが、システムコード
に相当する。
NFCID3t NFCID3 を 10byte 分指定する。
Gt 汎用値。 47byte 分の指定が可能。
月刊 NDEF 2013 年 8 月号
- 7 -
いくつか補足説明をしよう。
NFC-DEP では、 NFCID3 という 10byte の値をセッション ID のようなものとして使う(というほど積極
的には使わないが)。 1 つだけルールがある。 NFC-F の場合、 NFCID2 の 8byte を前半に、残り
2byte は 0x00 で埋めた値を使う。理由は知らないが、 NFC Forum の脚注に記載があった。
ISO/IEC-18092 では、 NFCID1 とも同じような値になるようなことが書かれていた。
そして、 RC-S620/S はセキュアエレメントなどを持っていないので、固有の NFCID1 や NFCID2 が
ない。よって、使うときはだいたいランダム値を使う。セッションを張り直すたびに変更する、くらいやっ
てもよいと思う。
Gt の「 t 」は、 Target の t である。その値については、 NFC-DEP としては気にしていない。ただ、
NDEF を交換するために LLCP を使うのであれば、 Gt について決めごとがある。それについては、
LLCP のところで説明しよう。
ここまで説明を書いてみたが、それでもよくわからないのではないかと思う。自分でも、これを読まされ
て「やれ!」と言われたら、わからんだろう。
2. Initiator が Target の検索(SDD)をしたら、応答を返す
自分は Target になっているので、 Initiator からの要求がない限りは動くことができない。ここでは、
Initiator が Target を検索する手順を説明する。
「 SDD 」は、 Single Device Detection の略で、文字通り 1 枚のデバイスを検出するためのしくみだ。
これについては、 NFCIP-1 でもページを割いて説明している。
幸いなことに、 RC-S620/S のような NFC R/W を使用する場合、有線コマンドでデバイス検出を指示
すると、ある程度までは自動的に SDD を行ってくれる。例えば NFC-A の UID サイズが 4byte,
7byte, 10byte と 3 種類あり、無線コマンドとしては Tag の種類によって何度か取得を繰り返すのだ
が、このあたりも R/W が自動的に行ってくれる。
月刊 NDEF 2013 年 8 月号
- 8 -
NFC R/W に指示するのは、「 InListPassiveTarget 」という、 Passive な Target のリストを取得する
コマンドになる(リスト、と呼んではいるが、 RC-S620/S では最大 1 台までの検出になる)。パラメータ
として、通信速度(BRTY)や Initiator データ(InitiatorData)などを設定する。
コマンドリファレンスマニュアルに「 BRTY=01h / 02h の場合」と何度も書かれているように、 BRTY
には 0x01 や 0x02 以外の値も設定可能であるが、指定値以外の値を説明するのはやめておく。
NFC R/W を使ったオープンソースのプロジェクトはいろいろあるので、その実装から見ていくとよいだ
ろう。
InListPassiveTarget コマンドを使うと、 NFC-A の場合は無線コマンド「 SENS_REQ 」、 NFC-F の
場合は「 POL_REQ 」を送信する。コマンドリファレンスマニュアルの TgInitTarget にある「 TargetID
取得コマンド」である。
Target はそれを受信すると、それぞれ「 SENS_RES 」か「 POL_RES 」を返す。このときに返す値
は、 TgInitTarget であらかじめ設定した値である。 TargetID 取得コマンドが来続ける限り、 NFC
R/W は TgInitTarget の動作を続けてくれる。
Passive 通信モードの処理フローに従えば、この次のコマンドは以下のどれかになる。
ATR_REQ コマンド・
RLS_REQ コマンド・
それ以外のコマンド・
「それ以外のコマンド」は、プロプライエタリなコマンド、つまり MIFARE や FeliCa などのコマンドとみ
なす。 DEP としては、次に ATR_REQ が来ることを期待している。あるいは中断のために
RLS_REQ が来る可能性もある。
TargetID 取得コマンド以外を受信すると、 TgInitTarget は Target モードに遷移し、 Initiator からの
受信データを返す。その受信データの解析は自分で行うことになる。
Initiator待ち Target状態他コマンド
TargetID取得コマンド
月刊 NDEF 2013 年 8 月号
- 9 -
3. DEP するなら、 Initiator が ATR_REQ を投げる
ATR_REQ は属性要求コマンドで、 NFCID3 や 1 回の DEP コマンドで送受信できるバッファのサイ
ズ情報などを伝えるものである。 TgInitTarget コマンドは Target モードに遷移する際、 Initiator の
ATR_REQ パラメータを返してくれる。
Table 2-2 ATR_REQ のパラメータ
nfcid3i0 ~ 9 NFCID3 を 10byte 分指定する。
DIDi 複数 Target 時に使うようである。
LLCP では使用しないので、 0x00 。
BSi send-bit rates の略のようである。
Digital Protocol では、 0x00 。
BRi receive-bit rates の略のようである。
こちらも同じく、 0x00 。
PPi オプションパラメータ。
LRi 転送データの範囲(2bit)。
LLCP では、 11(0 ~ 254byte)。
※ NFCIP-1 では 0 ~ 255byte となっている
Gi LLCP では使用するので、 1 。
NAD LLCP では使用しないので、 0 。
Gi 汎用値。 LLCP では使用する。
月刊 NDEF 2013 年 8 月号
- 10 -
なお、これは Passive 通信モードで動作する場合の流れであり、 Active 通信モードで動作する場合
はこうではない。 Initiator は InListPassiveTarget を使わず、 ATR_REQ を送信するためのコマンド
を使う。 Target は、最初に来たコマンドが SDD 用のコマンドか、 ATR_REQ なのかを判断して、
Initiator が期待するのが Passive 通信モードなのか Active 通信モードなのかを判断することになる
(コマンドリファレンスマニュアルの図 8-3 参照)。
また、 Initiator で動かしたいときは「 InListPassiveTarget 」と「 ATR_REQ を送信するコマンド」をそ
れぞれ使うことになるが、便利なように両者が 1 つになったコマンドも存在する。これはコマンドリファ
レンスマニュアルに書かれていないので、ここでも割愛する。
4. 自分は ATR_REQ の中身を確認し、 ATR_RES を返す
ATR_REQ の値が期待するものかどうかをチェックし、期待通りであれば ATR_RES を返す。
ATR_RES のパラメータはだいたい ATR_REQ と同じであるが、 TO というパラメータが追加されてい
る。これは Initiator から DEP_REQ を受けとってから、 Target が DEP_RES を返すまでの待機時間
である。
何に使うかというと、 Target が DEP_RES を返すのに時間がかかるとき、 Initiator に対して「もうちょ
っと待って」という値を返す目安の時間だそうである。 RC-S620/S では RFConfiguration コマンドに
よって設定するので、タイムアウトすると自動的に返信してくれそうな気がする。
Initiator は ATR_RES を受信すると、同じようにパラメータ解析して、期待するものかどうかをチェック
し、問題がなければ DEP 通信を開始する。
あっさりと書いていったが、実は TgInitTarget コマンドは、デフォルトでは自動的に ATR_RES を返す
ようになっている。 ATR_REQ のパラメータをチェックして動作を変えるためには、自動で返す設定を
OFF にし、自分で別のコマンドを使って返すようにする。
SetParameters コマンドによって、 ATR_RES を自動で返さないようにできる。その設定にした場合、
ATR_REQ を受けとると、 Target モードだけど DEP モードではなく、かつ ATR_RES を返さないとい
けない、という中途半端な状態に陥る(RC-S620/S では「モード 2 」と呼ばれる。このときに
TgSetGeneralBytes コマンドで ATR_RES データを設定すると、 RC-S620/S が ATR_RES を返し
てくれる。
月刊 NDEF 2013 年 8 月号
- 11 -
Table 2-3 ATR_RES のパラメータ
nfcid3t0 ~ 9 NFCID3 を 10byte 分指定する。
DIDt 複数 Target 時に使うようである。
LLCP では使用しないので、 0x00 。
BSt send-bit rates の略のようである。
Digital Protocol では、 0x00 。
BRt receive-bit rates の略のようである。
こちらも同じく、 0x00 。
TO Target が応答を返すまでのタイムアウト時間。
RWT = (256 x 16 / fc) x 2
WT
RC-S620/S では RFConfiguration コマンドの CfgItem=82h と関連が
ある値となる(DEP モードになったら設定できないので、その前に設定
しておく)。
PPt オプションパラメータ。
LRt 転送データの範囲(2bit)。
LLCP では、 11(0 ~ 254byte)。
※ NFCIP-1 では 0 ~ 255byte となっている
Gt LLCP では使用するので、 1 。
NAD LLCP では使用しないので、 0 。
Gt 汎用値。 LLCP では使用する。
月刊 NDEF 2013 年 8 月号
- 12 -
RC-S620/S のモード■
コマンドリファレンスマニュアルを読むと、ところどころ「モード」という言葉が出てくる。
これは、 RC-S620/S がどういうモードにいるかの説明で、モードによって使用できるコマンドが変わっ
てくる。
Figure 2-1 RC-S620/S のモード
月刊 NDEF 2013 年 8 月号
- 13 -
NFC-DEP できるようになったが・・・
こ こ ま で 来 る と 、 Initiator か ら の DEP_REQ を 待 ち 受 け ら れ る よ う に な る 。 コ マ ン ド は
「 TgGetDEPData 」で、これを設定すると Initiator 待ちとなる。 Initiator から DEP_REQ を受信する
と受信データを返してくるので、内容に応じて「 TgSetDEPData 」を設定すると、 RC-S620/S が
DEP_RES を返してくれる。
タイムアウトや終了のさせ方などはあるものの、基本的にはこれだけである。
NFC-DEP で行えるのは、単なるデータを交換する、ということだけなので、どういうデータをやりとりし
たいか、とか、どうやってやりとりしたいか、のような意思はそこにない。
それを補足するため、上位層に LLCP を用意し、 Initiator と Target が対等となる通信ができるように
なっている。
対等!
月刊 NDEF 2013 年 8 月号
- 14 -
第3章 LLCPって?
LLCP の位置づけ
NFC-DEP は、データを交換するための物理的な経路のようなものである。
それに対して LLCP(Logical Link Control Protocol)は、論理的な通信と言えばよいだろうか。
「 NFC-DEP を使って、こうやって通信すればうまくいく」という決めごとである。
そういう意味では、 LLCP の上位層(今回は SNEP)からすると、 LLCP が NFC-DEP を使おうが
ISO-DEP を使おうが、あまり関係はない。 NFC Forum でのルールとしてそうなっているというだけの
ことである。
IEEE802.2 に「 LLC 副層」というものがある。このあたりに通じていると、多少理解が早いかもしれな
い。私は通じていないので、どうなのかあまり判断ができない・・・。
なお、その下位である「 MAC 副層」は NFC-DEP になる。
LLCP について1つ1つ説明していくと、かなりな量になってしまい、私が疲れる。ここでは、上位層で
ある SNEP だけのために LLCP を実装することについて考えることにする。
NRM と ABM
通常の NFC 通信では、 Initiator が要求を出し、それに対して Target が応答を返すようになってい
る。これを「 Normal Response Mode 」(NRM)と呼んでいる。
しかし LLCP では Initiator も Target も関係なく通信を行いたい。そのため、 Initiator は用がないとき
でも Target に要求を投げ、 Target がいつでも応答が返せるような状態を作り出すことにする。この
通信状態を「 Asynchrnous Balanced Mode 」(ABM)と呼んでいる。
ボールを一人が持ったままにならないようにキャッチボールを続けるようなものである。
月刊 NDEF 2013 年 8 月号
- 15 -
PDU
これから「 PDU 」という言葉がよく出てくるようになる。 Protocol Data Unit の略で、 LLCP でやりとり
するデータの単位と思ってもらえばよい。
PDU には種類がいくつかある。 4bit の数字で表すので、空きも含めて 16 まである。
SAP
「 SAP 」という言葉も出てくる。 Service Access Points の略で、「 HTTP は 80 」みたいなイメージで
思っておけばよい。 6bit の値。
Source と Destination があり、それぞれ SSAP 、 DSAP と呼ぶ。
Table 3-1 SAP 値
0x00 - 0x0F Well-known な SAP 。 NFC Forum で決めている。
0x00 : LLC Link Management component 用
0x01 : Service Discovery Protocol 用
0x04 : SNEP 用
0x10 - 0x1F SDP で見つけたときに割り振る番号?
0x20 - 0x3F LLCP より上位層で決定した番号?
正直なところ、よくわかっていない。。。
後ほど、実例で説明する。
Connectionless と Connection-oriented
大きく2つの通信がある。 Connectionless と Connection-oriented だ。 UDP と TCP の関係にあると
思っている。
ど ち ら に す る か は 、 接 続 時 に 決 定 す る 。 SNEP は Connection-oriented な の で 、 こ こ で も
Connection-oriented のみ説明する。
なお、 Connectionless の場合は UI PDU を、 Connection-oriented の場合は I PDU を使う。
月刊 NDEF 2013 年 8 月号
- 16 -
Link Activation
LLCP では、まず NFC-DEP の接続を行う。"Link Activation"と呼んでいる。
Figure 3-1 の四角で囲んだ部分が NFC-DEP の接続シーケンスとなる。
LLCP で接続する場合、 ATR_REQ の Gi および ATR_RES の Gt に特定のデータを設定する。
Figure 3-1 Link Activation Procedure
LLCP Magic Number■
0x46 0x66 0x6d 、の 3byte を設定する。文字通りマジックナンバーで意味はない(ASCII コードなら
"Ffm"になる)。
PDU■
Magic Number に続けて、 PDU が続く。お互いが使っている LLCP のバージョンを確認するため、最
低でも 1 つの PAX PDU が必要になる。
Magic Number に問題がなく、 LLCP バージョンにも問題がなければ Link Activation 完了となる。
月刊 NDEF 2013 年 8 月号
- 17 -
送信するまでの間
LLCP ド キ ュ メ ン ト で は 「 Normal Operation 」 状 態 に な る 。 こ こ か ら Connectionless か
Connection-oriented かに分かれる。ここでは Connection-oriented のみ説明する。
この段階では、まだどちらがデータを送信したいのかが決定していない。 Android 端末で言えば、端
末同士を向かい合わせて星が流れる画面になったところである。
ここでタップをすると、そちら側が送信元になる。
それまでの間何をしているかというと、 SYMM PDU をお互いに送り合っている。 NFC の通信上、
Initiator が要求を出して Target がその応答を返す、という形は崩せないが、 Initiator は SYMM
PDU の入った DEP_REQ をひたすら送ることで、 Target からデータを渡してもらえるようにしてい
る。
送信開始
送信する側は、相手からの SYMM PDU に対して CONNECT PDU を送り返す。
CONNECT PDU を受けとった方は、応答として CC PDU を返す。
Figure 3-2 Initiator から送信
月刊 NDEF 2013 年 8 月号
- 18 -
Figure 3-3 Target から送信
私が SNEP する場合、 CONNECT PDU の SSAP 、 DSAP として 0x04(SNEP)を指定し、 CC
PDU でも SSAP 、 DSAP が 0x04 を返すようにしている。
ただ、別のライブラリでテストしていたとき、 CONNECT PDU では SSAP=0x04 、 DSAP=0x01 を指
定し、 ServiceName として"urn:nfc:sn:snep"と、名前で SNEP を指定しないと動かないものがあっ
た。そうすると CC で SSAP 、 DSAP ともに 0x04 が返ってくるようになった。
このあたりはライブラリ実装依存なのか、単に私のドキュメント読み込みが甘いのか判断しづらい。
接続から送信まで
1パケットのデータを送信するシーケンスとして、 Initiator(Figure 3-4)、 Target(Figure 3-5)をそれぞ
れ示す。
データは I PDU に載せる。受けとった方は、他に送りたいデータがないかを RR PDU で確認する。
もう送るものがなければ、 DISC PDU で切断しに行く。
月刊 NDEF 2013 年 8 月号
- 19 -
Figure 3-4 Initiator から送信
月刊 NDEF 2013 年 8 月号
- 20 -
Figure 3-5 Target から送信
ただ、私はまだ I PDU を何度もやりとりする実装をしたことがない。
URL を送るような用途であれば、だいたいは I PDU を 1 回だけ送信すれば済む。そういう実装であ
れば比較的容易ということがわかっていただけるかと思う。
では I PDU に何を載せるかとなると、それが SNEP になる。
月刊 NDEF 2013 年 8 月号
- 21 -
第4章 SNEPって?
SNEP の位置づけ
NFC-DEP が物理層、 LLCP が論理層とするならば、 SNEP はアプリケーション層くらいになるだろう
か。
あまり難しく考えずに言えば、 SNEP は NDEF を送受信するためのプロトコルである。
方式
SNEP は、 Client-Server 方式の通信である。やれることは「 NDEF を送りつける(PUT)」と「 NDEF
をもらう(GET)」である。
Figure 4-1 SNEP
分割する送信も可能になっているが、パケットに載せるデータ長が 4byte あることから考えると、ほと
んど使うことはないように思う。 LLCP の I PDU に 1 回で載らないようなデータ量であれば、 LLCP
層ががんばって I PDU を分割して送信する、というしくみになるだろう。
がんばれ LLCP!!
月刊 NDEF 2013 年 8 月号
- 22 -
まとめ
NFC-DEP 、 LLCP 、 SNEP と順に見ていった。
書いていってわかったが、私の勉強不足が目立つ。 LLCP に至って
は、まだ v1.0 のドキュメントまでしか読んでおらず、現在の最新であ
る v1.1 には言及できていない。
1 年ぶりに DEP 関係を調べたのでネットも検索したが、あまりヒット
するものはなかった。確かに、 NFC の使い方としてはタグに読み書
きするのが花形のように思う。しかし、データ交換経路としての NFC
も魅力的だと思う私にとっては、もうちょっとやってる人が増えてほし
いなあ、とも感じる。
いや、今は水面下で調査や作成を行っていて、 Android 以外の端末でも NFC が標準になったときに
公開しよう、とがんばっているところかもしれない。
NFC は、サービスについてや、無線について話をすることが多く、ソフトウェア的にどうのこうのという
ところがあまり出てこないように思うので、ちょっとでも興味を持ってもらえればな、と思いましたとさ。
2013/08/17
月刊 NDEF 2013 年 8 月号

Mais conteúdo relacionado

Mais procurados

ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
Drecom Co., Ltd.
 
FeliCa Liteの片側認証
FeliCa Liteの片側認証FeliCa Liteの片側認証
FeliCa Liteの片側認証
Hirokuma Ueno
 

Mais procurados (20)

UnboundとDNSSEC(OSC2011 Tokyo/Spring)
UnboundとDNSSEC(OSC2011 Tokyo/Spring)UnboundとDNSSEC(OSC2011 Tokyo/Spring)
UnboundとDNSSEC(OSC2011 Tokyo/Spring)
 
nftables: the Next Generation Firewall in Linux
nftables: the Next Generation Firewall in Linuxnftables: the Next Generation Firewall in Linux
nftables: the Next Generation Firewall in Linux
 
さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)さいきんの InnoDB Adaptive Flushing (仮)
さいきんの InnoDB Adaptive Flushing (仮)
 
JANOG43 Forefront of SRv6, Open Source Implementations
JANOG43 Forefront of SRv6, Open Source ImplementationsJANOG43 Forefront of SRv6, Open Source Implementations
JANOG43 Forefront of SRv6, Open Source Implementations
 
スイッチ・ルータのしくみ
スイッチ・ルータのしくみスイッチ・ルータのしくみ
スイッチ・ルータのしくみ
 
アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門アクセスプラン(実行計画)の読み方入門
アクセスプラン(実行計画)の読み方入門
 
nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話nfcpy 0.10.0 でハマった話
nfcpy 0.10.0 でハマった話
 
02 第3.1節-第3.5節 ROS2の基本機能(1/2) ROS2勉強合宿 @別府温泉
02 第3.1節-第3.5節 ROS2の基本機能(1/2) ROS2勉強合宿 @別府温泉02 第3.1節-第3.5節 ROS2の基本機能(1/2) ROS2勉強合宿 @別府温泉
02 第3.1節-第3.5節 ROS2の基本機能(1/2) ROS2勉強合宿 @別府温泉
 
SRv6 study
SRv6 studySRv6 study
SRv6 study
 
Openv switchの使い方とか
Openv switchの使い方とかOpenv switchの使い方とか
Openv switchの使い方とか
 
ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術ログ解析を支えるNoSQLの技術
ログ解析を支えるNoSQLの技術
 
Basic of virtual memory of Linux
Basic of virtual memory of LinuxBasic of virtual memory of Linux
Basic of virtual memory of Linux
 
FeliCa Liteの片側認証
FeliCa Liteの片側認証FeliCa Liteの片側認証
FeliCa Liteの片側認証
 
VyOSの開発とか運用の話
VyOSの開発とか運用の話VyOSの開発とか運用の話
VyOSの開発とか運用の話
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
Zebra SRv6 CLI on Linux Dataplane (ENOG#49)
 
ML2/OVN アーキテクチャ概観
ML2/OVN アーキテクチャ概観ML2/OVN アーキテクチャ概観
ML2/OVN アーキテクチャ概観
 
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
つながるロボット 〜分散協調ロボットの開発を加速化するROSの紹介〜
 
xrdpで変える!社内のPC環境
xrdpで変える!社内のPC環境xrdpで変える!社内のPC環境
xrdpで変える!社内のPC環境
 
jemalloc 세미나
jemalloc 세미나jemalloc 세미나
jemalloc 세미나
 

Destaque

NFCIP-1を斜め読み
NFCIP-1を斜め読みNFCIP-1を斜め読み
NFCIP-1を斜め読み
Hirokuma Ueno
 
一人でもSNEP開発
一人でもSNEP開発一人でもSNEP開発
一人でもSNEP開発
Hirokuma Ueno
 
SDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみるSDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみる
Hirokuma Ueno
 
MIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess ConditionsMIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess Conditions
Hirokuma Ueno
 
SNEPは大変だった
SNEPは大変だったSNEPは大変だった
SNEPは大変だった
Hirokuma Ueno
 
About FeliCa Lite(日本語)
About FeliCa Lite(日本語)About FeliCa Lite(日本語)
About FeliCa Lite(日本語)
Hirokuma Ueno
 
Apuntes U. D. 7 préstamos
Apuntes  U. D. 7   préstamosApuntes  U. D. 7   préstamos
Apuntes U. D. 7 préstamos
silamora4
 
Mon wars of religion
Mon wars of religionMon wars of religion
Mon wars of religion
Travis Klein
 

Destaque (20)

月刊NDEF 2013年12月号
月刊NDEF 2013年12月号月刊NDEF 2013年12月号
月刊NDEF 2013年12月号
 
月刊NDEF 5月号
月刊NDEF 5月号月刊NDEF 5月号
月刊NDEF 5月号
 
月刊NDEF 2013年3月号(卒業号)
月刊NDEF 2013年3月号(卒業号)月刊NDEF 2013年3月号(卒業号)
月刊NDEF 2013年3月号(卒業号)
 
月刊NDEF 2013年1月号
月刊NDEF 2013年1月号月刊NDEF 2013年1月号
月刊NDEF 2013年1月号
 
はじめてのNFC
はじめてのNFCはじめてのNFC
はじめてのNFC
 
NFCの汎化
NFCの汎化NFCの汎化
NFCの汎化
 
NFCIP-1を斜め読み
NFCIP-1を斜め読みNFCIP-1を斜め読み
NFCIP-1を斜め読み
 
一人でもSNEP開発
一人でもSNEP開発一人でもSNEP開発
一人でもSNEP開発
 
私とNFC(歴史編)
私とNFC(歴史編)私とNFC(歴史編)
私とNFC(歴史編)
 
SDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみるSDK for NFC Starter Kit(2) 使ってみる
SDK for NFC Starter Kit(2) 使ってみる
 
nRF51のGPIOTEについて
nRF51のGPIOTEについてnRF51のGPIOTEについて
nRF51のGPIOTEについて
 
MIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess ConditionsMIFARE ClassicのAccess Conditions
MIFARE ClassicのAccess Conditions
 
FALPとLLCP
FALPとLLCPFALPとLLCP
FALPとLLCP
 
SNEPは大変だった
SNEPは大変だったSNEPは大変だった
SNEPは大変だった
 
About FeliCa Lite(日本語)
About FeliCa Lite(日本語)About FeliCa Lite(日本語)
About FeliCa Lite(日本語)
 
2016晶片國民身分證簡報
2016晶片國民身分證簡報2016晶片國民身分證簡報
2016晶片國民身分證簡報
 
UIDのことわかってますか? -フォーマット編-
UIDのことわかってますか? -フォーマット編-UIDのことわかってますか? -フォーマット編-
UIDのことわかってますか? -フォーマット編-
 
Apuntes U. D. 7 préstamos
Apuntes  U. D. 7   préstamosApuntes  U. D. 7   préstamos
Apuntes U. D. 7 préstamos
 
Chinese rev thur
Chinese rev thurChinese rev thur
Chinese rev thur
 
Mon wars of religion
Mon wars of religionMon wars of religion
Mon wars of religion
 

Semelhante a 月刊NDEF 2013年8月号

Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419
エイシュン コンドウ
 
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
hiroshi oshiba
 
NFC元年 ~AndroidからみたNFCについて~
NFC元年 ~AndroidからみたNFCについて~NFC元年 ~AndroidからみたNFCについて~
NFC元年 ~AndroidからみたNFCについて~
Kouta Imanaka
 

Semelhante a 月刊NDEF 2013年8月号 (20)

Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419Tremaで構築!中小企業の社内LAN #Tremaday 120419
Tremaで構築!中小企業の社内LAN #Tremaday 120419
 
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
WAN SDN 実践入門! ~ OpenDayLightのPCEP/BGPに触れてみる ~
 
InfiniBand on Debian
InfiniBand on DebianInfiniBand on Debian
InfiniBand on Debian
 
[db tech showcase Tokyo 2014] B23: SSDとHDDの混在環境でのOracleの超効率的利用方法 by 株式会社日立製作...
[db tech showcase Tokyo 2014] B23: SSDとHDDの混在環境でのOracleの超効率的利用方法  by 株式会社日立製作...[db tech showcase Tokyo 2014] B23: SSDとHDDの混在環境でのOracleの超効率的利用方法  by 株式会社日立製作...
[db tech showcase Tokyo 2014] B23: SSDとHDDの混在環境でのOracleの超効率的利用方法 by 株式会社日立製作...
 
20060520.tcp
20060520.tcp20060520.tcp
20060520.tcp
 
第7回勉強会 ネットワークの基礎
第7回勉強会 ネットワークの基礎第7回勉強会 ネットワークの基礎
第7回勉強会 ネットワークの基礎
 
Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4Data-Intensive Text Processing with MapReduce ch4
Data-Intensive Text Processing with MapReduce ch4
 
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
Layer 4 Load Balancer (NAT, IP Tunnelling, DR)
 
VPP事始め
VPP事始めVPP事始め
VPP事始め
 
Hadoop book-2nd-ch3-update
Hadoop book-2nd-ch3-updateHadoop book-2nd-ch3-update
Hadoop book-2nd-ch3-update
 
FD.io VPP事始め
FD.io VPP事始めFD.io VPP事始め
FD.io VPP事始め
 
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
Ryuの遊び方(pica8も併せてもっと楽しく)(2014/1/23修正版)
 
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみようHokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
Hokkaido.cap#2 一般的なプロトコルのパケットを覗いてみよう
 
URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!URIやTEXTをBEAMするアプリを作ったよ!
URIやTEXTをBEAMするアプリを作ったよ!
 
Lagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそばLagopus workshop@Internet weekのそば
Lagopus workshop@Internet weekのそば
 
20220602コンピュータネットワーク.pdf
20220602コンピュータネットワーク.pdf20220602コンピュータネットワーク.pdf
20220602コンピュータネットワーク.pdf
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
NFC元年 ~AndroidからみたNFCについて~
NFC元年 ~AndroidからみたNFCについて~NFC元年 ~AndroidからみたNFCについて~
NFC元年 ~AndroidからみたNFCについて~
 
LoRaWAN 距離検出センサ LDDS75 日本語マニュアル
LoRaWAN 距離検出センサ LDDS75 日本語マニュアルLoRaWAN 距離検出センサ LDDS75 日本語マニュアル
LoRaWAN 距離検出センサ LDDS75 日本語マニュアル
 
Pci express transaction
Pci express transactionPci express transaction
Pci express transaction
 

Mais de Hirokuma Ueno (13)

Nordic nRF51822でBLEしてみました 2
Nordic nRF51822でBLEしてみました 2Nordic nRF51822でBLEしてみました 2
Nordic nRF51822でBLEしてみました 2
 
Nordic nRF51822でBLEしてみました
Nordic nRF51822でBLEしてみましたNordic nRF51822でBLEしてみました
Nordic nRF51822でBLEしてみました
 
About FeliCa Lite-S
About FeliCa Lite-SAbout FeliCa Lite-S
About FeliCa Lite-S
 
旅行カバンとNFC
旅行カバンとNFC旅行カバンとNFC
旅行カバンとNFC
 
NDEF WriterとOSとPaSoRi
NDEF WriterとOSとPaSoRiNDEF WriterとOSとPaSoRi
NDEF WriterとOSとPaSoRi
 
NDEF Writerを使ってみよう
NDEF Writerを使ってみようNDEF Writerを使ってみよう
NDEF Writerを使ってみよう
 
NFC切手
NFC切手NFC切手
NFC切手
 
らくがき
らくがきらくがき
らくがき
 
NFCテルミン
NFCテルミンNFCテルミン
NFCテルミン
 
財布を忘れると困る
財布を忘れると困る財布を忘れると困る
財布を忘れると困る
 
発券機のNFC対応
発券機のNFC対応発券機のNFC対応
発券機のNFC対応
 
About FeliCa Plug
About FeliCa PlugAbout FeliCa Plug
About FeliCa Plug
 
ものに愛着を持たせる
ものに愛着を持たせるものに愛着を持たせる
ものに愛着を持たせる
 

Último

Último (11)

Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

月刊NDEF 2013年8月号

  • 1.
  • 3. - 1 - 第1章 NFCでのデータ交換 はじめに 通信とは、データを交換するためのルールである。だと思う。 幅広く見ていくと、すべては通信で成り立っている。あいさつだって、一種の通信だし、そもそも会話自 体が通信といってもいいだろう。本を読むのだって、本からのデータを受けとっているわけだし、テレビ だってそうだ。 ただ、「データ交換」と銘打った場合、それは通信のためにデータ交換をするのではなく、データ交換 のために通信を行う、ということになる。この特集も、 NFC デバイス同士でデータ交換を行うためにつ いて説明することが中心となる。 いつもと違って、今回は文章がお堅いし、冗長になるかもしれない(冗長なのはいつもか)。それは、私 が「通信」というものに弱く、理解するのに時間がかかったからだ。自信があまりない、と言い換えても いいかもしれない。 そんなわけで、気楽に読んでほしい。なお、このドキュメントでは RC-S620/S でのやり方を書いてい く。他のデバイスの方は適宜読み替えていただきたい。 データ交換のためのプロトコル、 DEP NFC Forum では、 Digital Protocol でいくつかの規定を行っている。大ざっぱにいうと、以下のように なる。 1) Technology : 無 線 通 信 の 方 式 (NFC-A, B, F) 2) Platform : メ モ リ の 方 式 (Type 1, 2, 3, 4A, 4B) 3) Protocol : デ ー タ 交 換 の 方 式(NFC-DEP, ISO-DEP) 今回の話は、 3 番目の「 Protocol 」である。 DEP 、というのは"Data Exchange Protocol"の略であ る。データ交換プロトコル、だ。これを使えば、 NFC でデータ交換できるのである。 そう思って読み進めていたのだが・・・正直なところ、さっぱりわからなかった。かろうじてわかったの は、 NFC-DEP は、 Technology の NFC-A か F 、 ISO-DEP は NFC-A か B 、というところまでだっ た。 NFC-DEP は ISO-18092(NFCIP-1)由来、 ISO-DEP は ISO-14443 由来、というところまではわかっ た。 14443 は入手しづらいが、 18092 は ECMA にもあり、 ECMA は無料ダウンロードできたので、 そこから着手することにした。 月刊 NDEF 2013 年 8 月号
  • 4. - 2 - DEP に時間がかかった私 今にして思えば、 DEP のことを調べようと思ってから、 ISO/IEC にたどりつくまでが長かった。そし て、たどり着いてからも長かった。 言い訳をしておこう。私が持っている NFC のデバイスは、 SONY の RC-S620/S というリーダライタ のみである。このデバイス、いや通常の我々が入手できる既成製品で扱うことができるのは、あくまで 「有線コマンド」、すなわち UART や SPI などでしか操作することができない。そして、 ISO などのドキ ュメントで規定されているのは「無線コマンド」である。まあ、 NFC というのは無線だから仕方ないのだ が。 パソコンを使って印刷をしたいなら、パソコンでプリンタを制御しないといけないのと同じように、 NFC リーダライタで無線コマンドをやりとりしたいのなら、有線コマンドで NFC リーダライタを制御しないと いけないのだ。 NFC リーダライタとのやりとりは有線コマンドになるが、そのコマンドは各社で異なる。 RC-S620/S も そうだった。しかし、 RC-S620/S は当時コマンドのマニュアルが公開されておらず、操作方法がわか らなかった。そのため私は「 NFC Forum に書いてあるコマンドを使えば操作できるのでは?」と思 い、時間を費やしたこともあった。そう、当時の私は、有線コマンドと無線コマンドの違いがわかってい なかったのだ。 いろいろ調べ、 RC-S620/S の有線コマンドがわかり、ずいぶんと操作できるようになったのは比較的 最近のことだ。それでも、無線コマンドを直接操作しているわけではないので、ときどき苦戦することも ある。 まあ、そういうものだと割り切ろう。 操作 印刷 有線 無線 NFC R/W 割り切って 忘れてしまえ 月刊 NDEF 2013 年 8 月号
  • 5. - 3 - ISO/IEC-18092 の DEP 通称、 NFCIP-1 。これを読むのは、なかなかつらい。 ISO/IEC-18092 の DEP は「 NFC-DEP 」と呼 ばれる。 図を見ていって、必要になれば文章を読む、でもよいかもしれない。以下は、 ISO/IEC-18092 を読む ときのポイントだ。 "General initialization and single device detection flow"■ SDD(Single Device Detection"という、デバイスを特定するまでの流れだ。 Passive ルートと Active ルートがあり、 Passive は相手の無線を待つ側、 Acitve は自分で無線を出 す側だ。 ただ、これは Initiator と Target の関係とは少し異なる。通常の NFC は、 Initiator が搬送波を出し、 コマンドを出す。 Target は Initiator からのコマンドを受信し、その搬送波に載せてレスポンスを返す。 ここでの Passive と Active は通信モードのこと。 Passive は片方が無線を出して片方が受けとるとい う今の形だが、 Active はどちらのデバイスも無線を出す。 今のところ、 NFC Forum の Digital Protocol(v1.0)では、 Passive のみサポートすることになってい る。 何となくわかった気分になればよいか。 Activation protocol in Passive communication mode■ これが基本的な Passive での DEP(NFC-DEP)の流れになる。 SDD して、属性要求が来たなら ATR_REQ を送信し、相手からの ATR_RES で相手の属性を取得 する。通信を変更する必要があるなら、 PSL_REQ で変更。 そして、左下で DEP する。これは、中で DEP_REQ と DEP_RES を何度も繰り返す。 通信を終わりたいとき、 DSL_REQ か RLS_REQ を送信する。すると、それぞれによって違う終わり 方をする。 Activation Protocol in Active communication mode■ Active での DEP になるが、 NFC Forum では今のところサポートしていないので省略する。 流れは、 Passive とだいたい同じ。 あとは、 ATR_REQ と ATR_RES の構造を見ておけばよいだろう。見ておかないと、 RC-S620/S の コマンドリファレンスを読んでも、どういう値を返せばいいかわからないことになる。 月刊 NDEF 2013 年 8 月号
  • 6. - 4 - 第2章 NFC-DEPって? NFC-DEP の位置づけ NFC-DEP は NFC Forum での呼び方で、 ISO/IEC-18092 規定のデータ交換プロトコル(Data Exchange Protocol 、略して DEP)である。なお、もう 1 つ ISO-DEP というものもあり、こちらは ISO/IEC-14443 規定のデータ交換プロトコルとなっている。残念ながら ISO/IEC-14443 は読んだこと がないため、 ISO-DEP については省略する。 NFC Forum では、 NDEF のデータ交換を行うために、 DEP の上位層に LLCP 、その上に SNEP と いう層を作っている。その DEP 層として NFC-DEP を使用するようになっている。 NFC-DEP でできること 1 パケット分のデータを、 DEP_REQ / DEP_RES のペイロードに載せて送ること。 DEP_REQ や DEP_RES というのは、無線コマンドの名称である。基本的に、 Initiator が送信するの は XXX_REQ 、それを受けた Target が返すのが XXX_RES 、となる。また、 REQ や RES がつい ているのは無線コマンドである。 ペイロードに乗せることができるサイズは、 DEP 前の属性情報交換(ATR_REQ / ATR_RES)で相手 に通知することになる。 ・・・ここまで書いてきたが、具体例がないと説明しづらい。かといって概略を書いたとしてもわかりづら いので、いろいろあきらめて、 NFC リーダライタの RC-S620/S コマンドリファレンスマニュアルと、 ISO/IEC-18092 が手元にある前提で話を進める。なお、 RC-S620/S コマンドリファレンスマニュアル は、 SONY 社の使用許諾を了承すればダウンロード可能。 ISO/IEC-18092 は無料ダウンロードでき ないが、それとほぼ同等の内容である ECMA-340 であればダウンロード可能である。 NFC-DEP LLCP SNEP 月刊 NDEF 2013 年 8 月号
  • 7. - 5 - Passive 通信モードで、自分が Target の場合 RC-S620/S コマンドリファレンスマニュアルを参照しながら NFC-DEP をやろうとすると、自然とこの 組み合わせで実現することになる。 理由は2つ。 ・コマンドリファレンスマニュアルには Initiator で DEP モードになるコマンドが書かれていない ・ NFC Foruum ドキュメント(DigitalProtocol v1.0)では、 NFC-DEP は Passive 通信モード もちろん、 RC-S620/S で Initiator で DEP になるコマンドは存在するのだが、それは何らかの理由で SONY 社が一般には公開していない。 ストーリー■ 1. 自分が Target になって、 Initiator を待つ。 2. Initiator が Target の検索(SDD)をしたら、応答を返す。 3. DEP するなら、 Initiator が ATR_REQ を投げる。 4. 自分は ATR_REQ の中身を確認し、 ATR_RES を返す。 この手順は RC-S620/S の手順というわけではなく、 NFCIP-1 で規定されているものである。 ここまで行えば、あとは DEP_REQ / RES を使ってデータ交換するだけとなる。 では、順番に見ていこう。 1. 自分が Target になって、 Initiator を待つ NFC R/W は、コマンドによって自分が Initiator になるか Target になるかを選択することができる。こ こでは自分が NFC タグのような Target になり、他の R/W から検出されるのを待つ。 Target になると、自分からはデータ送信ができないような気がするかもしれないが、 LLCP 層が上位 に載り、それがデータ方向の管理などを行っているため、気にする必要はない。 Android の場合、全員が Target になってしまうと誰も Initiator 役がいなくなってしまうため、定期的に Initiator と Target を切り替えていると思われる。 Target Initiator 月刊 NDEF 2013 年 8 月号
  • 8. - 6 - RC-S620/S は、コマンド"TgInitTarget"を使用することで Target 状態になることができる。このコマン ドはパラメータが難しい(と私は思う)。 Table 2-1 TgInitTarget コマンドのパラメータ Activated 制限 0x02 。おそらく「 DEP 専用モード」を表す値と思われる。 106kbpsParams Initiator が 106kbps として SDD してきたときに返す値。 SENS_RES 0x00 0x04 、などか? NFCID1 が single というところを指定すればいい ような気もする。 nfcid11 ~ 13 NFCID1 の下位 3byte を指定する。 SDD で NFCID1 を取得した場合、最上位の 1byte は 0x08(DEP)を返す。 SEL_RES 0x40 とするのがよいだろう。これは、 NFC-DEP 設定になっていることを意味する。 212/424kbpsParams Initiator が 212k/424kbps として SDD してきたときに返す値。 NFCID2t NFCID2(IDm)を 8byte 分指定する。 NFC-DEP 対応にするので「 0x01 0xFE 」で始ま る 8byte とするのがよい。 PAD PAD(PMm)を 8byte 分指定する。 RFU 2byte 分の空き。となっているが、システムコード に相当する。 NFCID3t NFCID3 を 10byte 分指定する。 Gt 汎用値。 47byte 分の指定が可能。 月刊 NDEF 2013 年 8 月号
  • 9. - 7 - いくつか補足説明をしよう。 NFC-DEP では、 NFCID3 という 10byte の値をセッション ID のようなものとして使う(というほど積極 的には使わないが)。 1 つだけルールがある。 NFC-F の場合、 NFCID2 の 8byte を前半に、残り 2byte は 0x00 で埋めた値を使う。理由は知らないが、 NFC Forum の脚注に記載があった。 ISO/IEC-18092 では、 NFCID1 とも同じような値になるようなことが書かれていた。 そして、 RC-S620/S はセキュアエレメントなどを持っていないので、固有の NFCID1 や NFCID2 が ない。よって、使うときはだいたいランダム値を使う。セッションを張り直すたびに変更する、くらいやっ てもよいと思う。 Gt の「 t 」は、 Target の t である。その値については、 NFC-DEP としては気にしていない。ただ、 NDEF を交換するために LLCP を使うのであれば、 Gt について決めごとがある。それについては、 LLCP のところで説明しよう。 ここまで説明を書いてみたが、それでもよくわからないのではないかと思う。自分でも、これを読まされ て「やれ!」と言われたら、わからんだろう。 2. Initiator が Target の検索(SDD)をしたら、応答を返す 自分は Target になっているので、 Initiator からの要求がない限りは動くことができない。ここでは、 Initiator が Target を検索する手順を説明する。 「 SDD 」は、 Single Device Detection の略で、文字通り 1 枚のデバイスを検出するためのしくみだ。 これについては、 NFCIP-1 でもページを割いて説明している。 幸いなことに、 RC-S620/S のような NFC R/W を使用する場合、有線コマンドでデバイス検出を指示 すると、ある程度までは自動的に SDD を行ってくれる。例えば NFC-A の UID サイズが 4byte, 7byte, 10byte と 3 種類あり、無線コマンドとしては Tag の種類によって何度か取得を繰り返すのだ が、このあたりも R/W が自動的に行ってくれる。 月刊 NDEF 2013 年 8 月号
  • 10. - 8 - NFC R/W に指示するのは、「 InListPassiveTarget 」という、 Passive な Target のリストを取得する コマンドになる(リスト、と呼んではいるが、 RC-S620/S では最大 1 台までの検出になる)。パラメータ として、通信速度(BRTY)や Initiator データ(InitiatorData)などを設定する。 コマンドリファレンスマニュアルに「 BRTY=01h / 02h の場合」と何度も書かれているように、 BRTY には 0x01 や 0x02 以外の値も設定可能であるが、指定値以外の値を説明するのはやめておく。 NFC R/W を使ったオープンソースのプロジェクトはいろいろあるので、その実装から見ていくとよいだ ろう。 InListPassiveTarget コマンドを使うと、 NFC-A の場合は無線コマンド「 SENS_REQ 」、 NFC-F の 場合は「 POL_REQ 」を送信する。コマンドリファレンスマニュアルの TgInitTarget にある「 TargetID 取得コマンド」である。 Target はそれを受信すると、それぞれ「 SENS_RES 」か「 POL_RES 」を返す。このときに返す値 は、 TgInitTarget であらかじめ設定した値である。 TargetID 取得コマンドが来続ける限り、 NFC R/W は TgInitTarget の動作を続けてくれる。 Passive 通信モードの処理フローに従えば、この次のコマンドは以下のどれかになる。 ATR_REQ コマンド・ RLS_REQ コマンド・ それ以外のコマンド・ 「それ以外のコマンド」は、プロプライエタリなコマンド、つまり MIFARE や FeliCa などのコマンドとみ なす。 DEP としては、次に ATR_REQ が来ることを期待している。あるいは中断のために RLS_REQ が来る可能性もある。 TargetID 取得コマンド以外を受信すると、 TgInitTarget は Target モードに遷移し、 Initiator からの 受信データを返す。その受信データの解析は自分で行うことになる。 Initiator待ち Target状態他コマンド TargetID取得コマンド 月刊 NDEF 2013 年 8 月号
  • 11. - 9 - 3. DEP するなら、 Initiator が ATR_REQ を投げる ATR_REQ は属性要求コマンドで、 NFCID3 や 1 回の DEP コマンドで送受信できるバッファのサイ ズ情報などを伝えるものである。 TgInitTarget コマンドは Target モードに遷移する際、 Initiator の ATR_REQ パラメータを返してくれる。 Table 2-2 ATR_REQ のパラメータ nfcid3i0 ~ 9 NFCID3 を 10byte 分指定する。 DIDi 複数 Target 時に使うようである。 LLCP では使用しないので、 0x00 。 BSi send-bit rates の略のようである。 Digital Protocol では、 0x00 。 BRi receive-bit rates の略のようである。 こちらも同じく、 0x00 。 PPi オプションパラメータ。 LRi 転送データの範囲(2bit)。 LLCP では、 11(0 ~ 254byte)。 ※ NFCIP-1 では 0 ~ 255byte となっている Gi LLCP では使用するので、 1 。 NAD LLCP では使用しないので、 0 。 Gi 汎用値。 LLCP では使用する。 月刊 NDEF 2013 年 8 月号
  • 12. - 10 - なお、これは Passive 通信モードで動作する場合の流れであり、 Active 通信モードで動作する場合 はこうではない。 Initiator は InListPassiveTarget を使わず、 ATR_REQ を送信するためのコマンド を使う。 Target は、最初に来たコマンドが SDD 用のコマンドか、 ATR_REQ なのかを判断して、 Initiator が期待するのが Passive 通信モードなのか Active 通信モードなのかを判断することになる (コマンドリファレンスマニュアルの図 8-3 参照)。 また、 Initiator で動かしたいときは「 InListPassiveTarget 」と「 ATR_REQ を送信するコマンド」をそ れぞれ使うことになるが、便利なように両者が 1 つになったコマンドも存在する。これはコマンドリファ レンスマニュアルに書かれていないので、ここでも割愛する。 4. 自分は ATR_REQ の中身を確認し、 ATR_RES を返す ATR_REQ の値が期待するものかどうかをチェックし、期待通りであれば ATR_RES を返す。 ATR_RES のパラメータはだいたい ATR_REQ と同じであるが、 TO というパラメータが追加されてい る。これは Initiator から DEP_REQ を受けとってから、 Target が DEP_RES を返すまでの待機時間 である。 何に使うかというと、 Target が DEP_RES を返すのに時間がかかるとき、 Initiator に対して「もうちょ っと待って」という値を返す目安の時間だそうである。 RC-S620/S では RFConfiguration コマンドに よって設定するので、タイムアウトすると自動的に返信してくれそうな気がする。 Initiator は ATR_RES を受信すると、同じようにパラメータ解析して、期待するものかどうかをチェック し、問題がなければ DEP 通信を開始する。 あっさりと書いていったが、実は TgInitTarget コマンドは、デフォルトでは自動的に ATR_RES を返す ようになっている。 ATR_REQ のパラメータをチェックして動作を変えるためには、自動で返す設定を OFF にし、自分で別のコマンドを使って返すようにする。 SetParameters コマンドによって、 ATR_RES を自動で返さないようにできる。その設定にした場合、 ATR_REQ を受けとると、 Target モードだけど DEP モードではなく、かつ ATR_RES を返さないとい けない、という中途半端な状態に陥る(RC-S620/S では「モード 2 」と呼ばれる。このときに TgSetGeneralBytes コマンドで ATR_RES データを設定すると、 RC-S620/S が ATR_RES を返し てくれる。 月刊 NDEF 2013 年 8 月号
  • 13. - 11 - Table 2-3 ATR_RES のパラメータ nfcid3t0 ~ 9 NFCID3 を 10byte 分指定する。 DIDt 複数 Target 時に使うようである。 LLCP では使用しないので、 0x00 。 BSt send-bit rates の略のようである。 Digital Protocol では、 0x00 。 BRt receive-bit rates の略のようである。 こちらも同じく、 0x00 。 TO Target が応答を返すまでのタイムアウト時間。 RWT = (256 x 16 / fc) x 2 WT RC-S620/S では RFConfiguration コマンドの CfgItem=82h と関連が ある値となる(DEP モードになったら設定できないので、その前に設定 しておく)。 PPt オプションパラメータ。 LRt 転送データの範囲(2bit)。 LLCP では、 11(0 ~ 254byte)。 ※ NFCIP-1 では 0 ~ 255byte となっている Gt LLCP では使用するので、 1 。 NAD LLCP では使用しないので、 0 。 Gt 汎用値。 LLCP では使用する。 月刊 NDEF 2013 年 8 月号
  • 14. - 12 - RC-S620/S のモード■ コマンドリファレンスマニュアルを読むと、ところどころ「モード」という言葉が出てくる。 これは、 RC-S620/S がどういうモードにいるかの説明で、モードによって使用できるコマンドが変わっ てくる。 Figure 2-1 RC-S620/S のモード 月刊 NDEF 2013 年 8 月号
  • 15. - 13 - NFC-DEP できるようになったが・・・ こ こ ま で 来 る と 、 Initiator か ら の DEP_REQ を 待 ち 受 け ら れ る よ う に な る 。 コ マ ン ド は 「 TgGetDEPData 」で、これを設定すると Initiator 待ちとなる。 Initiator から DEP_REQ を受信する と受信データを返してくるので、内容に応じて「 TgSetDEPData 」を設定すると、 RC-S620/S が DEP_RES を返してくれる。 タイムアウトや終了のさせ方などはあるものの、基本的にはこれだけである。 NFC-DEP で行えるのは、単なるデータを交換する、ということだけなので、どういうデータをやりとりし たいか、とか、どうやってやりとりしたいか、のような意思はそこにない。 それを補足するため、上位層に LLCP を用意し、 Initiator と Target が対等となる通信ができるように なっている。 対等! 月刊 NDEF 2013 年 8 月号
  • 16. - 14 - 第3章 LLCPって? LLCP の位置づけ NFC-DEP は、データを交換するための物理的な経路のようなものである。 それに対して LLCP(Logical Link Control Protocol)は、論理的な通信と言えばよいだろうか。 「 NFC-DEP を使って、こうやって通信すればうまくいく」という決めごとである。 そういう意味では、 LLCP の上位層(今回は SNEP)からすると、 LLCP が NFC-DEP を使おうが ISO-DEP を使おうが、あまり関係はない。 NFC Forum でのルールとしてそうなっているというだけの ことである。 IEEE802.2 に「 LLC 副層」というものがある。このあたりに通じていると、多少理解が早いかもしれな い。私は通じていないので、どうなのかあまり判断ができない・・・。 なお、その下位である「 MAC 副層」は NFC-DEP になる。 LLCP について1つ1つ説明していくと、かなりな量になってしまい、私が疲れる。ここでは、上位層で ある SNEP だけのために LLCP を実装することについて考えることにする。 NRM と ABM 通常の NFC 通信では、 Initiator が要求を出し、それに対して Target が応答を返すようになってい る。これを「 Normal Response Mode 」(NRM)と呼んでいる。 しかし LLCP では Initiator も Target も関係なく通信を行いたい。そのため、 Initiator は用がないとき でも Target に要求を投げ、 Target がいつでも応答が返せるような状態を作り出すことにする。この 通信状態を「 Asynchrnous Balanced Mode 」(ABM)と呼んでいる。 ボールを一人が持ったままにならないようにキャッチボールを続けるようなものである。 月刊 NDEF 2013 年 8 月号
  • 17. - 15 - PDU これから「 PDU 」という言葉がよく出てくるようになる。 Protocol Data Unit の略で、 LLCP でやりとり するデータの単位と思ってもらえばよい。 PDU には種類がいくつかある。 4bit の数字で表すので、空きも含めて 16 まである。 SAP 「 SAP 」という言葉も出てくる。 Service Access Points の略で、「 HTTP は 80 」みたいなイメージで 思っておけばよい。 6bit の値。 Source と Destination があり、それぞれ SSAP 、 DSAP と呼ぶ。 Table 3-1 SAP 値 0x00 - 0x0F Well-known な SAP 。 NFC Forum で決めている。 0x00 : LLC Link Management component 用 0x01 : Service Discovery Protocol 用 0x04 : SNEP 用 0x10 - 0x1F SDP で見つけたときに割り振る番号? 0x20 - 0x3F LLCP より上位層で決定した番号? 正直なところ、よくわかっていない。。。 後ほど、実例で説明する。 Connectionless と Connection-oriented 大きく2つの通信がある。 Connectionless と Connection-oriented だ。 UDP と TCP の関係にあると 思っている。 ど ち ら に す る か は 、 接 続 時 に 決 定 す る 。 SNEP は Connection-oriented な の で 、 こ こ で も Connection-oriented のみ説明する。 なお、 Connectionless の場合は UI PDU を、 Connection-oriented の場合は I PDU を使う。 月刊 NDEF 2013 年 8 月号
  • 18. - 16 - Link Activation LLCP では、まず NFC-DEP の接続を行う。"Link Activation"と呼んでいる。 Figure 3-1 の四角で囲んだ部分が NFC-DEP の接続シーケンスとなる。 LLCP で接続する場合、 ATR_REQ の Gi および ATR_RES の Gt に特定のデータを設定する。 Figure 3-1 Link Activation Procedure LLCP Magic Number■ 0x46 0x66 0x6d 、の 3byte を設定する。文字通りマジックナンバーで意味はない(ASCII コードなら "Ffm"になる)。 PDU■ Magic Number に続けて、 PDU が続く。お互いが使っている LLCP のバージョンを確認するため、最 低でも 1 つの PAX PDU が必要になる。 Magic Number に問題がなく、 LLCP バージョンにも問題がなければ Link Activation 完了となる。 月刊 NDEF 2013 年 8 月号
  • 19. - 17 - 送信するまでの間 LLCP ド キ ュ メ ン ト で は 「 Normal Operation 」 状 態 に な る 。 こ こ か ら Connectionless か Connection-oriented かに分かれる。ここでは Connection-oriented のみ説明する。 この段階では、まだどちらがデータを送信したいのかが決定していない。 Android 端末で言えば、端 末同士を向かい合わせて星が流れる画面になったところである。 ここでタップをすると、そちら側が送信元になる。 それまでの間何をしているかというと、 SYMM PDU をお互いに送り合っている。 NFC の通信上、 Initiator が要求を出して Target がその応答を返す、という形は崩せないが、 Initiator は SYMM PDU の入った DEP_REQ をひたすら送ることで、 Target からデータを渡してもらえるようにしてい る。 送信開始 送信する側は、相手からの SYMM PDU に対して CONNECT PDU を送り返す。 CONNECT PDU を受けとった方は、応答として CC PDU を返す。 Figure 3-2 Initiator から送信 月刊 NDEF 2013 年 8 月号
  • 20. - 18 - Figure 3-3 Target から送信 私が SNEP する場合、 CONNECT PDU の SSAP 、 DSAP として 0x04(SNEP)を指定し、 CC PDU でも SSAP 、 DSAP が 0x04 を返すようにしている。 ただ、別のライブラリでテストしていたとき、 CONNECT PDU では SSAP=0x04 、 DSAP=0x01 を指 定し、 ServiceName として"urn:nfc:sn:snep"と、名前で SNEP を指定しないと動かないものがあっ た。そうすると CC で SSAP 、 DSAP ともに 0x04 が返ってくるようになった。 このあたりはライブラリ実装依存なのか、単に私のドキュメント読み込みが甘いのか判断しづらい。 接続から送信まで 1パケットのデータを送信するシーケンスとして、 Initiator(Figure 3-4)、 Target(Figure 3-5)をそれぞ れ示す。 データは I PDU に載せる。受けとった方は、他に送りたいデータがないかを RR PDU で確認する。 もう送るものがなければ、 DISC PDU で切断しに行く。 月刊 NDEF 2013 年 8 月号
  • 21. - 19 - Figure 3-4 Initiator から送信 月刊 NDEF 2013 年 8 月号
  • 22. - 20 - Figure 3-5 Target から送信 ただ、私はまだ I PDU を何度もやりとりする実装をしたことがない。 URL を送るような用途であれば、だいたいは I PDU を 1 回だけ送信すれば済む。そういう実装であ れば比較的容易ということがわかっていただけるかと思う。 では I PDU に何を載せるかとなると、それが SNEP になる。 月刊 NDEF 2013 年 8 月号
  • 23. - 21 - 第4章 SNEPって? SNEP の位置づけ NFC-DEP が物理層、 LLCP が論理層とするならば、 SNEP はアプリケーション層くらいになるだろう か。 あまり難しく考えずに言えば、 SNEP は NDEF を送受信するためのプロトコルである。 方式 SNEP は、 Client-Server 方式の通信である。やれることは「 NDEF を送りつける(PUT)」と「 NDEF をもらう(GET)」である。 Figure 4-1 SNEP 分割する送信も可能になっているが、パケットに載せるデータ長が 4byte あることから考えると、ほと んど使うことはないように思う。 LLCP の I PDU に 1 回で載らないようなデータ量であれば、 LLCP 層ががんばって I PDU を分割して送信する、というしくみになるだろう。 がんばれ LLCP!! 月刊 NDEF 2013 年 8 月号
  • 24. - 22 - まとめ NFC-DEP 、 LLCP 、 SNEP と順に見ていった。 書いていってわかったが、私の勉強不足が目立つ。 LLCP に至って は、まだ v1.0 のドキュメントまでしか読んでおらず、現在の最新であ る v1.1 には言及できていない。 1 年ぶりに DEP 関係を調べたのでネットも検索したが、あまりヒット するものはなかった。確かに、 NFC の使い方としてはタグに読み書 きするのが花形のように思う。しかし、データ交換経路としての NFC も魅力的だと思う私にとっては、もうちょっとやってる人が増えてほし いなあ、とも感じる。 いや、今は水面下で調査や作成を行っていて、 Android 以外の端末でも NFC が標準になったときに 公開しよう、とがんばっているところかもしれない。 NFC は、サービスについてや、無線について話をすることが多く、ソフトウェア的にどうのこうのという ところがあまり出てこないように思うので、ちょっとでも興味を持ってもらえればな、と思いましたとさ。 2013/08/17 月刊 NDEF 2013 年 8 月号