
说明
Hex NFC 将在未来几天内发布,详情请见 apps.hex.pro/hex-nfc
大约 4 个月前,在一次去墨尔本的周末旅行中,Hex Pro 第一款应用的想法像一辆醉汉驾驶的卡车一样撞上了我。这个比喻很贴切,因为项目进行到 2 个月时,我的感受正是如此。
几天前,我在帮当地的健身房为他们的迷你冰箱搭建一个付款方案(那台冰箱是我从 Bunnings 花 1000 澳元买来,3 天后发现放在卧室里实在太吵,就“好心”捐出去了)。那位想靠卖能量饮料多赚几块钱的年轻小伙,原本打算让大家通过 PayID 转账给他。作为一个有自尊的软件工程师,我不能容忍他用这么草率的办法。于是我自告奋勇,免费为他实现一个 NFC 付款方案。
当时我其实从没接触过 NFC 标签,但我做了功课,然后上 AliExpress 订了一包 10 片装的 NTAG213。接着我用 Stripe 快速拼出了一个付款页面。当我准备把页面的 URL 写入新的 NFC 标签时,遇到了一件有意思的事。iOS App Store 上最大的那款 NFC 应用,有 14,000 条评价,安装量少说也有几十万,甚至上百万。于是我自然而然地装上试了试。结果呢?这款应用烂透了质量很差。我不敢相信这就是头号选手。我们真的做不出比这更好的东西吗?说实话,无意贬低它的开发者。事后看来,我现在理解他们在开发这款应用时必定面对过的种种挑战。但可以肯定地说,它就是 Hex NFC 的催化剂。
对于不了解的人来说,NFC 究竟是什么?它是近场通信(Near Field Communication)的缩写,一个“高度技术性”的说法,意思就是“把设备靠近标签来扫描”。
NFC 芯片其实是微型计算机,是真正的硅微芯片,能够执行逻辑运算并存储数据。大多数芯片过于简单,做不了前者,但有些可以执行加密之类的操作,并对随机数进行数学运算(挑战应答)。NFC 芯片最酷的地方在于,它们没有自己的电源。相反,您的读取设备(这里是 iPhone)会发出一个电磁场,为 NFC 芯片供电。这是真正天才的技术,而且还不止于此。芯片随后会以一种磁性节律振荡作为回应,读取器检测到它,并将其转换为可读的比特。
棘手之处在于,NFC 芯片有各种不同的型号和制造商,各有各的协议和架构,而且它们的数据手册并非都特别透明。
从墨尔本回到阳光海岸后,我做的第一件事就是开始为不同的 NFC 芯片构建虚拟仿真器。当时我手头没有多少 NFC 标签。起步时的库存是健身房那趟留下的 5 片 NTAG213,以及两张神秘的公共交通卡(一张日本的 Pasmo 和一张墨尔本的 Myki),iPhone 能扫到它们,却给不出什么明显的提示。
我当时想,如果网上关于 NFC 芯片的文档足够扎实,我就可以不必拥有每一种实体 NFC 芯片。只要把我的逻辑放到仿真器里跑一遍,就能知道它可行。当时的我真是太天真了。
NTAG213 实际上进行得相当顺利。它是最流行的消费级 NFC 芯片类型,文档齐全,是一种久经考验、全球通用、严格遵循开放标准的器件。
当我开始研究那两张神秘的交通卡时,我意识到事情不会像我想的那么简单。Pasmo 卡原来是 Sony 制造的 FeliCa 智能卡,用于日本全国的公共交通系统,其能力超过了几乎所有同类芯片。Myki 则是一张只读的 MIFARE DESFire EV3,由 NXP 制造,与 NTAG213 同一家制造商。
目标是打造终极的 NFC 工具,一个真正把其他应用远远甩在身后的东西。随着能力需求的扩展,以及我对市面上芯片的数量和种类了解得越来越多,我知道实物测试是躲不掉的。于是我订购了各种各样的芯片,尽量扩大覆盖面。您可以在这里查看完整清单。
于是仿真器的开发正式开始了。每种芯片都有自己的仿真器,我在真实芯片上一丝不苟地测试了每一项操作和能力,确保仿真器尽可能贴近真实芯片。这并不容易,而且极其耗时,但百分之百值得。我花了数百个小时,换来了出色的可靠性,以及针对每一种真实芯片型号做单元测试的能力。
这个项目的一大障碍在于,我希望在开发这个软件包时不依赖任何外部库或依赖项(Apple 的除外)。Hex Pro 的整体基调是隐私、信任和诚信。这是我从小被反复灌输的一套道德准则,而我真心认为,把事情做对,比走捷径更能带来成功。在我的职业生涯中,我始终竭尽全力维护客户的信任,而我在各个岗位上获得的默契信任,也总是带来更高效、更有成果的合作关系。所以对于我未来的客户,把同样的尊重延伸给他们,是一件优先的事。
因此,我完全避开了第三方软件包,最终得到的是一款干净得多、完全原生开发的应用。没有人能在我不知情的情况下往里面塞东西。话虽如此,下面这些代码我不得不自己实现:
-
PACE 大数运算和椭圆曲线(Brainpool 曲线)。
-
芯片驱动与 NDEF 处理。
-
交通出行记录读取器(用于 FeliCa 芯片)
-
日本公共交通车站名称库
Hex NFC 的独特功能之一,是能够读取电子护照数据。这是 iOS 设备一项格外迷人却未被充分利用的能力。一年前,我在用一款政府运营的身份证明应用做身份验证时,第一次知道了它的存在。可以说,只需碰一下证件就能证明身份,这种可能性让我完全着了迷。既然知道这是可行的,我就知道我必须拥有它。
我唯一的担心是,它可能仅限政府机构的应用使用。其实不必担心,因为事实证明电子护照芯片文档齐全,而且出人意料地容易上手……本该如此,如果 Apple 原生支持 PACE 这类加密算法的话。可惜没有这样的好事,再加上我“不用第三方软件包”的约束,这意味着我得自己实现 Brainpool。这是一项极其耗时的任务,但百分之百值得。最终的护照扫描功能令人着迷,我有幸在一本澳大利亚护照上做了测试,并且很凑巧地,还在一本尼泊尔护照上试过。我真心推荐大家亲自试试这个功能,您会惊讶于护照芯片的可访问分区里保存了什么信息(除非您是美国人,那样的话几乎什么都没有)。
对我来说另一个大项目是日本交通卡。我知道这项能力是可行的,但以前从未在任何 NFC 读取器里见过。这些卡很迷人,能够保存各种各样的信息。它们记录您卡里的余额,保存您何时何地刷卡进出公共交通的历史,甚至还会记下您在便利店或自动售货机消费的时间。
最大的挑战在于,在把车站 ID 映射到真实名称这件事上,日本政府并不怎么帮得上忙。如果我是个无赖,大可直接从网上有许可的爱好者数据集里把数据偷过来。但我们这里是正经做事,所以我决定从零开始建立我们自己的数据库。我先弄清了自己那张 Pasmo 上的车站名称,然后在邻里间打听,弄到了一张 Suica。两张卡都提供了我和邻居去过哪些地方的信息。我就从这里开始搭建数据库。遗憾的是,我们两个都是游客,收集到的数据很少。在这一点上,我对自己“不发网络请求”的规则做了让步,加入了一个“提交您自己的数据”功能,供愿意贡献车站名称信息的人使用。我希望随着时间推移,我们能建立起一份正当的、开放共享的映射表,与那些(合理地)对他人使用其成果设定许可的爱好者一较高下。
Hex NFC 下了很大功夫,力求支持 Apple 允许您扫描的每一种芯片。我没能拿到每一种芯片的实物,但覆盖面已经足够,让我能够根据数据手册和相近型号推断出缺失的芯片架构。例如,我一直没能弄到 NTAG215,但它的架构与 NTAG213 和 NTAG216 足够相似,我得以构建一个应该能完全覆盖它的仿真器。
我已在实物上完整测试过的芯片如下。
- NTAG 210µ
- NTAG213
- NTAG216
- NTAG424 DNA
- Ultralight EV1 128b
- Ultralight C
- ICODE SLIX
- ICODE SLIX2
- DESFire EV3
- FeliCa(Suica 和 Pasmo)
我也知道 MIFARE Classic 是可以用的,只是 Apple 不扫描它。
不过您可以想象,读取、写入、加密、永久锁定、密码尝试次数限制、擦除/转储数据块等等,需要大量的台架测试。数据手册遗漏了多少细微之处、仿真器需要多少次更新,会让您大吃一惊。到了这个阶段,我其实相当确信,Hex NFC 的仿真器是互联网上对真实芯片最贴切的映射。
除了这些芯片之外,我还内置了我能想到的每一种有用的记录类型,包括以下这些:
文本、URL 链接、Android/iOS 应用链接、Wi-Fi 凭据、联系人、邮件、电话、短信、FaceTime、地图、蓝牙切换、加密货币地址、快捷指令、模板化数据和原始字节,外加 22 个平台的社交主页和七个搜索引擎的搜索。
如果有人对进一步的支持有建议或需求,[email protected] 随时欢迎来信。
我们最终得到的,是我确信是 iOS 上能力最强、设计最好的 NFC 应用。它提供专业级的工具,包括批量标签写入、更出色的信息和数据展示、保存数据模板/预设,以及面向高级用户的高级命令控制台。它很稳健,能很好地处理不良触碰,可以用来格式化出厂芯片,在某些情况下还能修复损坏的芯片。
那么,既然它这么好,我为什么不拿来卖呢?我在它上面花了数百个小时,而过去人们通常按每小时约 100 澳元付我报酬。按这个算,理论上投入了超过 30,000 澳元。我不该收回成本吗?您可能还注意到,它采用 BSL 1.1(Business Source License)许可,属于源代码公开,并将在几年后自动转为开源许可证。
其实我有更大的打算。Hex Pro 眼下还是一家初创公司,这意味着我还没有既定的声誉或用户群。我希望 Hex NFC 能火起来,成为一款广受欢迎的工具,成为那些主流 NFC 应用的真正竞争者。我绝不会在我的任何应用里塞第三方广告。出于原则,我就是不会这么做。但当我发布其他项目时,我想在主页底部放一条交叉推广横幅。不会有任何打扰,但足以把我的其他作品呈现给那些欣赏 Hex NFC 品质、并对其他高质量应用感兴趣的人。
所以,除了为世界提供一款急需的软件之外,我的首要目标是建立 Hex Pro 的声誉,并交叉推广那些确实能赚钱的应用。
我希望用户能支持这项努力,也期待看到大家享受使用 Hex NFC 的过程。
谨此呈上 Hex NFC,供您参考。
在新标签页中打开
