Contenu connexe
Similaire à 一人でもSNEP開発 (20)
Plus de Hirokuma Ueno (17)
一人でもSNEP開発
- 2. SNEP って?
● Simple NDEF Exchange Protocol
● 「簡単に NDEF を交換しよう」プロトコル
● 「交換」だけど、一方向
– 片方が送信して、片方が受信する
– それを繰り返すと交換もできる
- 3. NDEF って?
● NFC Data Exchange Format
● データ交換するときのフォーマット
– NFC カードに NDEF 形式で書き込む
● NFC R/W で読み込む
– SNEP で NDEF データを転送する
– SNEP で NDEF データを受信する
- 4. SNEP を使う利点は?
● NFC 端末同士で NDEF データを交換できる
– NFC カードを必要としない
– 容量制限がない
● 人間の忍耐が必要になるかもしれんが…
● 動的なデータ作成が可能
– 状況に応じたデータを送信
● Android Beam のような使い方
- 5. 実際はどうやるの?
● NFC 端末同士の通信
– NFC は数 cm の距離でしか通信しない
– つまり、端末を向かい合わせる必要がある
● 向かい合わせる方法
– 2 台の端末を一人が持つ
● 確実だけど、相手に渡すのはイヤだ
– 二人で向かい合わせる
● 安心だけど、長時間はきつい
- 6. 自分から相手へ転送する
● 自分アプリが NDEF データを作る
● 自分アプリが、 SNEP PUT で転送
● 相手アプリが、受信
● 相手アプリが、 NDEF データ解析
SNEP SNEP
application application
- 7. 相手にデータを要求する
● 自分アプリが、 SNEP GET で転送要求
● 相手アプリが、 NDEF 転送
● 自分アプリが受信して、 NDEF データ解析
SNEP SNEP
application application
- 9. SNEP の下
● SNEP は「 NDEF 交換のためのプロトコル」
● その下に、通信制御する「 LLCP 」がいる
● NFC Forum で規定されている
SNEP SNEP
LLCP LLCP
- 10. LLCP の下
● LLCP は通信制御プロトコル
● その下にデータ交換の「 NFC-DEP 」がいる
● NFCIP-1 のデータ交換プロトコル
LLCP LLCP
NFC-DEP
- 11. SNEP の実装をするとき
● SNEP を作りたいと思ったら…
– LLCP の実装
– NFC-DEP の実装
● 下から順に作っていこう
– そして順番に動作確認していく
- 12. もう少し細かい話をします。
RC-S956 に実装したときの話です。
RC-S620/S のコマンドリファレンスマニュアルを見て、
そこにないものは PN533 のマニュアルから情報を得ています。
よって「正しいのか?」といわれると、よくわからないです。
- 13. RC-S956 とは
● PaSoRi RC-S370 や RC-S620/S に搭載され
ている FeliCa チップ
– RC-S330 も、おそらくそう
– RC-S320 は、たぶん違う
● NFC R/W 用チップ
– モバイル用のチップではない
- 14. NFC-DEP
● NFCIP-1 でのデータ交換プロトコル
– 「 NFC-DEP 」という名前は、 NFC Forum の名称
● データ交換方法
– DEP_REQ と DEP_RES を使っている
● データ交換の前に「接続」という作業がある
– ATR_REQ と ATR_RES で行う
● 接続の前に通信設定をしなくては
– Initiator か Target か
– Active か Passive か
– 通信速度
- 15. NFC-DEP の実装
● RC-S956 がけっこうやってくれる
● Target になるとき
– TgInitTarget コマンドを使う
● 通信設定は Initiator まかせ
– ATR_REQ や RLS_REQ は自分で処理する
– GeneralBytes は、自分でさばく
● データは LLCP によって決められている
● Initiator になるとき
– InJumpForDEP コマンドを使うと楽
● 通信パラメータは自分で考える
– ATR_RES は自分で処理する
– GeneralBytes は、自分でさばく
– データ転送は InDataExchange コマンドを使うと楽
- 16. LLCP
● DEP に載せるデータなので、 DEP 方式には依存しないが、 NFC
Forum が「 LLCP は NFC-DEP を使う」となっている。
● IEEE 802.2 と近いものがあるようだ
● NFC-DEP は Initiator→Target へ送信し、 Target が Initiator に
返信するという NRM 通信 (Normal Response Mode) だが、 LLCP
は双方で交換する ABM(Asynchronous Balanced Mode) 通信を
行う。
– 転送するデータがないときには相手に送信権を渡す
●「転送するものがないよ」を転送する
– つまり、ずっと何かを転送し続けることになる
● データは PDU というタイプとペイロードがセットになったものを転送
– NDEF ではない
- 17. LLCP の実装
● NFC-DEP の API を、 Initiator/Target 関係なく使えるようにしておい
た方がいい
– 私はそうしてないので、 LLCP が Initiator と Target で別実装に
なってしまった
● 「サービス」と「サービス検索」がまだわかってない
– nfcpy という実装を相手に通信したのだが、サービス検索を使わな
いと SNEP が始められなかった
– 実装的な方言なのか、何か別のルールがあるのか…
● ドキュメントが、なんかわかりにくい
– シーケンスが載っていないので、何が正しいかよくわからない
- 18. SNEP
● LLCP までは、データ形式はなんでもよい
● NFC Forum 標準のデータ形式である NDEF を交換するするために
は、 LLCP の上にプロトコルを用意する必要があった。
– Android NDEF Push Protocol というものも LLCP を使っ
ているが、 SNEP 発表前なので Android 独自プロトコルに
なってしまった。
● 非常にシンプル
– 主に、 PUT と GET をするだけ。
– LLCP は 1 PDU で転送できるデータサイズが小さいので、 SNEP 層
がデータを細切れにしたりつなぎ合わせたりすることになるだろ
う。
- 19. SNEP の実装
● LLCP の API を Initiator/Target 関係なく使えるようにしておかない
と、ここもそれぞれの実装にわけないといけなくなってしまう
● めんどうだったら、 NDEF サイズを 128byte 以内に限定しておくと、
データの分割と結合をやらなくてよくなる
– 128byte は、 LLCP での最小単位
● NFC-DEP の最高速度が 424kbps なので、けっこう時間がかかる
– 接続までの通信は、ほぼ固定時間になるだろう
– ABM 通信なので、相手から「次のデータ送って」という通信が分割
した回数だけ発生する
– 無線の部分が 424kbps というだけなので、 R/W との通信速度も
ボトルネックになる
● RC-S956 はデフォルトだと 115kbps なので、こっちの影
響の方が大きい
- 20. やってみた感想
● LLCP がよくわからなくて大変だった。
– 未だによくわからん…
● R/W 間の距離が近すぎるとうまくいかなかった。
– 1cm くらいのプラスチックを挟んだ
● Passive 通信だと、 R/W の位置関係が微妙にずれた
だけでうまくいかないことがあった。
ちかすぎ
- 21. 最後に
● SNEP 対応している端末がないと、おもしろくない
● 電話じゃない SNEP 対応端末が出てくれないだろうか
– LLCP 端末でもいいや
– 電話は嫌い