2012/06/17

NFC-DEPのきれいな終わらせ方がわからん

NFC-DEPの開始とデータ交換はわかったが、終わり方がわからん。

ISO/IEC 18092に従えば、RLS_REQを投げるとよさそうだ。
PN533ではInReleaseというコマンドがあるのだけど、RC-S620/Sではよくわからない。

 

ほっとくと、タイムアウトエラーで終わる。
通信相手がいなくなることは十分あり得るから、タイムアウトエラーの考慮は必要なのだけど、成功してもタイムアウトエラーになるのは気持ちが悪い。

だけど、対処のしようもないしなあ。。。
nfc-smart-tagのソースを見ると、LLCPのI PDUを投げて、その応答が0x81だったら成功、としている。
SNEPは1要求1応答だし、nfc-smart-tagは1回だけI PDUを投げるようにできているから、そうなってるんだろう。
まあ、それはそれでいいのかな。


よく見ると、nfc-smart-tagは、InitiatorからRLS_REQを受け取ると、ちゃんとRLS_RESを返すように実装している。
ってことは、Initiatorも同じ要領でRLS_REQを送信すればいいってことか。
なんでもかんでもR/Wに頼ろうとした私が甘かったか。。。

 

と思って実装したけど、なかなかうまくいかん。
nfc-smart-tagは、TgInitTargetの戻りでRLS_REQチェックをしているだけだ。
ドキュメントも、TgGetDEPDataで返すのはDEP_REQだけになっている。
RLS_REQはTargetでは途中で受け取ったことを戻り値Statusでしか判断できないと考えてよいのだろう。


ではInitiator側はどうしたらいいんだ・・・。
まねして、CommunicateThruEXでRLS_REQを返すと、Target側がRLS_RESを返してきた!
そうか、TgInitTargetのときはどうしようもないけど、それ以外の場合はR/WがRLS_RESをさばいてくれるのだな。

 

RLS_REQを投げると、TargetはTgSetDEPDataから抜けてくれるのだが、RFなしっぽいエラーになっている。
期待するのはReleaseされたときのエラーコードなんだけど、これはしょうがないのか、単に実装をどっか間違ってるだけなのか。。
Targetが返すデータがないのでTgSetDEPDataを投げたタイミングでRLS_REQを送信しているつもりなのだが、なんかうまくいってないのかもね。

 

NFC-DEPは動かせていると思っていたけど、ちゃんとやるといろいろ出てくるものだなぁ。
とりあえずこの問題は置いておいて、LLCPに進んでみましょうかね。

4 件のコメント:

  1. NFC-DEPの層のPDUだったかな、なんかシーケンスナンバーみたいな値ありますよね。あれもしかして間違ってません?

    そこの実装誤ると、ちょうどRLSのあたりでコケるはず(体験上)

    返信削除
    返信
    1. シーケンスナンバーということは、PFBのPNIあたりでしょうか。
      ここは・・・R/Wが勝手にやってくれていると思って、まったく見てませんでした・・・。
      InDataExchangeコマンドでうまくやってくれると思っていたのですが、このコマンドを使うとPNIがどういう値なのかは確認ができないのでした。
      今回のパターンだけであればエラーで終わってもいいのですが、実は全然うまくいっていなくて、最後にエラーだけ出す、だとまずいですね・・・。

      要確認事項ということでTODOリストに残すことにしました。
      ありがとうございます。

      削除
  2. ああ、それですPFB。そこの下位2bitくらいでしたっけ。
    私はここをテキトーにやってたんで、SNEPだと、ちょうどRLSかDSLのあたりで2bit分が一周し終えたところに当たって、ちょうどそこからうまく通信できないという経験がありまして。

    なんといいますか、最終的にRLSとかDSLとかってセッションを切るところなんで、まあぶっちゃけここでどうにかなってもどうしようもないですよね。

    エラーチェックはしますがエラーしてもスルーしていいんではないかと。
    実際、SNEPごしにNDEFは渡せているはずですし。

    一つ問題としては、うまく切れてないセッションを相手側が持ち続け、次のCONNECTに応答しなくなっちゃうことですかね。

    でもこの手の問題って、実装ミス以外にも、セッション切る直前に端末同士を離されてしまうという、非接触通信では避けようのないパターンで必ず起きますしねー。

    とりあえずはあまりこだわらないで、この事自体TODOにはするけどLATERとか。

    返信削除
  3. そうですね、とりあえずは正常系でやりとりするところまでできればいいと思ってます。
    あとは、セッションが残らないようにLinkタイムアウト処理するところですね。

    LLCPってタイムアウトすると即切断なんですね。
    モバイル向け非接触だと再送なんかもやりそうなのですが、そこを考えなくていいので楽ではありますね。

    返信削除

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。