首页 > 解决方案 > 如何在 Android 上读取 NFC Snoop Log?

问题描述

在 Android 上,我可以转储 NFC 硬件的状态

> adb shell dumpsys nfc

这会生成一些输出,最后有一个窥探日志:

--- BEGIN:NFCSNOOP_LOG_SUMMARY (6009 bytes in) ---
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
--- END:NFCSNOOP_LOG_SUMMARY ---

我有兴趣阅读这个文件内容,因为我希望找到所有低级 NFC 通信。

我认为这个内容是 base64 编码的,但是当我通过解码器传递它时,它仍然是胡言乱语:

> base64 --decode -i nfc_snoop_log_base64.txt -o nfc_snoop_log.txt

(不幸的是,我无法发布输出,因为它包含 SO 不接受的字符。)

从生成此日志的源代码(https://android.googlesource.com/platform/system/nfc/+/master/src/adaptation/debug_nfcsnoop.cc),我感觉内容也被压缩了,但是当我尝试解压缩它时,出现错误:

> base64 --decode -i nfc_snoop_log_base64.txt -o nfc_snoop_log.zip
> unzip nfc_snoop_log.zip

Archive:  nfc_snoop_log.zip
  End-of-central-directory signature not found.  Either this file is not
  a zipfile, or it constitutes one disk of a multi-part archive.  In the
  latter case the central directory and zipfile comment will be found on
  the last disk(s) of this archive.
unzip:  cannot find zipfile directory in one of nfc_snoop_log.zip or
        nfc_snoop_log.zip.zip, and cannot find nfc_snoop_log.zip.ZIP, period.

有谁知道,如何使 NFC 窥探日志人类可读?

标签: android

解决方案


在对您从 Android 源链接的代码进行大量挖掘之后,使用的压缩格式是 Zlib。但是,压缩后会附加一个 NFCSnoop 标头。解码 base64 后,如果查看前 9 个字节,您会发现 zlib 标头。该 nfcsnoop 标头确实带有转储的开始时间,这似乎是稍后 delta_time_ms 的起点。在删除 nfcsnoop 标头并使用 -z 参数通过 pigz 运行它之后,您应该有一个解码的缓冲区。

缓冲区是原始 NFC 数据包,由它们自己的标头组成,如下所示:length、uint16 delta_time_ms、uint32 is_received、uint8

之后,您将获得数据。

编辑:看起来这些是 NFC_HDR 数据包,需要使用 Android 中的 NFC 类型详细信息进行额外解码。

编辑 2:显然不是 NFC_HDR。NCI 控制数据包。

编辑3:我最终编写了一个程序来解码它,因为我需要自己这样做。

它位于此处:https ://github.com/VivoKey/NFCSnoopDecoder

简而言之,它是一个标头,比标头后面的长度字节数据。长度是一个 uint16。


推荐阅读