Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Listview

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

На главном экране мы можем наблюдать список действий которые можно выполнить, подобный список делается так:

ListView {
    id: actionList

....
    delegate: ListDelegate {
        anchors {
            left : parent.left
            leftMargin: 20
        }

        onClicked: {
            pageStack.push(Qt.resolvedUrl(model.source))
        }

        MoreIndicator {
            anchors {
                verticalCenter: parent.verticalCenter
                right: parent.right
                rightMargin: 30
            }
        }
    }

    model: ListModel {
        ListElement {
            title: "Read Tag"
            subtitle: ""
            source: "ReadPage.qml"
        }
        ......
    }
}

Элемент

ListView

является собственно самим списком, у которого есть два ключевых свойства

delegate

— делегат для отрисовки одного элемента списка и

model

— модель данных для списка.


Пакет

com.nokia.extras

содержит уже готовый компонент

ListDelegate

для создания простого делегата. Элемент

ListModel

позволяет задать простую модель данных. А

ListElement

— ни что иное как одна запись этой модели.

Tnf_well_known с rtd_text (mime-тип с записью простого текста)

Создать NDEF-запись TNF_WELL_KNOWN можно следующим образом:

Kotlin

fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord {
    val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII"))
    val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16")
    val textBytes = payload.toByteArray(utfEncoding)
    val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7
    val status = (utfBit   langBytes.size).toChar()
    val data = ByteArray(1   langBytes.size   textBytes.size)
    data[0] = status.toByte()
    System.arraycopy(langBytes, 0, data, 1, langBytes.size)
    System.arraycopy(textBytes, 0, data, 1   langBytes.size, textBytes.size)
    return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data)
}

Java

public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
    byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit   langBytes.length);
    byte[] data = new byte[1   langBytes.length   textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1   langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}

Intent-фильтр для такой NDEF-записи будет таким:

Алгоритм работы nfc

У NFC, как и у RFID, при обмене есть инициатор и цель, но новая технология позволяет куда больше, чем простой обмен идентификатором и чтение или запись информации цели. Наиболее значимым различием между этими двумя технологиями является то, что у NFC целями часто являются программируемые устройства, такие как смартфоны.

У NFC устройств есть два режима взаимодействия. Если инициатор излучает радиочастотные волны, а цель за счёт инициатора получает питание, то такой режим взаимодействия называют пассивным. При активном режиме у инициатора и цели свои собственные источники питания, и они независимы друг от друга. Данные режимы совпадают с режимами RFID.

NFC устройства также имеют три способа работы. Они могут работать в режиме чтения информации с цели или записи на неё. Они могут эмулировать карты, ведя себя как RFID-метки, когда они в поле другого NFC или RFID устройства. Или они могут работать в режиме peer-to-peer (P2P), в котором они обмениваются данными сразу в обоих направлениях.

Первым главным отличием NFC от RFID является способ взаимодействия peer-to-peer, который реализован с помощью ГОСТ Р ИСО/МЭК 18092. Обмен данными P2P реализуется двумя протоколами — протоколом подуровня управления логической связью (LLCP — logical link control protocol) и простым протоколом обмена данными NDEF (SNEP — simple NDEF exchange format).

Архитектура nfc

В архитектуре NFC есть несколько уровней. Самый низкий из них — физический, который реализован ЦПУ и другим аппаратным комплексом, через который происходит взаимодействие. В середине находятся данные о пакетах и транспортный уровень, затем формат данных уровней, и в конце программное обеспечение.

На физическом уровне NFC работает по алгоритму, описанному в ГОСТ для RFID (ГОСТ Р ИСО/МЭК 14443-2-2022), где говорится о маломощных радиосигналах частотой 13,56 МГц. Затем идёт уровень, который описывает разбивку потока данных на фреймы (ГОСТ Р ИСО/МЭК 14443-3-2022).

Любые радиоконтроллеры, которые используются в телефоне, планшете или подсоединяются к компьютеру или микроконтроллеру, являются отдельными аппаратными компонентами. Они взаимодействуют с главным процессором посредством одного или нескольких стандартных последовательных протоколов между устройствами: универсальный асинхронный приёмопередатчик (UART), последовательный периферийный интерфейс (SPI), последовательная шина данных для связи интегральных схем (I2C) или универсальная последовательная шина (USB).

Над этим находится несколько протоколов команд RFID, базирующихся на двух спецификациях. NFC чтение и запись меток базируется на оригинальном RFID ГОСТ Р ИСО/МЭК 14443A. Протоколы Philips/NXP Semiconductors Mifare Classic и Mifare Ultralight и NXP DESFire совместимы с ГОСТ Р ИСО/МЭК 14443A.

Обмен данными P2P NFC базируется на ГОСТ Р ИСО/МЭК 18092. Также на этом же стандарте базируются RFID-карты и метки Sony FeliCa, которые доступны в основном в Японии. Можно читать и записывать метки, основанные на этих стандартах, и не использовать NFC.

Они изображены на рисунке выше на уровне с другими управляющими протоколами, так как они используют одинаковый стандарт.

Беспроводные метки nfc

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Технический прогресс не стоит на месте, появляющиеся новые технологии со временем дешевеют и становятся доступны практически всем желающим. Как пример можно привести мобильные телефоны. Середина 80-ых — начало 90-ых были переносные таксофоны с ручками или кирпичи стоимостью несколько тысяч $, конец 90-ых — большого размера трубки, с торчащими антеннами со стоимостью от 100$ Такую же аналогию можно провести с NFC метками, используемыми в учетных целях.

В идеальном варианте и оборудование и расходники (метки) могут ничего не стоить при условии, что у работника имеется смартфон с поддержкой NFC и сам работник не против его использования. Ну и, конечно же, удалось раздобыть необходимое количество использованных билетов. На Ali стоимость от 6 рублей с лишним за метку.

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Основные затраты по внедрению описанной технологии это только время программиста.
В задачи программиста входит реализовать в мобильном приложении требуемую вашим учетом логику инвентаризации и или складского учета, а также реализовать обмен данными с основной учетной базой данных.

Для обмена можно использовать http или web сервисы, ботов телеграмм или иное месенджероподобное решение.

Описанное нигде не подглядывал, видел когда-то статью про запись пароля wifi на билет, а также имел опыт работы с ТСД (штрих.кодами rdp на винмобайл), огромным и дорогим, на мой взгляд неудобным. С тех пор было желание повторить что-то подобное на более удобном смартфоне.

Группы из 4 байтов называются страницами. Первые несколько страниц, как правило заняты служебной информацией, на одном из скриншотов можно увидеть ID метки NFC на первых двух страницах.

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Кроме ID также может содержаться информация о заблокированных readonly байтах. А также масса другой информации все зависит от типа метки и поддерживаемых возможностей. Также служебная информация может быть записана в конце метки на последних страницах. Более подробно описанное можно увидеть программе для чтения меток, например TagInfo.

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Рекомендуется записывать данные с 8 страницы для пустых — купленных меток.

Для билетов рекомендуется записывать с 16 страницы. Длина имени справочника не должна превышать 60 символов, в случае использования билета.

Некоторые билеты, как правило проездные на много поездок, имеют всего 20 страниц, с учетом блокированных служебных записать на такой билет не получиться.

Данная разработка позволит быстро интегрировать в ваше мобильное приложение функционал чтения записи NFC.a меток.

Возможные варианты использования:
Складской учет номенклатуры, упаковок, ячеек, мест хранения.
Учет ОС, МБП: шкафов, столов, компьютеров.
Мобильный пропускной пункт.
И так далее.

Исходники приложения доступны по ссылке https://github.com/PloAl/RfIdTool

Приложение является «служебным» и не имеет основной activity, также нет в меню приложений android. Запуск происходит из других приложений, туда же передаются считанные данные или передаются данные для записи в метку.

Ниже на картинке видна, полупрозрачная область «Запись метки NFC» это единственная activity приложения.

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Пример использование в android приложении:

protected void nfcStart(boolean read, String readedId) {
    
    if (read)) {
        Intent intent = new Intent("com.ploal.rfidtool.NFCREAD");
        intent.putExtra("IdLabel", readedId); //множественное чтение, предыдущий id метки 
    }
    else{
        Intent intent = new Intent("com.ploal.rfidtool.NFCWRITE");
        intent.putExtra("PageNumber", PageNumber); //глоб. переменная номер страницы 
        intent.putExtra("WriteString", WriteString); //глоб. переменная текст для записи
    }
    startActivityForResult(intent, 1);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (null != data) {
        String event = data.getStringExtra("event");
        String uid = data.getStringExtra("uid");
        String result = data.getStringExtra("result");
        String text = data.getStringExtra("text");
        String[] techArr = data.getStringArrayExtra("tech");
        //обработка полученных данных ...
    }
}

Пример использование в мобильном приложении(клиенте) 1с:

&НаКлиенте
Процедура ЗапускПриложенияNFC(Чтение=Истина,ПрочитанныйID="")
    ЗПМУ = Новый ЗапускПриложенияМобильногоУстройства();
        
    Если Чтение Тогда
        ЗПМУ.Действие = "com.ploal.rfidtool.NFCREAD";
        ЗПМУ.ДополнительныеДанные.Добавить("IdLabel",ПрочитанныйID);
    Иначе
        ЗПМУ.Действие = "com.ploal.rfidtool.NFCWRITE";
        ЗПМУ.ДополнительныеДанные.Добавить("PageNumber","" НомерСтраницы);
        ЗПМУ.ДополнительныеДанные.Добавить("WriteString",ТекстЗаписи);
    КонецЕсли;
    
    Если ЗПМУ.ПоддерживаетсяЗапуск() Тогда
        ЗПМУ.Запустить(Истина);	
        Событие = "";
        Для Каждого Стр Из ЗПМУ.ДополнительныеДанные Цикл
            Если Стр.Ключ = "event" Тогда
                Событие = Стр.Значение;
            ИначеЕсли Стр.Ключ = "uid" Тогда
                УИД = Стр.Значение;	
            ИначеЕсли Стр.Ключ = "result" Тогда
                Результат = Стр.Значение; //HEX строка
            ИначеЕсли Стр.Ключ = "text" Тогда
                Текст = Стр.Значение;	
            ИначеЕсли Стр.Ключ = "tech" Тогда
                Техлист = Стр.Значение;	
            КонецЕсли;
        КонецЦикла;
        //обработка полученных данных ...
    КонецЕсли;	
КонецПроцедуры 

Взаимодействие


Когда пользователь попадает на страницу для записи или чтения метки, мы должны выполнить следующий код:

Для чтения

function tagWasRead(container) {
    NfcManager.stopDetection()

    readPage.dataContainer = container
    pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer})
}

function readError(string) {
    errorBanner.text = string
    errorBanner.show()
}

Component.onCompleted: {
    NfcManager.tagReadFinished.connect(readPage.tagWasRead)
    NfcManager.accessError.connect(readPage.readError)
    NfcManager.setReadMode()
    NfcManager.startDetection()
}

Метод

Component.onCompleted

выполняется когда страница полностью создана. В этом методе мы цепляем обработчики для ошибки и для успешного результата к нашим сигналам из NfcManager (обратите внимание на синтаксис подключения С сигнала к QML слоту)


После, мы выставляем режим для чтения и сообщаем нашему менеджеру, что следует ожидать прикладывания тега.

https://www.youtube.com/watch?v=85oWPy-vsz4

Также обратите внимание на вызов push

pageStack.push(Qt.resolvedUrl("ReadResultPage.qml"), {dataContainer: readPage.dataContainer})

второй параметр, позволяет нам передать контейнер с данными на следущую страницу, которая просто его обработает

Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

пример:

.....
Label {
    id: rawDataLabel

    width: parent.width

    font.pixelSize: 30
    font.family: "Courier New"
    text: readPage.dataContainer.rawHexData()
    wrapMode: Text.WrapAnywhere
}
.....

Для записи

function tagWasWritten() {
.....    
}

function writeError(string) {
.....    
}

Component.onCompleted: {
    NfcManager.tagWriteFinished.connect(writePage.tagWasWritten)
    NfcManager.accessError.connect(writePage.writeError)
    NfcManager.setWriteMode()
    NfcManager.setDataForWrite(writePage.text, writePage.uri)
    NfcManager.startDetection()
}

Очень похоже, не правда ли? Единственным отличием является вызов метода

setDataForWrite

, который передает данные для записи.

Виды внешних nfc-модулей и их функционал

Различают несколько видов внешних нфс модулей – они отличаются друг от друга размером, расположением относительно смартфона (внутри или на корпусе) и лёгкостью установки. Разумеется, самый простой вариант – это приобрести смартфон с уже встроенным nfc чипом.

Однако, некоторые модели телефонов всё же лишены его по разным причинам. Как раз для таких случаев предусмотрены внешние модули, выполняющие те же функции, что и встроенный на заводе нфс чип. Производители, чьи устройства поддерживают nfc, часто делают особую отметку на корпусе.

Также можно проверить наличие такой функции в настройках:

  1. Фото 2Главное меню.
  2. Настройки.
  3. Беспроводные сети.
  4. NFC (поставить галочку напротив пункта, если её нет).

Однако, если смартфон не новый и встроенного чипа в нём нет – то такую ситуацию поможет разрешить присоединяемый nfc модуль, который можно купить в магазине и использовать практически для любого смартфона.

Если делить внешние модули на две большие категории, то получается, что бывают активные и пассивные NFC-модули.

  • Активные. Пользуются каналом связи через Bluetooth или Wi-Fi. В первую очередь, этот фактор предполагает высокое энергопотребление.
  • Пассивные. Являются односторонними и не дают возможности совершать полноценный обмен данными между устройствами, а также записывать и сохранять данные.

В зависимости от модели смартфона, его конструкции, можно установить несколько видов дополнительных NFC-устройств:

  • SIM-карту (выглядит как обычная карточка, может быть мини- и микроформата);
  • метки (круглые плоские «пятачки» с клеящейся основой, могут клеиться на любые поверхности);
  • дополнительные NFC-антенны (состоят из внутреннего чип-модуля и антенны, крепятся под крышкой телефона).

Виды меток nfc

С самой технологией всё более менее понятно. Тогда зачем столько видов меток предлагается производителями? Почему одни стоят дешевле, а другие в 2-3 раза дороже? Давайте разберемся!

Стандартом ISO 14443A описывается 4 вида меток, ещё одна описывается стандартом ISO 18092:

ТипСтандартПамятьСкорость обменаЗаписьчтениеЗащита от коллизий
1ISO14443A96б-2кб106кб/сданет
2ISO14443A96б-2кб106кб/сдада
3ISO1809296б-2кб212кб/сдада
4ISO14443A2/4/8кбдо 424кб/сдада
5ISO14443Aдо 4кб106кб/сдада
  1. Тип 1 – ранняя разработка, слабо распространен из-за отсутствия защиты от коллизий.

Для справки: коллизии возникают при одновременной передаче данных двумя источниками.

  1. Тип 2 – уже поинтереснее, но всё еще не имеет шифрования.
  2. Тип 3 – интересен тем, что поддерживает шифрование данных, но сильно дороже.
  3. Тип 4 – имеет увеличенное количество памяти, что позволяет сохранить больше данных.

Фото 3Наиболее распространенным является тип 5 – Mifare Classic tag, компании NXP Semiconductors.

Он наиболее выгоден по балансу цена-качество.

Кроме отличий в технологии исполнения, метки имеют разные форму и размеры. Чаще всего они продаются в форме простых наклеек с тематическим рисунком.

Если же вариантов рисунков недостаточно, то в продаже можно найти чистые, полностью белые наклейки. Их можно раскрасить под себя или же использовать технологию фотопечати, для нанесения нужной картинки.

В форме наклеек метку можно приклеить в любое удобное место:

  • книгу;
  • журнал;
  • крышку ноутбука;
  • wifi роутер;
  • торпеду авто;
  • мебель.

Метки в таком формате имеют защиту от влаги, а для улицы есть термостойкие метки с режимами -10oС 60oС.

Альтернативный формат – брелок в пластиковом корпусе. Этот вариант позволяет носить метку в кармане, не беспокоясь за ее целостность.

Вместо введения

Технология NFC делает очередной шаг перехода к умному дому.

Окружив себя множеством меток, мы сильно упростим рутинные, ежедневные операции, такие как поставить будильник или перевести смартфон в беззвучный режим на совещании.

Экспериментируйте и ищите свои способы использования меток.

NFC расшифровывается как Near Field Communication или «ближняя бесконтактная связь», если по-русски. По своей сути это небольшой чип, который может быть встроен в смартфон с целью передачи данных на очень короткие расстояния с весьма мизерной скоростью.

NFC очень близка к технологии RFID, которая уже давным-давно используется для пометки продуктов в супермаркетах, но базируется на ее более позднем стандарте ISO/IEC 14443 (смарт-карты) и спроектирована для использования в переносной электронике (читай: смартфонах) и выполнения безопасных транзакций (читай: оплаты покупок).

Как и в случае со стандартом ISO/IEC 14443, дальность действия NFC всего 5–10 см, но разница в том, что чип NFC способен выполнять функцию тега и считывателя одновременно. Другими словами, оснащенный NFC смартфон может быть как смарт-картой (картой метро, например), которую достаточно поднести к считывателю, чтобы расплатиться, так и самим считывателем, что можно использовать, например, для перевода средств между картами-смартфонами и превращения реальных карт с поддержкой стандарта ISO/IEC 14443 в виртуальные.

Но это только «одно из» и наиболее очевидное применение NFC. Благодаря тому, что чип NFC способен передавать данные в обе стороны и не требует аутентификации устройств, его можно использовать как простую и более удобную замену Bluetooth. С помощью NFC, например, можно делиться ссылками, паролями, контактными и другими данными между смартфонами, просто поднеся их друг к другу.

Появившаяся в Android 4.0 технология Beam еще больше расширяет границы применения NFC, позволяя быстро переносить между устройствами целые файлы и папки, что достигается с помощью предварительной аутентификации Bluetooth-устройств по NFC и последующей установки Bluetooth-соединения и отправки файлов.

Еще одна возможность — использование пассивных NFC-тегов. Такие теги в виде небольших наклеек можно приобрести за полдоллара за штуку и перепрограммировать с помощью смартфона. Каждый из них может вмещать в себя 137 байт информации (в случае самого распространенного и дешевого тега Mifire Ultralight C), для считывания которой опять же достаточно просто поднести смартфон.

В тег можно записать пароль от домашнего Wi-Fi и приклеить на роутер. Или кодовое слово, на которое будет реагировать смартфон. Можно организовать автоматический запуск навигатора при установке смартфона в держатель в автомобиле или включение бесшумного и энергосберегающего режимов, когда телефон находится на прикроватной тумбочке. Небольшой список покупок в 137 байт тоже вполне вместится.

В этой статье мы поговорим обо всех возможных применениях NFC на практике, но так как в нашей стране оплата покупок с его помощью внедрена примерно нигде, то речь пойдет преимущественно об автоматизации на основе меток.

Поддержка в смартфонах

Первым телефоном с интегрированной поддержкой NFC был Nokia 6131, выпущенный еще в 2006 году. Тогда встроенный NFC-чип был всего лишь игрушкой для демонстрации возможностей созданной два года назад технологии. Смартфон был оснащен софтом для считывания NFC-меток, но ввиду их тогдашней дороговизны и почти нулевой популярности технологии ни на какое серьезное применение данная особенность смартфона не претендовала.

После некоторого затишья популяризацией NFC занялась компания Google, выпустившая в 2022 году смартфон Samsung Nexus S и приложение Google Wallet, которое позволяло расплачиваться виртуальными кредитками, используя NFC. На следующий год Google стала ведущим участником NFC Forum и представила Android 4.0 и основанный на нем смартфон Samsung Galaxy Nexus, который теперь мог похвастаться наличием той самой функции Beam. Позже появился Nexus 4, и наконец начали подтягиваться другие производители.

Сегодня NFC оснащаются почти все выпускаемые смартфоны. Соответствующий модуль есть даже в сверхбюджетных чипах Mediatek, так что большая часть новых китайских смартфонов стоимостью 5000 рублей тоже им оснащены. В любом случае присутствие чипа NFC легко проверить по наличию пункта «Беспроводные сети -> NFC» в настройках.

Для чего создана технология?

Поскольку точка активируется при непосредственной близости смартфона/планшета с модулем, данная технология со временем займет свою нишу в следующих областях:

  • считывание личной информации при получении доступа к аккаунтам, счетам, банковским картам и так далее;
  • бесконтактная оплата;
  • программирование девайса на определенные действия при прикосновении к NFC.

Если первые два варианта использования полностью зависят от развития данной технологии в вашем регионе (появление меток НФС в магазинах и так далее), то последний способ применения технологии весьма любопытен, и вы можете самостоятельно запрограммировать и использовать НФС метки по своему усмотрению.Метки NFC: зачем нужны и как использовать для оплаты, как скопировать метку и нужен ли программатор, чтобы запрограммировать метку?

Запись

void NfcManager::setDataForWrite(const QString &text, const QString &uri)
{
    m_textForWrite = text;
    m_uriForWrite = uri;
}

Этот метод должен вызываться перед попыткой записи для того, чтобы установить новые значения Uri и/или Text. Если его не вызвать на тег будут записаны предыдущие данные (такой подход пригодится, если нужно записать много однотипных тегов)

void NfcManager::writeTarget(QNearFieldTarget *target)
{
    if (m_textForWrite.isEmpty() && m_uriForWrite.isEmpty())
        return;

    m_cachedTarget = target;
    QNdefMessage message;

    if (!m_textForWrite.isEmpty() && !m_uriForWrite.isEmpty()) {
        NdefNfcSmartPosterRecord smartPosterRecord;
        smartPosterRecord.setTitle(m_textForWrite);
        smartPosterRecord.setUri(QUrl(m_uriForWrite));
        message.append(smartPosterRecord);
    } else if (!m_textForWrite.isEmpty()) {
        QNdefNfcTextRecord textRecord;
        textRecord.setText(m_textForWrite);
        message.append(textRecord);
    } else {
        QNdefNfcUriRecord uriRecord;
        uriRecord.setUri(QUrl(m_uriForWrite));
        message.append(uriRecord);
    }

    connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId)));
    connect(target, SIGNAL(ndefMessagesWritten()), this, SIGNAL(tagWriteFinished()));
    target->writeNdefMessages(QList<QNdefMessage>() << message);
}

Главный метод записи не сложнее чем метод чтения. В блоке условий мы просто выбираем вид записи. Если присутствует только Uri или Text, то создается соответствующий тип, если же заполнены оба поля то создается запись типа Smart Poster.

После этого мы снова подключаем обработчик ошибок. Но, обратите внимание, поскольку в бэкенде нам не нужно никакой логики обработки успешного завершения чтения, мы пробрасываем сигнал на сигнал, который в дальнейшем поймаем в QML.

Зачем нужны nfc метки ?

Когда в 2004 году Philips, Sony и Nokia создали свой NFC forum, данная технология была известна разве что в среде увлеченных технарей. Три кита электронной индустрии ставили своей целью исследование, продвижение, ну и конечно, коммерческую прибыль от внедрения новой технологии бесконтактной передачи данных. Но большого прогресса они не достигли – все их достижения казались не более, чем игрушкой.

Для справки: NFC (от англ. Near Field Communication) – технология передачи данных на очень близком расстоянии, порядка 5-10 см. Является разновидностью технологии RFID – радиочастотной идентификации.

В 2022 к ним присоединяется Google и вот тогда начинается настоящий расцвет технологии, ведь NFC чипы стали поставляться с большинством смартфонов под Android. Пользователи сразу же оценили удобство и безопасность Google Pay – не нужно вводить всем надоевшие пароли; считывание карт происходило быстро и без ошибок.

Но это было только начало, ведь новая технология позволяет обмениваться генерируемыми на лету данными, в отличие от RFID, где данные прошиваются один раз и навсегда.

“NFC – это просто приветственное рукопожатие”, – говорит Рэй Хартьен из компании Sony – “Потоковая передача данных идет уже через Bluetooth”. А NFC технологии позволяют обойтись без необходимой проверки безопасности соединения.

Сама технология полностью безопасна для человека, так как использует безопасную частоту 13.56 МГц. А из-за небольшой дальности действия, уровень магнитного излучения очень мал.

Как использовать nfc метки

Пора применить полученные знания на практике! Ниже вы найдете несколько идей, как можно применить эту современную технологию.

  1. Поделится своими контактами – например так: прикрепить метку на лобовое стекло, теперь, если машина мешает выезду, можно отправить смс или позвонить.
  2. Цифровая визитка своими руками – к обычной визитке клеим нашу метку, теперь наши деловые партнеры могут перенести наш контакт в записную книжку телефона одним касанием.
  3. Пароль от домашнего Wi-Fi. Клеим метку на роутер и записываем в него пароль с помощью приложения InstaWifi. Теперь ваши гости смогут подключится к вашему Wifi роутеру просто прикоснувшись к метке.
  4. Запуск синхронизации смартфона с домашним компьютером. Метку можно приклеить на ноутбук или системный блок и прописать в него запуск приложения для синхронизации данных.
  5. Передать адрес встречи в Гугл Картах – нет нужды записывать, переносить текст в смс, просто создаем место в Гугл Картах у себя на телефоне и записываем на специальную метку в офисе. Каждый сотрудник считывает ее в удобное для себя время.
  6. Включение точки доступа. Клеим рядом с ноутбуком метку, далее устанавливаем приложение Trigger. Добавим новое задание, в качестве триггера выбираем NFC, выбор ограничений оставляем по умолчанию, в качестве действия выбираем “Беспроводные и локальные сети -> Wifi-зона”,а на последнем экране подносим к NFC-метке. В результате, если вы выходите с ноутбуком за пределы работы вашего Wifi роутера, то прикоснитесь к метке и ваш смартфон переключится в режим точки доступа, а ноутбук продолжит получать доступ к интернету.
  7. Включение ночного режима. TagWriter настраиваем на включение бесшумного режима. Теперь, как только вы поднесёте смартфон к этой метке, звуки уведомлений отключатся и ничто не потревожит ваш сон. А ещё одну метку сделайте для отключения бесшумного режима, чтобы утром ваш смартфон вернулся в исходное состояние.
  8. Автоматизируйте свой авто. Используйте метку в автомобиле для включения Bluetooth, 3G, запуска плеера или GPS навигатора. Теперь вы
  9. На рынке постепенно появляются устройства, поддерживающие NFC, — стереосистемы, телевизоры, которые позволяют создавать пару с телефоном или планшетом для удалённого управления.
  10. В сфере управления материально-техническими ресурсами можно использовать NDEF записи для хранения информации о месте отправления товаров, об их прохождении различных промежуточных пунктов и тому подобном.
  11. Управление освещением. Производитель чипов NXP объединился со специалистами по созданию умного дома EnOcean. На выставке CES 2022 они показали продукт, который использует NFC для настройки и добавления элементов освещения в домашнюю сеть.
  12. Замки, использующие NFC-карты вместо ключа, довольно часто встречаются на Западе, но если в вашем офисе есть электронные пропуска, то можно записать информацию с них в Google Pay и пользоваться смартфоном. Цена таких замков в магазинах не превышает 200 долларов, а комбинированные замки и того дешевле. Метки можно записывать в телефон, в специальное NFC-кольцо, в брелок – в общем, тиражировать для кого надо.
  13. В домашней библиотеке. Создать подробное описание каждой книги, а на корешок прикрепить аккуратную метку NFC. Теперь можно получить информацию о книге не вынимая ее из полки и не листая описание.

NFC используется для выполнения множества операций. Наиболее распространены следующие:

  1. Передача контактной информации: прикрепив метку к стеклу машины, пользователь может получить уведомление, если он перегородил выезд. И также сделать визитку, распространяя свой номер телефона через NFC.
  2. В метку записывается пароль от Wi-Fi и прикрепить её к роутеру для быстрого доступа. Это особенно полезно с динамическим паролем.
  3. Синхронизация телефона с ПК, для чего нужно вписать соответствующий код в метку.
  4. Записать координаты карты, чтобы указать точное место встречи. И также распространяются точки выезда, в которые должны отправляться сотрудники.
  5. Активация точки доступа на смартфоне при выходе за пределы Wi-Fi. Может использоваться по работе, если доступен безлимитный мобильный интернет. Для этого в настройках метки достаточно указать активацию соответствующей функции смартфона.
  6. Включение полёта или отключение уведомлений. Эта метка может использоваться перед сном, чтобы сторонний звук не беспокоил ночью. При этом для обратного действия потребуется отдельная метка.
  7. Для автоматизации автомобиля — быстрого включения плеера, радио и навигатора.
  8. Удалённое управление домашней техникой.
  9. Запись и передача информации в логистических фирмах. Позволяет отслеживать груз, указывая текущую локацию.
  10. Автоматизация строений, создание умных домов. Подойдёт для электронного управления окнами, освещением, дверью гаража, замками.
  11. Электронные пропуска в различные заведения.
  12. Клубные и бонусные карты.
  13. Быстрое получение информации о книге. Для этого в метку записывается краткое описание или ссылка на статью.

Увы, это грустная правда. Если поддержка NFC не встроена в ваш смартфон производителем, то никакие бытовые ухищрения не помогут вам оснастить его всеми возможностями этого модуля.

Почему? Чтобы ответить на этот вопрос, нужно понять, что скрывается за словами «поддержка NFC». Во-первых, в системную плату смартфона должен быть впаян специальный чип. Во-вторых, в корпусе смартфона должна находиться NFC-антенна, которая будет передавать сигналы от чипа во внешний мир. А в-третьих, операционная система вашего телефона должна быть способна принимать и передавать данные по NFC-протоколу.

Согласитесь, если вы не специалист по радиоэлектронике и по совместительству программист-системщик, добавить NFC в телефон без NFC своими руками довольно-таки проблематично. Поэтому единственный полноценный выход — купить смартфон с поддержкой NFC. К примеру, из нашей подборки бюджетных моделей.

Пишем свой класс для smart poster

Ниже я расскажу как создать свой тип

NDEF

записи на примере создания типа для Smart Poster записи.


Сразу оговорюсь, что мой тип упрощен. Он не поддерживает ни Action ни Size ни даже иконки, но он позволяет одновременно хранить текст и ссылку.

Так выглядит объявление для класса нашего Smart Poster’а:

class NdefNfcSmartPosterRecord : public QNdefRecord
{
public:
    Q_DECLARE_NDEF_RECORD(NdefNfcSmartPosterRecord, QNdefRecord::NfcRtd, "Sp", QByteArray())

    void setTitle(const QString &title, const QString &locale = "en");
    void setUri(const QUrl &uri);

    QString title(const QString &locale = "en") const;
    QUrl uri() const;

    //TODO:  Add icon, action and size fields support
private:
     RecordPart readPart(int &offset) const;
};

Q_DECLARE_ISRECORDTYPE_FOR_NDEF_RECORD(NdefNfcSmartPosterRecord, QNdefRecord::NfcRtd, "Sp")

Итак, разработчики Qt Mobility уже позаботились о том, чтобы нам было проще жить, и создали два специальных макроса, которые выполняют всю самую черновую работу.

Параметрами для макросов служат: имя класса, тип записи (для Smart Poster’а это QNdefRecord::NfcRtd) и «Имя типа» — аббревиатура для распознавания в теге. А также последний параметр в Q_DECLARE_NDEF_RECORD являются данные для первоначальной инициализации данных, в нашем случае это пустой массив байт.

Теперь посмотрим на реализацию методов чтения и записи.

Простая структура для хранения разобранной части записи:

struct RecordPart {
    enum Type {
        Uri,
        Text,
        Action,
        Icon,
        Size,
        Unknown
    };

    Type type;
    QString text;
    QString locale; // For text type
    quint8 prefix; // For Uri type
    RecordPart()
        : type(Unknown), text(QString()), locale(QString()), prefix(0)
    {

    }
};

Для начала рассмотрим методы для чтения:

Принцип работы

Да. На данный момент это решение — единственный для России работающий способ добавить NFC в телефон без NFC.

Но, конечно, его минусы очевидны. Оно подходит не для всех смартфонов, требует оформления договора с МТС, внешнюю антенну легко повредить, а также нарушается герметичность корпуса телефона, так как антенна выводится наружу через шов. Кроме того, это все-таки не полноценный NFC-чип. Им нельзя, к примеру, читать и программировать NFC-метки.

Если кратко, то, как и в пассивных RFID-чипах, NFC использует:

  • антенну;
  • блок безопасности.

Антенна передает информацию между меткой и считывающим устройством.

Также при помощи антенны происходит питание микрочипов внутри NFC-метки.

Блок безопасности состоит из набора микросхем, часть из которых хранит пользовательские данные, а другая занимается расшифровкой сигнала, считыванием и записью информации.

Блок безопасности может быть, как физическим устройством – конкретными чипами на NFC-метке, так и эмулироваться программными средствами, как в случае с PDA – смартфонами, КПК, смарт часами и другими портативными устройствами.

В целом устройство напоминает микрокомпьютер – тут даже есть свой процессор и оперативная память.

Благодаря своей конструкции NFC-метка не требует питания, стоит дешево и позволяет перепрограммировать себя под разные задачи. Но есть и ограничение – для организации обмена данными нужен хотя бы один активный контроллер NFC.

Можно программировать не одно событие, а целую цепочку. Экспериментируйте!

Программирование nfc-меток

Теперь когда мы обзавелись метками и расклеили их по дому, пора добавить немного магии – запрограммировать NFC метки на какие-либо действия. Для этого нам не понадобится специальный программатор или тестовый стенд.

Вся операция по прошивке метки выполняется с помощью своего смартфона и небольшой программы.

Начнем:

  1. Фото 4Установите из Play Market программу TagWriter – официальное приложение от компании-производителя NXP. Она полностью бесплатна.
  2. Выбираем пункт: Create, write and store.
  3. Дальше пункт: New.
  4. Теперь выбираем тип записи. Это может быть простой текст, телефонный номер, ссылка в интернет, запуск приложения или данные для Bluetooth-соединения. Есть и другие, но перечисленные выше самые употребляемые. Для пробы нам подойдет просто текст.
  5. Набираем любой текст.
  6. Нажимаем Next.
  7. Теперь мы попали на экран дополнительных опций. Тут можно выбрать приложение, для запуска после прочтения этой метки; установить защиту на перезапись этой метки другим устройством. Также здесь будет информация о моделях чипа, которые смогут вместить наше сообщение.
  8. Нажимаем Next.
  9. Теперь поднесем смартфон к метке.
  10. Поздравления! Вы только, что прошили свою первую NFC-метку.

Структура ndef

NDEF содержит информацию о байтовом представлении сообщений, которые могут содержать несколько записей. У каждой записи есть заголовок, в котором находятся метаданные (тип, длина и т.д.), и информацию для отправки. Если вернуться к аналогии с параграфом, то параграф формируется из предложений, относящихся к одной теме, так и в NDEF-сообщениях — хорошо, когда все записи относятся к одной тематике.

NDEF-сообщения в основном короткие, каждый обмен состоит из одного сообщения, каждая метка также содержит одно сообщение. Так как обмен NFC данными происходит при касании одного устройства другим или меткой, то будет неудобно передавать в одном сообщении текст целой книги, поэтому длина NDEF-сообщения сопоставима с длиной абзаца, но не целой книги.

NDEF-запись содержит информацию для пересылки и метаданные, как эту информацию интерпретировать. Каждая запись может быть разного типа, о чем объявляется в заголовке этой записи. Также в заголовке описывается какое место занимает запись в сообщении, после заголовка следует информация.

На рисунке ниже представлена полная информация о расположении бит и байт информации в NDEF-записи. Информация для пересылки занимает большую часть записи. Тип информации уточняет, как её интерпретировать, идентификатор информации опционален и используется для пересылки большого количества записей или перекрёстного обмена данными.

Типы nfc-меток

Существует четыре типа меток, описанных NFC-форумом, все они базируются на RFID-протоколах. Это делает NFC метки частично совместимыми со многими уже существующими RFID системами (например, Mifare и FeliCa). Хотя эти более старые системы не поддерживают NDEF, они, однако, могут опознавать NFC метки, которые совместимы с ними.

Например, считыватель RFID, который предназначен для работы с метками Mifare Ultralight, может считать идентификационный номер метки NFC 2 типа, хоть и не может прочитать закодированную NDEF информацию. Есть также пятый тип, который совместим с технологией, но при этом не является частью NFC-спецификации.

Типы 1, 2 и 4 основаны на ГОСТ Р ИСО/МЭК 14443A (состоит из четырёх частей: 1, 2, 3, 4), тип 3 — на ГОСТ Р ИСО/МЭК 18092. Более подробно про каждый из типов можно прочитать под спойлером.

Тип 1

:

  • Основан на ГОСТ Р ИСО/МЭК 14443A;
  • Может быть как только для чтения, так и для чтения/записи;
  • Содержит от 96 байт до 2 кбайт памяти;
  • Нет защиты данных от коллизий (прим. — коллизии могут возникнуть; когда два активных источника передают данные одновременно);
  • Примеры: Innovision Topaz, Broadcom BCM20203.

Тип 2:

  • Аналогично типу 1 основан на NXP/PhilipsMifareUltralight метках (ГОСТ Р ИСО/МЭК 14443A);
  • Может быть как только для чтения, так и для чтения/записи;
  • Содержит от 96 байт до 2 кбайт памяти;
  • Скорость взаимодействия 106 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP Mifare Ultralight.

Тип 3:

  • Основан на метках SonyFeliCa (ГОСТ Р ИСО/МЭК 18092 и JIS-X-6319-4) без поддержки шифрования и аутентификации, которая предоставлена спецификацией FeliCa;
  • Может быть либо только для чтения, либо для чтения/записи;
  • Скорость взаимодействия 212 или 424 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: Sony FeliCa.

Тип 4:

  • Аналогично типу 1, тип 4 основан на ГОСТ Р ИСО/МЭК 14443A;
  • Может быть либо только для чтения, либо для чтения/записи;
  • 2, 4 или 8 кбайт памяти;
  • Скорость взаимодействия 106, 212 или 424 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP DESFire, SmartMX-JCOP.

Пятый тип является собственностью NXPSemiconductors и, вероятно, самым распространённым на сегодняшний день MifareClassictag (ГОСТ Р ИСО/МЭК 14443A):

  • Память: 192, 768 или 3584 байта;
  • Скорость взаимодействия 106 кбит/с;
  • Поддержка анти-коллизий;
  • Пример: NXP Mifare Classic 1K, Mifare Classic 4K, Mifare Classic Mini.

Читаем ndef-сообщение

Когда телефон на Android считывает NFC-метку, он сначала её обрабатывает и распознает, а затем передаёт данные о ней в соответствующее приложение для последующего создания intent. Если с NFC может работать больше одного приложения, то появится меню выбора приложения. Система распознавания определяется тремя intent, которые перечислены в порядке важности от самой высокой до низкой:

  1. ACTION_NDEF_DISCOVERED: Этот intent используется для запуска аctivity, если в метке содержится NDEF-сообщение. Он имеет самый высокий приоритет, и система будет запускать его в первую очередь.
  2. ACTION_TECH_DISCOVERED: Если никаких activity для intent ACTION_NDEF_DISCOVERED не зарегистрировано, то система распознавания попробует запустить приложение с этим intent. Также этот intent будет сразу запущен, если найденное NDEF-сообщение не подходит под MIME-тип или URI, или метка совсем не содержит сообщения.
  3. ACTION_TAG_DISCOVERED: Этот intent будет запущен, если два предыдущих intent не сработали.

В общем случае система распознавания работает, как представлено на рисунке ниже.

Когда это возможно, запускается intent ACTION_NDEF_DISCOVERED, потому что он наиболее специфичный из трёх. Более того, с его помощью можно будет запустить ваше приложение.

Если activity запускается из-за NFC intent, то можно получить информацию с отсканированной NFC-метки из этого intent. Intent может содержать следующие дополнительные поля (зависит от типа отсканированной метки):

  • EXTRA_TAG (обязательное): объект Tag, описывающий отсканированную метку.
  • EXTRA_NDEF_MESSAGES (опциональное): Массив NDEF-сообщений, просчитанный с метки. Это дополнительное поле присуще только intent ACTION_NDEF_DISCOVERED.
  • EXTRA_ID (опциональное): Низкоуровневый идентификатор метки.

Ниже представлен пример, проверяющий intent ACTION_NDEF_DISCOVERED и получающий NDEF-сообщения из дополнительного поля.

Kotlin

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
            val messages: List = rawMessages.map { it as NdefMessage }
            // Обработка массива сообщений.
            ...
        }
    }
}

Java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages =
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i  ) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            // Обработка массива сообщений.
            ...
        }
    }
}

Также объект Tag можно получить из intent, который будет содержать полезную информацию и позволит перечислить технологии метки:

Kotlin

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Java

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

Чтение

Теперь рассмотрим методы чтения тега:

void NfcManager::readTarget(QNearFieldTarget *target)
{
    connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), this, SLOT(errorHandler(QNearFieldTarget::Error,QNearFieldTarget::RequestId)));
    connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), this, SLOT(readRecords(QNdefMessage)));
    target->readNdefMessages();

}


Чтение происходит в асинхронном режиме, поэтому в данном методе мы просто подключаем сигнал обработки ошибок и сигнал завершения чтения, который вызовется только в случае, если чтение произошло без ошибок.

После этого мы просто вызываем метод для чтения:

void NfcManager::readRecords(const QNdefMessage &message)
{
    if (message.isEmpty())
        return;

    QNdefRecord record = message.at(0); // Read only first
    readRecord(record);
}

Если чтение прошло успешно, то мы попадем в данный слот, где получим первую запись из списка присутсвующих на теге записей.


Да-да, по спецификации на теге может быть несколько записей, но как говорит документация, для

SymbianHarmattan

доступно чтение и запись только одной записи.

void NfcManager::readRecord(const QtMobility::QNdefRecord &record)
{
    DataContainer *result = 0;

    if (record.isRecordType<QNdefNfcUriRecord>()) {
        QNdefNfcUriRecord uriRecord(record);
        result = new UriDataContainer(uriRecord.payload(), uriRecord.uri().toString());
    }
    else if (record.isRecordType<QNdefNfcTextRecord>()) {
        QNdefNfcTextRecord textRecord(record);
        result = new TextDataContainer(textRecord.payload(), textRecord.text());
    }
    else if (record.isRecordType<NdefNfcSmartPosterRecord>()) {
        NdefNfcSmartPosterRecord smartPosterRecord(record);
        result = new SmartPosterDataContainer(smartPosterRecord.payload(), smartPosterRecord.uri().toString(), smartPosterRecord.title());
    }
    else {
        result = new DataContainer(record.payload());
    }

    emit tagReadFinished(result);
}

И вот, после нескольких переходов по вспомогательным методам мы добрались до самого главного метода, который превращает информацию закодированную в теги в привычные нам буквы.


На данный момент

Qt Mobility

из коробки поддерживает только два вида записей это ссылки (

Uri

) и текст (

Text

), к третьему типу —

Smart Poster

мы еще вернемся ниже.


Как можно заметить данные из записи сразу помещаются в некий новый объект, это простые объекты, которые я специально создал для облегчения передачи данных в

QML

В конце вызывается сигнал, содержащий объект с данными. В дальнейшем мы будем ловить этот сигнал в QML.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *