Допустим, ты напечатал одну и ту же ссылку на пятидесяти NFC-стикерах и наклеил их на пятьдесят товаров, плакатов или визиток. Через неделю возникает очевидный вопрос: а какой из них вообще подносили к телефону? И сколько раз?
Я делаю NFC.cool не первый год, и обычный ответ, который я слышу, это сервер. Генерируешь пятьдесят уникальных ссылок, направляешь их все на бэкенд и даёшь аналитике считать обращения. Работает, но теперь у тебя есть инфраструктура, за которую надо платить и которая должна оставаться живой ровно столько, сколько существуют эти наклейки. Мне всегда казалось, что для такого простого вопроса это многовато движущихся частей.
Есть путь проще, и он всё это время лежал внутри самого NFC-чипа. Многие метки умеют считать свои сканирования. При правильной настройке метка сама расскажет, сколько раз её считывали и что это за физическая метка, и никакого бэкенда для этого не нужно. Это один из моих любимых NFC-фокусов для демонстрации, так что разберём, как он устроен и как его настроить.
Что такое счётчик касаний NFC
В большинстве NFC-наклеек, которые продаются, стоят чипы семейства NTAG21x: NTAG213, NTAG215 и NTAG216. У этих чипов есть небольшая особенность, о которой, как я вижу, почти никто не подозревал: встроенный счётчик. При каждом чтении метки он увеличивается на единицу. Живёт он в железе чипа, не в приложении и не на сервере. (Если хочется подробнее разобрать эти чипы, я писал о них в тексте про типы NFC-меток для iPhone.)
Я описываю это как одометр метки. Одометр в машине считает километры независимо от того, смотрит на него кто-нибудь или нет, и счётчик NFC точно так же считает чтения. Число всегда есть. Вопрос только в том, настроено ли что-то, чтобы его тебе показать.
Именно этим и занимается счётчик касаний в NFC.cool Tools, и это та функция, которой я горжусь больше всего. Он один раз настраивает метку так, чтобы дальше она сама сообщала свой счёт. Тебе не нужно самому считывать метку, чтобы посмотреть число, и не нужно, чтобы приложение было под рукой, когда её подносят другие люди. Метка считает и отчитывается самостоятельно.
У тех же чипов есть уникальный идентификатор метки, серийный номер, прошитый на заводе, немного похожий на MAC-адрес сетевой карты. Счётчик касаний умеет выводить и его, а это и позволяет различать пятьдесят одинаковых на вид наклеек.
Как это работает, без жаргона
Когда ты записываешь на метку содержимое с включённым счётчиком касаний, приложение делает, по-моему, по-настоящему изящную вещь. Оно вставляет в записываемое содержимое ряд символов-заглушек, заменителей счёта и идентификатора. Эта часть до сих пор кажется мне немного фокусом, хотя я сам её и построил.
Дальше всё берёт на себя чип. Как сказано на экране помощи внутри приложения: «Приложение вставляет в содержимое байты-заглушки. При каждом сканировании чип заменяет их текущим числом касаний и идентификатором метки ещё до того, как iPhone их прочитает. Ни сервера, ни интернета не требуется».
Так что при каждом касании последовательность такая. Человек подносит телефон к метке. Чип просыпается, увеличивает счётчик, подменяет заглушки настоящими числами и только потом отдаёт телефону готовое содержимое. Телефон, который считал метку, заглушек не видит вовсе: ему достаётся полная ссылка с уже вшитым живым счётом.
Важно вот что: настраивать всё нужно один раз. После первой записи метка предоставлена самой себе и будет считать и подставлять значения при каждом касании, любым человеком, на любом телефоне, всю жизнь наклейки. Ничто в этой цепочке не выходит в интернет. Подсчёт происходит в чипе. Подстановка происходит в чипе. Если направить готовую ссылку на свой сайт, твой собственный сервер увидит приходящий счёт, но это твой выбор, а не требование функции.
Что с этим реально делать
Самосчитающая метка звучит забавным фокусом ровно до тех пор, пока не приложишь её к настоящей задаче. Вот четыре применения, к которым я возвращаюсь чаще всего, когда меня спрашивают, зачем это нужно.
Понять, какую именно наклейку считали. Та самая задача про пятьдесят стикеров из начала текста. Наклей одинаковую ссылку на каждую метку, включи идентификатор, и каждое касание придёт с серийным номером ровно той метки, откуда оно пришло. Одна ссылка в управлении, пятьдесят различимых меток.
Ограничить бесплатный доступ. Раз счёт приходит с каждым касанием, на него можно реагировать. Устрой акцию, где первая сотня сканирований получает демоверсию, а остальные уходят в другое место. Ограниченный тираж может выдавать полную награду, пока счётчик не перевалит за выбранный порог. Метка сама обеспечивает принцип «кто успел, тот и съел», и системы регистрации для этого не надо.
Мерить интерес. Наклей метку на визитку, плакат, коробку с товаром или витрину, и счётчик станет тихой метрикой интереса. Будет видно, поднесли к карточке телефон дважды или двести раз, и городить для этого аналитическую обвязку не нужно.
Подтверждать подлинность. Счётчик умеет только расти и не отматывается назад. Число, которое способно лишь увеличиваться, убедительно подделать трудно, и поэтому, на мой взгляд, ему есть место в ограниченных сериях и в проверке на контрафакт. У настоящей метки правдоподобная растущая история, у скопированной нет. Если эта сторона NFC интересна, я копнул глубже в тексте о том, как NFC хранит зашифрованные секреты.
Соедини несколько пунктов, и получится примерно так: мастер кладёт метку в каждый пронумерованный экземпляр изделия, и все они ведут на одну посадочную страницу. Идентификатор говорит, какой экземпляр держит покупатель, счёт говорит, как часто этот покупатель возвращался, а поскольку счёт только растёт, перекупщик не выдаст копию за оригинал. Ни аккаунтов, ни базы данных, ни ежемесячных счетов, только чип, делающий свою работу. Ради такого результата я эту функцию и делал.
Настройка по шагам
Функция живёт в NFC.cool Tools и на iPhone, и на Android. Она входит в подписку Platinum, так что для записи меток со счётчиком она понадобится. Если ты никогда не записывал метки, основы разобраны в моём тексте «Как записывать NFC-метки на iPhone».
Открой NFC.cool Tools, перейди в раздел NFC Tools и нажми «Счётчик касаний NFC».
Выбери, что должна отдавать метка: ссылку, письмо, SMS или быструю команду. (Быстрая команда только на iOS, потому что «Быстрые команды» это приложение Apple, а ссылка, письмо и SMS работают на обеих платформах.)
Собери это содержимое как обычно: набери ссылку, напиши сообщение, выбери команду.
Включи нужные переключатели: счётчик касаний добавляет живое число, а идентификатор метки добавляет её серийный номер. Можно взять любой из двух или оба сразу.
Если программируешь партию меток с одинаковым содержимым, включи пакетную запись, чтобы окно сканирования оставалось открытым и метки можно было писать одну за другой.
Загляни в предпросмотр. Он показывает пример результата с условными значениями, чтобы до записи было видно, куда именно лягут счёт и идентификатор.
Нажми «Записать на NFC-метку» и поднеси метку к верхней части телефона.
Это вся настройка, и я специально сделал её такой короткой. С этого момента метка самодостаточна: она считает и отчитывается сама, для каждого, кто её подносит, с приложением или без него.
Если однажды захочется это выключить, приложение умеет отключать счётчик на уже записанной метке. Чип перестаёт подставлять живые значения, а содержимое остаётся ровно таким, каким его записали в последний раз. Одна деталь, которую стоит знать: внутри себя чип продолжает считать и после отключения подстановки, так что счёт не теряется, его просто перестают показывать.
Где появляются счёт и идентификатор
Куда именно попадают значения, зависит от выбранного типа содержимого. Когда включены оба переключателя, идентификатор и счёт вставляются вместе: сначала идентификатор, потом счёт, соединённые маленькой x. Если взять 049F50824F1390 как идентификатор и 000007 как счёт, «до и после» для каждого типа выглядит так:
Ссылка:
https://example.com/pageпревращается вhttps://example.com/page?nfc=049F50824F1390x000007Текст письма:
Привет, вот моя карточка.превращается вПривет, вот моя карточка. 049F50824F1390x000007Текст SMS:
Заказ подтверждён!превращается вЗаказ подтверждён! 049F50824F1390x000007Вход быстрой команды:
log-entryпревращается вlog-entry 049F50824F1390x000007
Значения дописываются аккуратно, поэтому остальное содержимое продолжает работать как обычно. Выключи один переключатель, и придёт только второе значение: либо счёт (000007), либо идентификатор (049F50824F1390).
И тут мне всегда задают вопрос: почему 000007, а не просто 7? Счёт записывается в шестнадцатеричном виде, то есть в системе счисления по основанию 16, где после цифр от нуля до девяти идут буквы от A до F, и дополняется до шести символов. Так что 000007 это просто седьмое сканирование метки. После девятого начинают появляться буквы: 00000A это 10. Потолок это FFFFFF, примерно 16 миллионов сканирований, а такого запаса хватит почти любой реальной метке. Идентификатор метки занимает строку подлиннее: семибайтовый заводской серийный номер чипа, и в отличие от счёта он не меняется никогда.
Если готовая ссылка ведёт на твой сайт, сервер читает эти значения прямо из адреса: записывай счёт в лог, сравнивай его с порогом или различай метки по идентификатору.
Какие метки нужны
Функция зависит от чипа, поэтому метка имеет значение. Для счётчика касаний NFC.cool поддерживает чипы NTAG213, NTAG215 и NTAG216. Это самые распространённые NFC-наклейки для телефонов, найти их несложно, но перед оптовой покупкой я всё же проверил бы тип чипа. Если попробовать взять метку, которую функция не поддерживает, приложение предупредит, а не запишет то, что работать не будет: я специально об этом позаботился, потому что видел, насколько бесит молчаливый отказ.
Если нужно пополнить запасы, на странице рекомендованных NFC-меток перечислены наклейки NTAG216, которыми мы пользуемся и на которых тестируем. А если ты только выбираешь метки, моё руководство по типам NFC-меток для iPhone разбирает компромиссы простыми словами.
Несколько быстрых вопросов
Можно ли обнулить счётчик? Нет. Это односторонний счётчик, встроенный в чип, и он умеет только расти. Так задумано, и в этом, честно говоря, весь смысл: счётчик, который можно сбросить, бесполезен и для ограниченных серий, и для проверки подлинности. Если нужен чистый счёт, возьми новую метку.
Счёт видит любой или только я? Любой. Каждый телефон, который подносят к метке, получает готовое содержимое с уже вставленным счётом, стоит на нём приложение или нет. В этом и смысл: метка отчитывается сама за себя.
Можно ли потом выключить? Да. Приложение умеет остановить подстановку заглушек в чипе. Ссылка или сообщение остаются на метке, прекращаются только живые обновления. Внутри себя чип продолжает считать.
Счётчик приватен? Счёт живёт на метке, а не на сервере. Любой, кто поднесёт телефон, увидит счёт в содержимом, а если это содержимое ведёт на твой сервер, кроме него счёт не увидит никто. Идентификатор метки хранит заводской серийный номер, а не персональные данные.
Нужен ли интернет? Нет. И подсчёт, и подстановка происходят внутри чипа. Интернет появляется в картине, только если записанная ссылка ведёт на сайт.
Попробуй
Почти все годы, что я работаю с NFC, подсчёт касаний означал уникальные ссылки и бэкенд, который их суммирует. Счётчик NTAG21x тихо снимает это требование: метка ведёт собственный подсчёт, а счётчик касаний в NFC.cool Tools его включает. Это одна из тех функций, о существовании которых мне хочется, чтобы знало больше людей.
Хочешь посмотреть, как это работает, до записи первой метки? Наша живая демонстрация счётчика касаний это страница, которая делает ровно то, что описано в тексте: запиши метку со ссылкой на неё, поднеси, и страница покажет число сканирований и идентификатор, которые ей только что передал чип. Сервера в цепочке нет, есть только ссылка.
Функция уже доступна в NFC.cool Tools на iPhone и на Android. Весь набор инструментов для NFC, который я построил, собран на странице чтения и записи NFC.