玩转 NFC 标签 + 智能家居控制

花火田丁 花火田丁 2021-03-19 11:11:54 +0000


闲话智能家居 里提到的 NFC 标签,安卓手机用户也许并不陌生,在 NFC 这件事上,苹果的动作的确比安卓要慢了点。小米的碰碰贴、华为的WI-FI 贴等等,安卓用户已经玩得很溜了,而苹果从 iPhone 6 才开始支持 NFC,而且最初也只开放了 Apple Pay 和公交卡识别。

作为非业内人士,我也是后知后觉地在上次那场 Talk 里才知道「NFC 标签」的玩法。9.9包邮入手了6个NTAG213玩一玩。

本文主要是基于支持 NFC 的 iPhone + 「快捷指令 App」来实现,可以做什么呢?类似:iPhone 碰一下 NFC 标签关灯,碰一下进入勿扰模式,碰一下播放音乐,碰一下打电话,诸如此类。

背景介绍

关于「快捷指令/ Shortcuts App」

图片来自 App Store 截图


iOS 自带的自动化操作 App,忘记是从哪个版本加入进来的,它的前身是付费 App —— Workflow,作为一个第三方能做到各种自动化算是很强大了,当然这事儿第一方自己来做更合适,于是它就被 Apple 收了,成了系统自带应用,也算是造福用户了。

估计很多人都没点进去看过,就举几个官方自带的例子
  • 阅读模式 Reading Mode:打开勿扰模式、调成暗黑背景、自动播放喜爱的音乐、打开阅读 App

  • 制作 PDF Making PDF:把网页上的内容转换成 PDF 格式的文件

  • 拼图 Photo Grid:把选定的照片按照纵向、横向、网络的方式拼接成一张图片


关于触发条件

「触发条件」,如果你用过 ifttt,即, if 后面的那个判断条件(参见 如何用 ifttt 做一些自动化提醒),比如天气下雨了,我到了某个地方,到了某个特定的时间点,这类状态条件。当然还有更复杂的,比如某只股票到了什么价位,微博热搜中包含了什么关键词,等等,总结起来,就是「什么事情发生了」。
NFC 触发条件是什么呢?这时候,NFC 标签就要出场了,在 iOS 的「快捷指令」里,NFC 触发条件,实则是指 iPhone 扫描到了某个 NFC 标签,iOS 并不关心标签内容是什么,只是「扫描到了某个 NFC 标签」这样一个动作即可,我们可以给标签命名,作为唯一标示,下一次再扫描的时候,就能认出来了。

“NFC”触发条件包含一个选项:

NFC 标签:扫描到近距离无线通讯标签时触发自动化。初次扫描到 NFC 标签后,您可以为其命名供日后引用。除了唯一标识符外,NFC 标签的内容会被忽略。

【注】并非所有设备都支持 NFC。


iOS 对于 NFC 的支持情况

从 NFC 触发条件的说明中,我们看到「并非所有设备都支持 NFC」
但 Apple 官网没有一目了然地显示各个机型对于 NFC 的支持情况,在第三方网站上找到了一张清单,是截止到 iOS 13发布时的支持情况:
图片来自gototags,版权归原作者所有


从表中可以看出,只有支持「Background NFC Tag Reading」(后台读取 NFC 标签)的机型才能在「快捷指令 Shortcuts App」用上「NFC 触发条件」,即 iPhone XS 及以上机型,不过 7 - X 的用户也别丧气,后面会介绍一个曲线救国的方法,不如 Shortcuts 那么方便,但也能用,其他机型可以绕行了。

那什么是「后台读取 NFC 标签」呢?
为了了解更多细节,我找到了开发文档,对于 NFC 的支持是基于「Core NFC」框架实现。划重点,NDEF数据格式1 ,所以一般推荐使用 NTAG21X2 系列的芯片,因为它们已经预格式化了 NDEF 数据。

Core NFC

Detect NFC tags, read messages that contain NDEF data, and save data to writable tags.

在文档的 Topic 下有两个内容:
  1. Building an NFC Tag-Reader App (开发一个读取 NFC 标签的 App)

  2. Adding Support for Background Tag Reading (使之支持后台读取)

第二个就是我们关心的「后台读取」了

Adding Support for Background Tag Reading

Allow users to scan NFC tags without an app using background tag reading.

大白话就是不用打开 App,就可以扫描到 NFC 标签。想象一下用 Apple Pay 使用交通卡的场景就知道了,并不需要打开 Apple Pay 这个 App,就可以实现扫描和识别。这就是「快捷指令 + NFC」的核心所在了。 


关于 HomeKit (非必需)

我们很多场景的设置不仅仅是局限于 iPhone 本身,更多的还会涉及到家居环境,比如阅读模式下,除了 iPhone 上的一系列设置,我们还希望房间的灯光变亮一点或者换个色调,那这时候就需要用到系统自带的「家庭 / Home App」
我们用最简单的开关灯来举个例子。前提是你要有一盏能够通过网络控制的智能灯,小米、Yeelight、飞利浦等等都可以。
因为要在 iOS 上使用,这盏灯最好是支持 HomeKit,当然也可以通过小米等第三方应用去控制。
打开「家庭 / Home App」,添加配件,会提示我们去扫描一个二维码,这个二维码通常在设备机身上可以找到。
图片来自软截图


【注】在扫描之前,如果家里开了双频的Wi-Fi,请确保 iPhone 连接的是 2.4GHz 的Wi-Fi(目前大多数智能家居设备还不支持 5G Wi-Fi)

添加完成之后,我们就可以通过「家庭 App」去设定场景以及控制灯的色调和亮度。内置了一些场景,比如,「早上好」是开灯+亮度较低,「晚安」是关灯,你也可以自定义一个场景,比如,「学习」就是把灯开到最亮然后调整成柔和的色调。
图片来自 App 截图

「家庭App」设置好了之后, 也可以通过「Siri」去控制,Siri 更方便一点,直接说「早上好」就可以设置成「早上好」的灯光场景,不用打开 App。但就像上次 Talk 里那位从事 IT 工作的智能家居发烧友所说,一直说话也是很困扰,语音控制是很方便,但是说多了也会觉得很繁琐,而且很多安静的场景下也不方便语音。
是时候让 NFC 标签出场了。比如我们要实现的就是手机去碰一下某个 NFC 标签,就自动设置成某个灯光场景/阅读模式,即碰一下标签,让 iPhone 自动执行某个预设好的快捷指令。碰一下打电话给某个人,碰一下切换成勿扰模式,都可以。

开始玩吧

如果你想要一起玩,请先准备好以下条件:

  1. iPhone 7 以上机型

  2. iOS 13 以上系统

  3. 装好「快捷指令」(Shortcuts)App

  4. NTAG213 标签 1 枚

图片来自网络,版权归原作者所有


iPhone XS 及以上用户

iPhone XS,XR,11,11Pro,12,12Pro,这些机型支持「后台扫描 NFC 标签」,所以一切都变得很简单,只需要准备好标签并打开「快捷指令 App」设置好就可以了,不需要额外安装第三方 App。
网上的教程很多,用关键词「NFC 标签」+「快捷指令」或者「Shortcuts」即可。
准备好一张 NTAG 标签,设置入口在这里:
图片来自少数派,版权归原作者所有


【注】:少数派写过一篇付费阅读的文章,也可以搜了看看,不过了解了背景知识之后,快捷指令中的设置也并不复杂,付费部分不看也可以。

iPhone 7,8,X

关爱一下老机型的用户,而且网上的资料也比较少,本文正好做个记录。
首先我们先要解决「扫描」的问题。
iOS 14:打开控制中心,点击「NFC」按钮,然后把标签贴近 iPhone 顶部边缘处即可完成扫描。
图片来自网络,版权归原作者所有
iOS 13:需要借助第三方 App,这里推荐用 NXP 出品的 TagInfo,因为 NXP 本身是做 NFC 标签中的芯片的,而且 App 非常简洁+没有广告。
解决了扫描的问题,因为没有「后台扫描 NFC 标签」的功能,所以没办法直接用「快捷指令 App」,我们只能通过自定义标签的内容来实现,即实现 —— 扫描标签读出内容,根据内容去执行快捷指令。
关于写入,我们需要同样是 NXP 出品的另一个 App —— TagWriter
第一步,点击界面中间,并把 NFC 标签(以下简称 标签 A)靠近 iPhone 顶部边缘
第二步,识别后,点击底部右侧「Write New」
第三步(最关键),选择「Link」类型,自定义一个名称,选择「Custom URL」,「URL Data」处填写 shortcuts://run-shortcut?name=Study(其中 Study 是快捷指令 App 中某个快捷指令的名称)
【注】:这里用到了 iOS URL Scheme 的原理,在 iOS 系统中,App 的开发者可以自定义一个 URL Scheme,这个 URL Scheme 是注册到 iOS 系统的,当其他 App 想要打开第三方 App 的时候,只需要传入对应的 URL Scheme 就可以了,比如打开浏览器—— safari://
想了解更多 URL Scheme 的用法可以自行搜索,少数派也写过一篇3
最后一步,把标签 A 再次靠近 iPhone 顶部边缘(如果已经拿开了的话),点击「Save & Write」,就写入成功了。
图片来自 App 截图

接下来,就是验证我们想要实现的功能了。前面我写入的 Study 的快捷指令其实就是在背景介绍中提到的「通过家庭 App 设置场景为“学习”」这样一个动作,其他指令同理,名字写对就行。
好了,现在我们打开 TagInfo App,因为设置了默认「Scan & Launch」选项,当打开 App 时,随即弹出了扫描 NFC 标签的提示。

试一下吧

图片来自 App 截图

当我扫描标签 A 的时候,TagInfo 直接打开了「快捷指令 App」,仔细看的话,会看到「Study」指令右上角的图标飞快地变成了执行中,执行完成后,显示✅状态,而此时我房间里的灯成功地切换到了预设的「学习场景模式」—— 色调白+亮度100%。
看到这里,你也许会有个疑问,折腾这么一大圈,又是打开 TagInfo App,又是扫描标签,直接进到「快捷指令 App」里去点一下「Study」这个指令,不是更快?
对!直接点更快,或者如果你愿意用语音,跟 Siri 说一下也很快。
那我们为什么要这么大费周章呢?答案在背景部分已经说过了,为了不抛弃 iPhone 7,iPhone 8,iPhone X的用户😂,因为 XS 及以上机型,只需要设置好指令+扫描标签就可以一气呵成了,第三方 App 不存在的。
另外就是,我大胆地、毫无根据地猜测「后台读取 NFC 标签」也许是可以从 iOS 系统层面去控制的,也就是说,7 - X 这三款机型是不是有朝一日也能支持上?毕竟在 iOS 14 之前,这三款机型只能通过第三方 App 去扫描标签,而 iOS 14之后就支持从控制中心直接扫描了,那会不会,iOS 15 之类的,这三款机型也能后台读取了呢,毕竟,别浪费了已经内置的 NFC 硬件功能啊,不过,按照 iPhone 这几年对于老机型的态度,我也许在梦吧🤦‍♀️
好了,iPhone XS 及以上并且已经升级到 iOS 14 的朋友们,可以愉快地玩起来了,NTAG213普通标签9.9元6个,还包邮,只不过不能贴在金属表面。还有支持更大容量的216以及支持抗金属等等,也有那种可以随身携带的滴胶卡,我买的是普通的213(下图中间那种),家里用用足够了。
图片来自网络,版权归原作者所有


  1. NFC Data Exchange Format : NFC数据交换格式,NFC组织约定的NFC tag中的数据格式。是轻量级的紧凑的二进制格式,可带有URL、vCard和NFC定义的各种数据类型。 ↩︎

  2. NTAG213,NTAG215,NTAG216 

    https://www.nxp.com.cn/products/rfid-nfc/nfc-hf/ntag-for-tags-labels:NTAG-TAGS-AND-LABELS  ↩︎

  3. 入门 iOS 自动化,读懂 URL Schemes

    https://sspai.com/post/44591 ↩︎


撒欢吧
谈理想
聊人生
讲故事
相对论
花火田丁
微信号:huahuoding
花火田丁
不折腾不人生