2012/12/29

[android]Type3 Tagヘッダのソースを見たが、よくわからん

Nexus7で、FeliCa Liteに書いたNDEFメッセージが113~127byteだとNDEFデータをうまく読み込んでくれない件について、見てわかるものかどうかわからないが、とりあえずソースファイルを見てみよう。
Type3 Tagのヘッダを解析する部分だけでいいはずだ。
NDEFの解析は、きっと共通でやってるだろう。やっていてくれ。。。

 

Type3 Tagについては明日の鍵さんを参照してくだされ。
NDEFメッセージ長が関係するのは、メッセージ長を表すLnと、それによって変化するチェックサムくらいだ。


Androidでは、基本的なデータ解析をframeworksではなくexternalsにあるlibnfc-nxpで行っている。
ファイル名から予想して、external\libnfc-nxp\src\phFriNfc_FelicaMap.hから見ていこう。

 

Lnは3byteなので、これを使ってるんじゃなかろうか。

/* Macro for LEN Byte Calculation*/
#define PH_NFCFRI_NDEFMAP_FELI_CAL_LEN_BYTES(Byte1,Byte2,Byte3,DataLen)\
do\
{ \
    (DataLen) = (Byte1); \
    (DataLen) = (DataLen) << (16);\
    (DataLen) += (Byte2);\
    (DataLen) = (DataLen) << (8);\
    (DataLen) += (Byte3);\
}while(0)

どうでもいいんだけど、2行目って16じゃなくて8よね。。。

0x12, 0x34, 0x56ってデータだったら、

DataLen = 0x12;
DataLen = 0x12 << 16;  → 0x120000
Datalen += 0x34; → 0x120034
DataLen = 0x120034 << 8; → 0x12003400;
DataLen += 0x56; →0x12003456;

ってなるやん。

どうでもいいっていうのは、FeliCa Liteは256byteもデータがないので、0x00, 0x00, 0x??、という値になるから今回は関係ないや、ということである。
他の部分でも同じように書いている箇所があるが、そっちは知らない。

 

私だと

(DataLen) = ((Byte1) << 16 | (Byte2) << 8 | (Byte3));

って書くけど、なんか分けて書いた方が利点があるのかな?

 

ざっと眺めてみたけど、やっぱりよくわからんな。
ソースだけから追うのはちょっとつらい。

一応、android側(java側)も見ておくか。


NDEFメッセージがnullだ、とわかったのpackages\apps\Nfc\src\com\android\nfc\NfcDispatcher.javaの出力からだ。
dispatchTag()のLog.d()だ。

messageがnullになるのは、

  • Ndef.get(tag)がnull
  • Ndef.get(tag)は非nullで、Ndef.get(tag).getCachedNdefMessage()がnull

のどちらかだ。

やはり追うのがめんどくさいな。


それにしても・・・libnfc-nxpには無意味なマクロがあるな・・・。
さっきのマクロの上に2つ違うマクロがあるんだけど、

/* Macros to find major and minor T3T version numbers*/
#define PH_NFCFRI_NDEFMAP_FELI_GET_MAJOR_T3T_VERNO(a)\
do\
{\
    (((a) & (0xf0))>>(4))\
}while (0)
 
#define PH_NFCFRI_NDEFMAP_FELI_GET_MINOR_T3T_VERNO(a)\
do\
{\
    ((a) & (0x0f))\
}while (0)

 

do-whileで囲むのはいいんだけど、値を取得するつもりで使ったらコンパイルエラーになるやん。
まあ、誰も使ってないんだけどさ。

0 件のコメント:

コメントを投稿

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