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に進んでみましょうかね。