Skip to content

← 返回 NFC.cool Blog

如何在没有服务器的情况下统计 NFC 标签的扫描次数

一枚 NFC 标签正被手机轻触,旁边是一个不断上升的扫描计数数字

假设你把同一个 URL 印到五十枚 NFC 贴纸上,再把它们贴到五十件产品、五十张海报或者五十张电子名片上。一周后,有人提出了那个显而易见的问题:到底是哪一枚被轻触了?又被轻触了多少次?

我做 NFC.cool 已经好几年了,我听到的常见答案是:上服务器。你生成五十个唯一的链接,全部指向一个后端,再用分析软件统计点击。这能行,但你现在就在运维基础设施、为它付费,还得指望它在这些贴纸存在的整个期间一直在线。对于一个这么简单的问题来说,这在我看来一直都是太多需要操心的环节了。

其实有一个更简单的办法,而且它一直就在 NFC 芯片里。很多标签都能自己统计扫描次数。只要设置得当,一枚标签就会告诉你它被读取了多少次、以及它是哪一枚实体标签,完全不需要任何后端参与。这是我最喜欢演示给别人看的 NFC 小技巧之一,下面就讲讲它的原理,以及怎么设置。


NFC 轻触计数器到底是什么

大多数你能买到的 NFC 贴纸用的都是 NTAG21x 系列芯片:NTAG213NTAG215NTAG216。这些芯片有一个我发现大多数人都从不知道它存在的小功能:内置计数器。标签每被读取一次,计数器就加一。它存在于芯片的硬件里,不在某个 App 里,也不在服务器上。(如果你想更深入地了解这些芯片,我在 iPhone 上的 NFC 标签类型里讲过。)

我喜欢把它比作标签的里程表。不管有没有人盯着看,汽车的里程表都在计里程;NFC 计数器也用同样的方式统计读取次数。这个数字始终都在,唯一的问题是有没有什么东西被设置好来把它显示给你看。

这正是 NFC.cool Tools 里的 NFC 轻触计数器功能所做的事,也是我最引以为豪的部分。它只需对标签配置一次,从那以后标签就会自己上报它的计数。你不需要亲自扫描标签来查看这个数字,别人轻触它时你也不需要 App 在场。标签会自己完成计数和上报。

这些芯片还带有一个唯一的标签 ID:一个出厂时烧录进去的序列号,有点像网卡上的 MAC 地址。轻触计数器功能也能把它呈现出来,正是这一点让你能区分五十枚长得一模一样的贴纸。


抛开术语,它是怎么工作的

当你在开启了轻触计数器的情况下往标签写入内容时,App 会做一件我认为相当巧妙的事。它会把一行占位字符嵌进你写入的内容里,作为计数和 ID 的替身。即便是我亲手做出来的,这部分至今在我看来还是有点像变魔术。

从那以后,剩下的就交给芯片了。正如 App 内帮助界面所说:“App 会在你的内容里嵌入占位字节。每次扫描时,芯片会在 iPhone 读取之前把它们替换成当前的轻触计数(和/或标签 ID)。无需服务器或联网。”

所以每次轻触的流程是这样的。有人把手机贴近标签,芯片被唤醒,把计数器加一,把占位符替换成真实的数字,然后才把处理好的内容交给手机。扫描标签的那部手机从来看不到占位符,它看到的是一个完整的 URL,里面已经嵌好了一个实时的计数。

我希望你记住的一点是:你只需设置一次。在那第一次写入之后,标签就自己运转了:它会为每一次轻触、每一个人、每一部手机计数并替换,直到这枚贴纸的寿命终结。这条链路里没有任何环节碰到互联网。计数发生在芯片里,替换也发生在芯片里。如果你把处理好的 URL 指向一个你自己掌控的网站,你自己的服务器就会看到计数传过来,但这是你的选择,不是这个功能的硬性要求。


它到底能拿来做什么

一枚会自己计数的标签,在你把它对上一个真实问题之前,听起来只是个小把戏。下面是别人问我它有什么用时,我反复想到的四种用途。

判断是哪一枚实体贴纸被扫描了。 这就是本文开头那个五十枚贴纸的问题。给每一枚标签写上同一个 URL,打开标签 ID,每一次轻触传来时就会带上它来自的那枚标签的序列号。只需管理一个 URL,五十枚标签你依然能区分开。

限制免费使用。 因为计数会随每一次轻触一起传出,你就能据此做出反应。搞一个促销活动:前一百次扫描拿到演示版,之后的扫描被重定向到别处。一次限量发行可以把完整奖励一直发到计数超过你设定的阈值为止。标签无需背后的注册系统就能落实“先到先得”。

追踪互动。 把一枚标签贴到电子名片、海报、产品包装盒或橱窗上,计数器就成了一个安静的互动指标。你不必为它搭建分析管道,就能知道一张名片是被轻触过两次还是两百次。

证明真伪。 这个计数器只会往上走,无法倒回。一个只能增加的数字很难令人信服地伪造,所以我认为它在限量版商品和防伪验证中很有用武之地。真品标签有一段合情合理、不断攀升的历史,而仿冒品没有。如果你对 NFC 的这一面感兴趣,我在 NFC 如何保护加密的机密信息里讲得更深入。

把其中几点组合起来,你会得到这样的效果:一位手工艺人在某款产品每一批带编号的发行里都放进一枚标签,全部指向同一个落地页。标签 ID 告诉他买家手里拿的是哪一件,计数告诉他这位买家回头了多少次;而因为计数只会上升,二手转卖者无法神不知鬼不觉地把仿品当成原件出手。没有账户,没有数据库,没有月度账单,只有芯片在做它该做的事。这就是我做这个功能想要达到的那种效果。


一步一步设置

这个功能在 NFC.cool Tools 里,iPhone 和 Android 上都有。它属于 Pro(Platinum)订阅,所以写入启用了计数器的标签需要这个订阅。如果你从没写入过标签,我那篇如何在 iPhone 上写入 NFC 标签的教程会先带你过一遍基础。

  1. 打开 NFC.cool Tools,进入 NFC Tools 部分,轻触 NFC Tap Counter

  2. 选择标签要传递的内容:URLEmailSMSShortcut。(Shortcut 仅限 iOS,因为快捷指令是一款 Apple 的 App;URL、Email 和 SMS 在两个平台上都能用。)

  3. 像平常一样编写那段内容:输入链接、写好消息、选好快捷指令。

  4. 打开你想要的开关:NFC Tap Counter 会加上实时计数,NFC Tag ID 会加上标签的序列号。你可以只用其一,也可以两个都用。

  5. 如果你要给一批内容相同的标签编程,打开批量写入,这样扫描界面会一直开着,你就能一枚接一枚地写入。

  6. 查看预览。它会用替身值显示示例输出,让你在确认之前就能清楚地看到计数和 ID 会落在什么位置。

  7. 轻触 Write to NFC Tag,把一枚标签贴近你手机的顶部。

整个设置就这些,我有意把它做得这么短。从那一刻起,标签就能自给自足了:它会为每一个轻触它的人自己计数并上报,不管有没有这个 App。

如果你哪天想停掉它,App 可以对一枚已有的标签关闭计数器。芯片会停止替换进实时值,但内容会原封不动地保留在标签上,跟上次写入时一模一样。有一个细节值得知道:即使你关掉了替换,芯片在内部仍然继续计数,计数从不会丢失,只是不再显示出来而已。


计数和标签 ID 会出现在哪里

这些值落在哪里取决于你选的内容类型。两个开关都打开时,标签 ID 和计数会一起插入:先是 ID,再是计数,中间用一个小写 x 连接。以 049F50824F1390 作为标签 ID、000007 作为计数,下面是每种类型替换前后的样子:

  • URL: https://example.com/page 变成 https://example.com/page?nfc=049F50824F1390x000007

  • Email 正文: Hi, here's my card. 变成 Hi, here's my card. 049F50824F1390x000007

  • SMS 正文: Order confirmed! 变成 Order confirmed! 049F50824F1390x000007

  • Shortcut 输入: log-entry 变成 log-entry 049F50824F1390x000007

这些值是干净地追加上去的,所以你内容的其余部分照常正常工作。关掉其中一个开关,你就只得到另一个:要么只有计数(000007),要么只有标签 ID(049F50824F1390)。

到这里我总会被问到一个问题:为什么是 000007 而不是直接写 7?计数是用十六进制写的,这是逢十六进一的进位制,从 0 到 9 再到 A 到 F,并被补齐到六个字符。所以 000007 就是这枚标签的第七次扫描。一旦过了第九次扫描,你就会开始看到字母:00000A 就是 10。上限是 FFFFFF,大约是 1600 万次扫描,比几乎任何现实中的标签可能用到的都要宽裕得多。标签 ID 是一段更长的十六进制字符串,也就是芯片 7 字节的出厂序列号,而且和计数不同,它永远不会变。

如果你把处理好的 URL 路由到你自己的网站,你的服务器就能直接从地址里读出这些值:记录计数、把它和阈值做比较,或者通过 ID 来分辨不同的标签。


你需要哪种标签

这个功能取决于芯片,所以标签很重要。NFC.cool 的轻触计数器支持 NTAG213NTAG215NTAG216 芯片。这些是面向手机销售的最常见的 NFC 贴纸,所以很容易买到,但在你大批量购买之前,我还是建议先确认芯片类型。如果你试图使用一枚这个功能不支持的标签,App 会提醒你,而不是写入一些无法工作的东西。我特意做了这一点,因为我见过无声失败有多让人抓狂。

如果你需要备货,我们的推荐 NFC 标签页面列出了我们使用并测试过的 NTAG216 贴纸。如果你刚开始挑选标签,我那篇iPhone 适用的不同 NFC 标签类型指南会用通俗的话讲清楚各种取舍。


几个常见小问题

我能重置计数器吗? 不能。它是芯片里内置的单向计数器,只能往上走。这是有意为之的,老实说也正是它的意义所在:一个能被你重置的计数器,对限量版或防伪验证毫无用处。如果你需要一个全新的计数,请换一枚新标签。

计数是谁都能读取,还是只有我能? 谁都能。每一部轻触标签的手机都会拿到已经嵌好计数的处理好的内容,不管有没有安装这个 App。这正是重点:标签为它自己上报。

我之后能把它关掉吗? 能。App 可以让芯片停止替换占位符。URL 或消息会留在标签上,只是实时更新停了。芯片在内部仍继续计数。

这个计数器是私密的吗? 计数存在标签上,而不是服务器上。任何轻触标签的人都会在内容里看到计数;如果那段内容指向一个你掌控的服务器,那么就只有那个服务器能看到。标签 ID 是出厂序列号,不是能识别个人身份的信息。

它需要联网吗? 不需要。计数和替换都发生在芯片内部。只有当你写入的 URL 恰好指向某个网站时,互联网才会牵涉进来。


来试试看

在我跟 NFC 打交道的大多数年头里,统计轻触次数都意味着要用唯一链接外加一个后端来汇总它们。NTAG21x 的计数器悄悄消除了这个要求:标签自己记账,而 NFC.cool Tools 里的 NFC 轻触计数器功能就是把它开启的那个开关。这是那种我一直希望更多人知道它居然能做到的功能之一。

想在写入第一枚标签之前就先看看它怎么工作?我们的实时轻触计数器演示就是一个完全按本文所述运作的页面:写一枚指向它的标签,轻触一下,页面就会把芯片刚刚交给它的扫描计数和标签 ID 显示给你看。这中间没有服务器参与,只有那个 URL。

它现已在 NFC.cool Tools 中提供,支持 iPhoneAndroid。想看看我做的整套 NFC 工具,可以看看 NFC 读取与写入功能