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