Tags 如何正确地将URL编码到NFC标记上?

Tags 如何正确地将URL编码到NFC标记上?,tags,format,nfc,mifare,ndef,Tags,Format,Nfc,Mifare,Ndef,我有一张Mifare ULC卡。当我将此卡点击到支持NFC的设备时,它将在手机中打开默认浏览器,而无需任何附加的NFC应用程序 我已经将下面的NDEFURL数据编码到标记中,但是当我扫描标记时,它不会打开浏览器。谁能告诉我哪里出了错 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: fir

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

我已经将下面的NDEFURL数据编码到标记中,但是当我扫描标记时,它不会打开浏览器。谁能告诉我哪里出了错

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)

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

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


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

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

  • 绝对URI记录类型
  • NFC论坛知名类型URI,以及
  • NFC论坛著名的文本类型
记录头将记录声明为绝对URI记录类型(TNF=3)。此记录类型使用are URI作为类型名称字段(告诉应用程序如何解释记录负载的字段)。因此,在这种情况下,URI不是实际的记录负载,而是记录内容的描述符。在您的情况下,这样的记录可能如下所示:

+-------------------------+---------------------------------------------------------------- | D3 | Record header (MB = ME = 1, CF = 0, SR = 1, IL = 0, TNF = 0x3) +-------------------------+---------------------------------------------------------------- | 16 | Type Length (22 bytes) +-------------------------+---------------------------------------------------------------- | 00 | Payload Length (0 bytes) +-------------------------+---------------------------------------------------------------- | 68 74 74 70 73 3A 2F 2F | Type Name ("https://www.google.com") | 77 77 77 2E 67 6F 6F 67 | | 6C 65 2E 63 6F 6D | +-------------------------+---------------------------------------------------------------- +-------------------------+---------------------------------------------------------------- |D3 |记录头(MB=ME=1,CF=0,SR=1,IL=0,TNF=0x3) +-------------------------+---------------------------------------------------------------- |16 |类型长度(22字节) +-------------------------+---------------------------------------------------------------- |00 |有效负载长度(0字节) +-------------------------+---------------------------------------------------------------- |68 74 70 73 3A 2F 2F |类型名称(“https://www.google.com") |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 | Record header (MB = ME = 1, CF = 0, SR = 1, IL = 0, TNF = 0x1) +-------------------------+---------------------------------------------------------------- | 01 | Type Length (1 byte) +-------------------------+---------------------------------------------------------------- | 0B | Payload Length (11 bytes) +-------------------------+---------------------------------------------------------------- | 55 | Type Name ("U") +-------------------------+---------------------------------------------------------------- | 02 67 6F 6F 67 6C 65 2E | Payload: Identifier code = 2 (prefix "https://www."), | 63 6F 6D | truncated URI = "google.com" +-------------------------+---------------------------------------------------------------- +-------------------------+---------------------------------------------------------------- |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” +-------------------------+----------------------------------------------------------------
是的,谢谢你的帮助。我实现了它,但是如果没有任何服务或应用程序进入浏览器,绝对URI就无法工作。相反,众所周知的URI类型可以在没有任何应用程序或服务的情况下工作。因此,0B是正确的,但注释已关闭。