【问题标题】:How to properly encode a URL onto an NFC tag?如何将 URL 正确编码到 NFC 标签上?
【发布时间】:2019-03-27 06:49:38
【问题描述】:

我有一张 Mifare ULC 卡。当我将此卡点击到启用 NFC 的设备时,它应该在手机中打开默认浏览器,而无需任何额外的 NFC 应用程序。

我已将以下 NDEF URL 数据编码到标签中,但是当我扫描标签时,它并没有打开浏览器。谁能指导我在哪里做错了?

03 - tag for the NDEF
12 - length of the NDEF msg (18 Bytes)
D3    Record header (of first and only record)
      Bit 7 = MB = 1: first record of NDEF message
      Bit 6 = ME = 1: last record of NDEF message
      Bit 5 = CF = 0: last or only record of chain
      Bit 4 = SR = 1: short record length field
      Bit 3 = IL = 0: no ID/ID length fields
      Bit 2..0 = 011 = 0x3: Absolute URI Record type
01    Type Length = 1 byte
0E    Payload length = 14 bytes
55    Type field "U" (in US-ASCII) = for URI record
02656E02676F6F676C652E636F6D    Payload field (decoded according to the value of the Type field)- 14 Bytes

02    Status byte
      Bit 7 = 0: Text is UTF-8 encoded
      Bit 6 = 0: Not used
      Bit 5..0 = 0x02: Length of IANA language code field
656E  IANA language code field
      "en" (in US-ASCII) = Text is in English
02676F6F676C652E636F6D URL 0x02 = https://www. (URI identifier code) + 676F6F676C652E636F6D = google.com
      "https://www.google.com" (in UTF-8)

【问题讨论】:

    标签: tags format nfc mifare ndef


    【解决方案1】:

    您在这里混合了几种不同的记录类型:

    • 绝对 URI 记录类型,
    • NFC 论坛知名类型 URI,以及
    • NFC 论坛知名类型文本。

    您的记录标头将记录声明为绝对 URI 记录类型 (TNF = 3)。此记录类型使用类型名称字段(告诉应用程序如何解释记录有效负载的字段)的 URI。因此,在这种情况下,URI 不是实际的记录有效负载,而只是记录内容的描述符。在您的情况下,这样的记录可能如下所示:

    +-------------------------+------------------------ ----------------------------------------- | D3 |记录头(MB = ME = 1,CF = 0,SR = 1,IL = 0,TNF = 0x3) +-------------------------+------------------------ ----------------------------------------- | 16 |类型长度(22 字节) +-------------------------+------------------------ ----------------------------------------- | 00 |有效载荷长度(0 字节) +-------------------------+------------------------ ----------------------------------------- | 68 74 74 70 73 3A 2F 2F |输入名称(“https://www.google.com”) | 77 77 77 2E 67 6F 6F 67 | | 6C 65 2E 63 6F 6D | +-------------------------+------------------------ -----------------------------------------

    虽然 Android 仍将此记录视为 URI 并应在 Web 浏览器中打开它,但这肯定不是 NDEF 规范的创建者想要使用的绝对 URI 记录。

    相反,NFC 论坛为此指定了 URI 众所周知的类型。您已经使用了其中的一部分,因为您的类型名称(“U”)和有效负载的部分格式与 URI 众所周知的记录类型相匹配。但是,为了将您的记录声明为知名类型记录,您需要将 TNF 字段设置为 1。此外,URI 记录类型的有效负载由一个标识符字节(缩写的 URI 前缀)和截断的 URI 组成.

    +-------------------------+------------------------ ----------------------------------------- | D1 |记录头(MB = ME = 1,CF = 0,SR = 1,IL = 0,TNF = 0x1) +-------------------------+------------------------ ----------------------------------------- | 01 |类型长度(1 字节) +-------------------------+------------------------ ----------------------------------------- | 0B |有效载荷长度(11 字节) +-------------------------+------------------------ ----------------------------------------- | 55 |类型名称(“U”) +-------------------------+------------------------ ----------------------------------------- | 02 67 6F 6F 67 6C 65 2E |有效负载:标识符代码 = 2(前缀“https://www.”), | 63 6F 6D |截断的 URI = "google.com" +-------------------------+------------------------ -----------------------------------------

    【讨论】:

    • 请注意,google.com 的有效负载长度(不带斜杠)为 11 个字节。因此 0B 是正确的,但音符已关闭。
    【解决方案2】:

    您需要删除您的“语言代码字段”和您称为“状态字节”的字节。

    记录类型(55h - 您称为类型字段)之后的第一个字节应该是 URI 标识符(02h,它定义了“https://www.”)。然后是你的 URI。

    检查您的新负载长度,我很快将其计算为 12 个字符 (0Ch)。

    【讨论】:

    • 是的,感谢您的帮助。我实现了它,但是如果没有任何服务或应用程序来访问浏览器,绝对 URI 就无法工作。相反,众所周知的类型 URI 可以在没有任何应用程序或服务的情况下工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多