一人でも SNEP 開発




      一人でもシリーズ
SNEP って?
●   Simple NDEF Exchange Protocol
●   「簡単に NDEF を交換しよう」プロトコル
●   「交換」だけど、一方向
       –   片方が送信して、片方が受信する
       –   それを繰り返すと交換もできる
NDEF って?
●   NFC Data Exchange Format
●   データ交換するときのフォーマット
       –   NFC カードに NDEF 形式で書き込む
             ●   NFC R/W で読み込む
       –   SNEP で NDEF データを転送する
       –   SNEP で NDEF データを受信する
SNEP を使う利点は?
●   NFC 端末同士で NDEF データを交換できる
      –   NFC カードを必要としない
      –   容量制限がない
            ●   人間の忍耐が必要になるかもしれんが…
●   動的なデータ作成が可能
      –   状況に応じたデータを送信
            ●   Android Beam のような使い方
実際はどうやるの?
●   NFC 端末同士の通信
      –   NFC は数 cm の距離でしか通信しない
      –   つまり、端末を向かい合わせる必要がある
●   向かい合わせる方法
      –   2 台の端末を一人が持つ
            ●   確実だけど、相手に渡すのはイヤだ
      –   二人で向かい合わせる
            ●   安心だけど、長時間はきつい
自分から相手へ転送する
    ●   自分アプリが NDEF データを作る
    ●   自分アプリが、 SNEP PUT で転送
    ●   相手アプリが、受信
    ●   相手アプリが、 NDEF データ解析


                SNEP   SNEP

application                    application
相手にデータを要求する
    ●   自分アプリが、 SNEP GET で転送要求
    ●   相手アプリが、 NDEF 転送
    ●   自分アプリが受信して、 NDEF データ解析



                SNEP      SNEP

application                      application
これから、細かい話になります
SNEP の下
●   SNEP は「 NDEF 交換のためのプロトコル」
●   その下に、通信制御する「 LLCP 」がいる
●   NFC Forum で規定されている




      SNEP                       SNEP



             LLCP         LLCP
LLCP の下
●   LLCP は通信制御プロトコル
●   その下にデータ交換の「 NFC-DEP 」がいる
●   NFCIP-1 のデータ交換プロトコル




        LLCP              LLCP




                NFC-DEP
SNEP の実装をするとき
●   SNEP を作りたいと思ったら…
      –   LLCP の実装
      –   NFC-DEP の実装
●   下から順に作っていこう
      –   そして順番に動作確認していく
もう少し細かい話をします。
     RC-S956 に実装したときの話です。
RC-S620/S のコマンドリファレンスマニュアルを見て、
そこにないものは PN533 のマニュアルから情報を得ています。
よって「正しいのか?」といわれると、よくわからないです。
RC-S956 とは
●   PaSoRi RC-S370 や RC-S620/S に搭載され
    ている FeliCa チップ
      –   RC-S330 も、おそらくそう
      –   RC-S320 は、たぶん違う
●   NFC R/W 用チップ
      –   モバイル用のチップではない
NFC-DEP
●   NFCIP-1 でのデータ交換プロトコル
      –   「 NFC-DEP 」という名前は、 NFC Forum の名称
●   データ交換方法
      –   DEP_REQ と DEP_RES を使っている
●   データ交換の前に「接続」という作業がある
      –   ATR_REQ と ATR_RES で行う
●   接続の前に通信設定をしなくては
      –   Initiator か Target か
      –   Active か Passive か
      –   通信速度
NFC-DEP の実装
●   RC-S956 がけっこうやってくれる
●   Target になるとき
        –   TgInitTarget コマンドを使う
                 ●   通信設定は Initiator まかせ
        –   ATR_REQ や RLS_REQ は自分で処理する
        –   GeneralBytes は、自分でさばく
                 ●   データは LLCP によって決められている
●   Initiator になるとき
        –   InJumpForDEP コマンドを使うと楽
                 ●   通信パラメータは自分で考える
        –   ATR_RES は自分で処理する
        –   GeneralBytes は、自分でさばく
        –   データ転送は InDataExchange コマンドを使うと楽
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 ではない
LLCP の実装
●   NFC-DEP の API を、 Initiator/Target 関係なく使えるようにしておい
    た方がいい
        –   私はそうしてないので、 LLCP が Initiator と Target で別実装に
             なってしまった
●   「サービス」と「サービス検索」がまだわかってない
        –   nfcpy という実装を相手に通信したのだが、サービス検索を使わな
              いと SNEP が始められなかった
        –   実装的な方言なのか、何か別のルールがあるのか…
●   ドキュメントが、なんかわかりにくい
        –   シーケンスが載っていないので、何が正しいかよくわからない
SNEP
●   LLCP までは、データ形式はなんでもよい
●   NFC Forum 標準のデータ形式である NDEF を交換するするために
    は、 LLCP の上にプロトコルを用意する必要があった。
       –   Android NDEF Push Protocol というものも LLCP を使っ
             ているが、 SNEP 発表前なので Android 独自プロトコルに
             なってしまった。
●   非常にシンプル
       –   主に、 PUT と GET をするだけ。
       –   LLCP は 1 PDU で転送できるデータサイズが小さいので、 SNEP 層
             がデータを細切れにしたりつなぎ合わせたりすることになるだろ
             う。
SNEP の実装
●   LLCP の API を Initiator/Target 関係なく使えるようにしておかない
    と、ここもそれぞれの実装にわけないといけなくなってしまう
●   めんどうだったら、 NDEF サイズを 128byte 以内に限定しておくと、
    データの分割と結合をやらなくてよくなる
        –   128byte は、 LLCP での最小単位
●   NFC-DEP の最高速度が 424kbps なので、けっこう時間がかかる
        –   接続までの通信は、ほぼ固定時間になるだろう
        –   ABM 通信なので、相手から「次のデータ送って」という通信が分割
              した回数だけ発生する
        –   無線の部分が 424kbps というだけなので、 R/W との通信速度も
             ボトルネックになる
                ●   RC-S956 はデフォルトだと 115kbps なので、こっちの影
                     響の方が大きい
やってみた感想
●   LLCP がよくわからなくて大変だった。
      –  未だによくわからん…
●   R/W 間の距離が近すぎるとうまくいかなかった。
      –   1cm くらいのプラスチックを挟んだ
●   Passive 通信だと、 R/W の位置関係が微妙にずれた
    だけでうまくいかないことがあった。
                               ちかすぎ
最後に
●   SNEP 対応している端末がないと、おもしろくない
●   電話じゃない SNEP 対応端末が出てくれないだろうか
      –   LLCP 端末でもいいや
      –   電話は嫌い

一人でもSNEP開発

  • 1.
    一人でも 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
  • 8.
  • 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 端末でもいいや – 電話は嫌い