Тиждень тому я розбирав, як влаштований лічильник дотиків: чип рахує власні зчитування сам, застосунок вставляє байти-заповнювачі, а мітка при кожному дотику підставляє замість них живе число і свій ID у той вміст, який на ній записаний. Той текст закінчується там само, де закінчується мітка, тобто в мить, коли значення приходять на телефон.
Відтоді мені раз у раз ставлять питання, яке напрошується само: «чудово, мітка віддає мені 049F50824F1390x000007, і що з цим робити?» Щоб на iPhone щось зробити з цими значеннями всередині команди, їх спершу треба розібрати. Роботи з рядками тут небагато, зате вона марудна, і я волію, щоб тобі не довелося писати її самому.
Тож я зібрав дві команди й ділюся ними як посиланнями iCloud. Одна з них слугує мозком. Друга показує, як цим мозком користуватися.
Що саме віддає мітка
Перед самими командами варто швидко пригадати, що до них узагалі приходить, бо від цього залежить, як їх застосовувати.
На екрані налаштування лічильника вибираєш тип вмісту мітки: посилання, лист, SMS або команда. Щойно вмикаєш перемикачі лічильника дотиків та ID мітки, застосунок вставляє в цей вміст байти-заповнювачі, а чип при кожному зчитуванні міняє їх на живі значення. Якщо взяти 049F50824F1390 як ID мітки і 000007 як лічильник, чотири типи вмісту виглядають так:
Посилання:
https://nfc.cool/tap-counter/перетворюється наhttps://nfc.cool/tap-counter/?nfc=049F50824F1390x000007Текст листа:
Hi, here's my card.перетворюється наHi, here's my card. 049F50824F1390x000007Текст SMS:
Order confirmed!перетворюється наOrder confirmed! 049F50824F1390x000007Вхід команди:
log-entryперетворюється наlog-entry 049F50824F1390x000007
Посилання вище справжнє. Наша жива сторінка лічильника читає значення ?nfc= просто з власного адресного рядка. Тож якщо хочеться побачити підстановку на власні очі ще до того, як писати свою автоматизацію, запиши мітку з посиланням на https://nfc.cool/tap-counter/, увімкни обидва перемикачі, піднеси мітку, і сторінка покаже ID та лічильник, які щойно отримала.
Якщо тип вмісту стоїть на команді, NFC.cool запускає вибрану команду через shortcuts://run-shortcut?name=Your%20Shortcut&input=text&text=<payload>, і дописані значення NFC уже сидять у тексті. На вхід команди приходить звичайний текстовий рядок. Лишається тільки дістати з нього ID мітки й лічильник.
Залежно від того, які перемикачі були ввімкнені під час запису, приходить або повний шаблон (14 шістнадцяткових символів, x і ще 6 шістнадцяткових), або сам ID мітки з 14 символів, або сам лічильник із 6. Парсер розбирає всі три варіанти.
Parse NFC Tap Counter: універсальний парсер
Встановити Parse NFC Tap Counter
Оце і є той мозок. Жодного інтерфейсу, на вході один текст, на виході словник. Так задумано: службова команда без інтерфейсу чисто вбудовується в усе, що ти будуєш далі, а словник найлегше розбирати з іншої команди дією «Отримати значення зі словника».
Ось що лежить у словнику:
tagID: ID мітки з 14 шістнадцяткових символів або порожній рядок, якщо перемикач був вимкнений.count: кількість зчитувань десятковим числом (тобто000007перетворюється на7, а00000Aна10) або порожньо, якщо перемикач був вимкнений.countHex: вихідний лічильник із 6 шістнадцяткових символів, якщо потрібен саме він. Порожньо, коли його немає.hasTagID,hasCount: логічні значення для розгалуження, щоб писати «Якщо hasCount істинне» й не перевіряти рядок вручну.content: вхід з акуратно вирізаними даними NFC, щоб решта команди бачила його таким, яким він був до втручання мітки. Якщо на вході було посилання з?nfc=..., повернеться посилання без цього хвоста. Якщо текст листа з дописаним ID мітки, повернеться текст без нього.raw: незмінений початковий вхід, раптом захочеться записати його в журнал або відкотитися до нього.
Щоб викликати парсер зі своєї команди, потрібні три дії:
«Отримати вхідні дані команди» як текст (сюди приходять дані NFC).
«Виконати команду» → Parse NFC Tap Counter, цей текст на вхід. Вимкни «Показувати під час виконання», щоб усе лишалося непомітним.
«Отримати значення зі словника» → візьми
tagID,count,contentабо ті ключі, які тобі потрібні.
Ось і все. Починаючи з третього кроку роби зі значеннями що завгодно: розгалужуйся за hasTagID, пиши count у нотатку, надсилай вебхук з JSON. Парсер нічого не припускає про те, що твоя команда хоче зробити з результатом, і саме тому лишається маленьким та придатним до повторного вжитку.
Окремо про лічильник: у словнику він лежить справжнім числом, а не текстом, тож подавай його одразу в «Обчислити» або в порівняння всередині «Якщо» без зайвих перетворень. Переведення з шістнадцяткової системи в десяткову вже зроблено.
NFC Tag Alert: демонстрація
Цю демонстрацію я радив би поставити першою, навіть якщо сповіщення в реальних сценаріях тобі й не потрібні. Вона бере текст на вході, запускає парсер і показує одне вікно із заголовком NFC Tag Scanned і двома рядками:
Tag ID: 049F50824F1390
Scans: 7Раджу її першою тому, що швидшої перевірки мітки з лічильником просто немає. Запиши в NFC.cool Tools мітку з типом вмісту команда і назвою NFC Tag Alert, увімкни перемикачі лічильника дотиків та ID мітки, запиши, піднеси. На екрані вискочить вікно зі справжніми значеннями з твоєї фізичної мітки.
Якщо значення збігаються з очікуваними, мітка робить свою роботу, і можна братися за складніше. Якщо лічильник не той або ID мітки немає, справа в мітці (чи в перемикачах, які ти вибрав під час запису), а не у твоїй команді. Заради того, щоб викреслити цілий клас питань на кшталт «а чи взагалі винен тут чип», варто поставити команду з п’яти дій.
А якщо колись забудеться, як саме викликати парсер, ця команда заразом слугує найменшим робочим прикладом. Відкрий її, подивись на п’ять дій, перенеси структуру до себе.
Як під’єднати це до власної команди
Вміст мітки потрапляє в команду двома шляхами. Парсер влаштовують обидва.
Від мітки (вміст типу «команда»). Запиши мітку з типом вмісту команда, вибери свою команду за назвою, увімкни ті перемикачі, які потрібні. Відтепер кожен дотик запускає команду, і дані NFC вже лежать на вході. Усередині команди виклич Parse NFC Tap Counter на цьому вході, і tagID та count готові до вжитку.
Від посилання. Такий випадок трапляється частіше. На мітці лежить посилання, телефон відкриває його при дотику, а лічильник їде разом із ним у ?nfc=.... Якщо дотик має обробляти команда замість браузера (або поряд із ним), проведи посилання через команду, яка приймає вебсторінку з Safari, і запусти на ньому Parse NFC Tap Counter. Парсер акуратно зрізає шматок ?nfc= і повертає посилання без нього в content, тож далі його можна віддати браузеру, запиту до API чи будь-чому, що чекає на звичайне посилання.
Ось приклад із чотирьох дій для сценарію «записувати кожне зчитування в нотатку»:
«Отримати вхідні дані команди» як текст.
«Виконати команду» → Parse NFC Tap Counter, цей текст на вхід.
«Отримати значення зі словника» → три звертання поспіль за
tagID,countіcontent. Кожне поклади в змінну.«Додати до нотатки» → один рядок на кшталт
[Current Date] tag=<tagID> count=<count> url=<content>.
І от у тебе є журнал дотиків, який веде сама мітка. Ні сервера, ні чужої аналітики, ні облікового запису деінде.
Кілька ідей, що з цим робити далі
Кілька невеликих речей, які відкриває парсер. Записую їх тут, щоб не довелося вигадувати з нуля:
Розгалуження за ID мітки. Одна команда, багато міток. Додай дію «Якщо» на кожен відомий ID: спрацювала мітка на дверях офісу, вимикаються сповіщення; спрацювала мітка в студії, вмикається режим фокусування; спрацювала мітка на кухні, запускається таймер. ID вказує саме на фізичну мітку, а не на вміст, тож посилання на всіх мітках може бути одне, а реакція на кожну своя.
Вибрати переможця на потрібному зчитуванні. Поєднай
hasCountз порівнянням. Дійшовcountдо 100, надсилається вітальне повідомлення, на решті зчитувань працює звичайна обробка. Порядок гарантує чип, а команда його лише читає.Надсилання на вебхук. Поєднай це з вебхуками NFC.cool, якщо обробка потрібна на сервері, а писати застосунок для iOS не хочеться: надішли розібрані значення як JSON, далі сервер упорається сам. Дві дії на iOS, і мітка під’єднана до всього, що розуміє HTTP.
Журнал у файлі чи нотатці. Найпростіше й несподівано корисне. Дописуй
timestamp, tagID, countу файл в iCloud Drive або в одну нотатку, і матимеш журнал дотиків, який потім можна гортати чи звести в графік. Добре працює, коли треба зміряти інтерес до однієї мітки без жодної інфраструктури.
Якщо збереш на цьому щось цікаве, мені справді хочеться на це подивитися.
Коротка подяка
Обидві команди зібрані в Shortcuts Playground, плагіні Федеріко Вітічі для створення команд iOS зі звичайного тексту. Чудовий інструмент, і я хочу подякувати авторові за нього: без цього плагіна ці дві команди забрали б у мене значно більше часу.
Кілька слів про Android
Швидкі команди робить Apple, тож ці дві команди працюють лише на iPhone. Сам лічильник дотиків при цьому працює на обох платформах, бо підстановка відбувається всередині чипа, і йому байдуже, який телефон зчитує мітку. На Android типи вмісту «посилання», «лист» і SMS поводяться так само, як на iOS. Якщо схожа автоматизація потрібна там, застосунки на кшталт Tasker чи MacroDroid візьмуть посилання з ?nfc=... і дістануть значення власними діями для роботи з рядками. Формат, який іде з мітки, той самий.
Спробуй сам
Якщо цікавить докладне пояснення, як лічильник дотиків влаштований усередині, воно в попередньому тексті. А якщо хочеться просто побачити мітку з лічильником у ділі, не будуючи власну автоматизацію, наша жива демонстрація лічильника читає значення ?nfc= просто з власного посилання: запиши мітку, яка веде туди, піднеси її і дивись, як на екрані вискакують лічильник та ID мітки.
Сам лічильник дотиків живе в NFC.cool Tools на iPhone і на Android. А весь набір інструментів, які я побудував навколо NFC, зібраний на сторінці читання і запису NFC.