如何解析Type U的NFC数据
How to parse NFC data of Type U
我正在尝试从格式化的 NFC chip
中 parse
有效载荷,但是当涉及到 record.type == U
时我遇到了问题
我正在使用 Android phone 和应用 NXP writer
来写入我的 NFC 芯片。
我得到 record.type == T
的所有东西,但是当我得到 record.type == U
时,我遇到了一些困难。
我在网上找到的想法是,将 data to hexString
和 checking the first 2 numbers
转换,然后你可以将 URI 可以具有的类别归类为以下类别。
示例:
- 0x00 N/A。没有完成任何前置
- 0x01 http://www.
- 0x02 https://www.
- 0x03 http://
- 0x04 https://
- 0x05 电话:
- 0x06 邮寄地址:
- 0x07 ftp://anonymous:anonymous@
- 0x08 ftp://ftp.
等等
hexString = "02676f6f676c652e636f6d"
substring = "02"
然后我们有 https://www
,我们从有效载荷中添加字符串,然后打开 safari(或者我们想做的任何事情)。
The problem comes when I want to read a NFC Tag/chip that contains Tel, mailto, geo, sms so far.
The code is 3 digits
006 而不是我在线阅读的 2 位数字。不仅如此,如果我决定进行地理定位,I get 006 which is the same with mailto code
。当然我可以用更多的代码来解决这个问题,但是因为有一些解决方案只检查那些代码,我能做些什么,还是我做错了什么?
问题:
- NXP writer 是否有问题,我正面临这个问题?
- 是否更改了 NFC 编码?
- 我的逻辑正确吗?
这是我的代码:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
session.invalidate()
for message in messages{
for record in message.records{
guard record.payload.count > 0 else {
print("Record payload doesn't contain any data in the memory")
session.invalidate()
return
}
guard let NFCTypeFromTag = String(data: record.type, encoding: .utf8) else{
print("Unable to detect the Type")
session.invalidate()
return
}
guard let nfcTypeInput = NFCType(rawValue: NFCTypeFromTag) else {
print("nfc enum problem")
session.invalidate()
return
}
switch nfcTypeInput{
case .T:
guard let NFCStringFromPayload = String(data: record.payload.advanced(by: 3), encoding: .utf8) else {
return
}
NFCString = NFCStringFromPayload
case .U:
guard let NFCStringFromPayload = String(data: record.payload, encoding: .utf8) else{
print("Error: Unable to convert record.payload to String")
return
}
let hexString = record.payload.hexEncodedString()
let indexEndFromHexString = hexString.index(hexString.startIndex, offsetBy: 2)
let substring = hexString[hexString.startIndex ..< indexEndFromHexString]
print("NFCString : \(NFCStringFromPayload)")
print("HexString : \(hexString)")
print("Substring : \(substring)")
if substring == "00"{
let indexEndOfHexStringCase00 = hexString.index(hexString.startIndex, offsetBy: 3)
let substringCase00 = hexString[hexString.startIndex..<indexEndOfHexStringCase00]
if substringCase00 == "005" {
print("Tel:")
}else if substringCase00 == "006"{
print("mailto:")
}else if substringCase00 == "007" {
print("sms")
}
}else if substring == "01"{
print("http://www")
}else if substring == "02"{
print("https://www")
}
NFCString = NFCStringFromPayload
case .Sp:
break
}
NFCArray.append(NFCString!)
tableView.reloadData()
print("NFC String : \(NFCString)")
}
}
Apple 在 CoreNFC 上的文档很糟糕。
是否有人实施过类似的解决方案。
提前致谢。
可以直接使用Data
,不需要使用String
十六进制转换。
func parseURINFC(_ data: Data) -> String? {
let prefix = data.prefix(1)
let rest = data.dropFirst(1)
switch prefix {
case Data(bytes: [0x00]):
return nil
case Data(bytes: [0x01]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "http://www." + restString
case Data(bytes: [0x02]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "https://www." + restString
case Data(bytes: [0x03]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "http://" + restString
case Data(bytes: [0x04]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "https://" + restString
case Data(bytes: [0x05]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "tel://" + restString
case Data(bytes: [0x06]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "mailto://" + restString
case Data(bytes: [0x07]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "ftp://anonymous:anonymous@" + restString
case Data(bytes: [0x08]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "ftp://ftp." + restString
default:
return nil
}
}
关于006-
或007-
前缀,根据你给的link(http://austinblackstoneengineering.com/nfc-p2p-basics/),它是无效的。尝试使用 UTF8 转换其余部分后发生的事件(因为它是一个 URI,所以它应该如此)returns nil。
我正在尝试从格式化的 NFC chip
中 parse
有效载荷,但是当涉及到 record.type == U
我正在使用 Android phone 和应用 NXP writer
来写入我的 NFC 芯片。
我得到 record.type == T
的所有东西,但是当我得到 record.type == U
时,我遇到了一些困难。
我在网上找到的想法是,将 data to hexString
和 checking the first 2 numbers
转换,然后你可以将 URI 可以具有的类别归类为以下类别。
示例:
- 0x00 N/A。没有完成任何前置
- 0x01 http://www.
- 0x02 https://www.
- 0x03 http://
- 0x04 https://
- 0x05 电话:
- 0x06 邮寄地址:
- 0x07 ftp://anonymous:anonymous@
- 0x08 ftp://ftp.
等等
hexString = "02676f6f676c652e636f6d"
substring = "02"
然后我们有 https://www
,我们从有效载荷中添加字符串,然后打开 safari(或者我们想做的任何事情)。
The problem comes when I want to read a NFC Tag/chip that contains Tel, mailto, geo, sms so far.
The code is 3 digits
006 而不是我在线阅读的 2 位数字。不仅如此,如果我决定进行地理定位,I get 006 which is the same with mailto code
。当然我可以用更多的代码来解决这个问题,但是因为有一些解决方案只检查那些代码,我能做些什么,还是我做错了什么?
问题:
- NXP writer 是否有问题,我正面临这个问题?
- 是否更改了 NFC 编码?
- 我的逻辑正确吗?
这是我的代码:
func readerSession(_ session: NFCNDEFReaderSession, didDetectNDEFs messages: [NFCNDEFMessage]) {
session.invalidate()
for message in messages{
for record in message.records{
guard record.payload.count > 0 else {
print("Record payload doesn't contain any data in the memory")
session.invalidate()
return
}
guard let NFCTypeFromTag = String(data: record.type, encoding: .utf8) else{
print("Unable to detect the Type")
session.invalidate()
return
}
guard let nfcTypeInput = NFCType(rawValue: NFCTypeFromTag) else {
print("nfc enum problem")
session.invalidate()
return
}
switch nfcTypeInput{
case .T:
guard let NFCStringFromPayload = String(data: record.payload.advanced(by: 3), encoding: .utf8) else {
return
}
NFCString = NFCStringFromPayload
case .U:
guard let NFCStringFromPayload = String(data: record.payload, encoding: .utf8) else{
print("Error: Unable to convert record.payload to String")
return
}
let hexString = record.payload.hexEncodedString()
let indexEndFromHexString = hexString.index(hexString.startIndex, offsetBy: 2)
let substring = hexString[hexString.startIndex ..< indexEndFromHexString]
print("NFCString : \(NFCStringFromPayload)")
print("HexString : \(hexString)")
print("Substring : \(substring)")
if substring == "00"{
let indexEndOfHexStringCase00 = hexString.index(hexString.startIndex, offsetBy: 3)
let substringCase00 = hexString[hexString.startIndex..<indexEndOfHexStringCase00]
if substringCase00 == "005" {
print("Tel:")
}else if substringCase00 == "006"{
print("mailto:")
}else if substringCase00 == "007" {
print("sms")
}
}else if substring == "01"{
print("http://www")
}else if substring == "02"{
print("https://www")
}
NFCString = NFCStringFromPayload
case .Sp:
break
}
NFCArray.append(NFCString!)
tableView.reloadData()
print("NFC String : \(NFCString)")
}
}
Apple 在 CoreNFC 上的文档很糟糕。
是否有人实施过类似的解决方案。
提前致谢。
可以直接使用Data
,不需要使用String
十六进制转换。
func parseURINFC(_ data: Data) -> String? {
let prefix = data.prefix(1)
let rest = data.dropFirst(1)
switch prefix {
case Data(bytes: [0x00]):
return nil
case Data(bytes: [0x01]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "http://www." + restString
case Data(bytes: [0x02]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "https://www." + restString
case Data(bytes: [0x03]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "http://" + restString
case Data(bytes: [0x04]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "https://" + restString
case Data(bytes: [0x05]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "tel://" + restString
case Data(bytes: [0x06]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "mailto://" + restString
case Data(bytes: [0x07]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "ftp://anonymous:anonymous@" + restString
case Data(bytes: [0x08]):
guard let restString = String(data: rest, encoding: .utf8) else { return nil }
return "ftp://ftp." + restString
default:
return nil
}
}
关于006-
或007-
前缀,根据你给的link(http://austinblackstoneengineering.com/nfc-p2p-basics/),它是无效的。尝试使用 UTF8 转换其余部分后发生的事件(因为它是一个 URI,所以它应该如此)returns nil。