Как анализировать данные NFC типа U - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь parse получить данные из отформатированного NFC chip, но у меня возникает проблема, когда дело доходит до record.type == U

Я использую телефон Android с приложением NXP writer, чтобы писать свои чипы NFC. Я получаю все за record.type == T, но когда я получаю record.type == U, у меня возникают некоторые трудности.

Идея, которую я нашел в Интернете, заключается в том, что при преобразовании data to hexString и checking the first 2 numbers вы можете классифицировать следующие категории, которые может иметь URI.

iOS 11 - Как можно прочитать / проанализировать сообщение NDEF из CoreNFC?

Примеры:

  1. 0x00 Н / Д. Предварительная подготовка не производится
  2. 0x01 http://www.
  3. 0x02 https://www.
  4. 0x03 http://
  5. 0x04 https://
  6. 0x05 тел:
  7. 0x06 mailto:
  8. 0x07 ftp: // анонимный: анонимный @
  9. 0x08 ftp: //ftp.

и т.д.

hexString = "02676f6f676c652e636f6d"

substring = "02"

Затем у нас есть https://www, и мы добавляем строку из полезной нагрузки, и открываем сафари (или то, что мы хотим сделать).

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. Конечно, я могу решить эту проблему с помощью большего количества кода, но, поскольку существуют решения, которые проверяют только эти коды, могу ли я что-то сделать или я делаю что-то не так?

Вопросы:

  1. Есть ли проблема с NXP Writer, и я сталкиваюсь с этой проблемой?
  2. Кодировка NFC была изменена?
  3. Правильна ли моя логика?

Вот мой код:

    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.

Есть ли подобное решение, которое кто-то реализовал.

Заранее спасибо.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете использовать 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-, согласно предоставленной вами ссылке (http://austinblackstoneengineering.com/nfc-p2p-basics/),, это недопустимо. Событие после попытки преобразовать остальное с использованием UTF8 (как и должно быть, так как это URI), это возвращает ноль.

...