Firefox OS 中的 NFC

Firefox OS 正在与 Mozilla 的合作伙伴和社区进行开放式合作开发。本着这种精神,在过去一年多的时间里,Mozilla 和 Deutsche Telekom (DT) 团队紧密合作,为 Firefox OS 开发了平台级 NFC 支持。在此期间,两支团队在端到端开发周期的各个阶段都进行了定期产品和工程会议。

从提出 NFC API 到定义整体架构,再到原型设计和完成交付产品中的生产级实现,这种合作模式非常有效,它真正展示了“开放”(开放技术和开放贡献模式)推动网络发展的力量。毕竟,这正是 Mozilla 和 Firefox OS 所代表的意义。

在这篇文章中,我们描述了围绕 Firefox OS NFC 实现的一些基本知识。

NFC 路线图

目前在 2.0 版本中,Firefox OS 支持基于 NFC 的内容共享(联系人、图像、视频、URL),以及无线读取 NFC 启用标签中存储的信息(标签读取)。我们的共享用例与其他操作系统的 NFC 启用设备(如 Android/Windows)兼容,因此跨这些设备的这些内容共享将有效。我们的 NFC API(首次在 v1.3 中引入)已在 v2.0 中与核心应用程序一起用于这些共享用例。

可以在维基上找到整体 B2G 路线图

WebNFC API

Firefox NFC API 允许支持 NFC 数据类型交换格式 (NDEF) 的任意两个设备之间进行点对点 (P2P) 通信。可以将自身呈现为 NDEF 兼容标签的 NFC 无源标签也可以被读取和写入。Firefox OS 的 NFC 实现目前仅供认证应用程序使用,但如上所述,随着 API 的开发以涵盖更多用例和数据格式,将向市场应用程序开放。

一个使用此 API 的示例

以下是在两个 NFC 设备之间进行 P2P 通信(来自MDN 上的 NFC API 文档

// Utility Function for UTF-8 string conversion to Uint8Array.
// Or ideally, simply add this to your webapp HTML to use NfcUtils:
// <script defer src="shared/js/nfc_utils.js"></script>
function fromUTF8(str) {
  if (!str) {
    return null;
  }
  var enc = new TextEncoder('utf-8');
  return enc.encode(str);
}

var tnf     = 1;                                             // NFC Forum Well Known type
var type    = new Uint8Array(fromUTF8("U"));                 // URL type
var id      = new Uint8Array(fromUTF8(""));                  // id
var payload = new Uint8Array(fromUTF8("u0003mozilla.org")); // URL data, with a record prefix 0x3 replacing http://

var ndefRecords = [new MozNDEFRecord(tnf, type, id, payload)];
var nfcdom = window.navigator.mozNfc;

nfcdom.onpeerready = function(event) {
  // event.detail is a session token
  var nfcPeer = navigator.mozNfc.getNFCPeer(event.detail);
  var req = nfcpeer.sendNDEF(ndefRecords); // push NDEF message to other NFC device.
  req.onsuccess = function(e) {
    console.log("Successfully pushed P2P message");
  };
  req.onerror = function(e) {
    console.log("P2P push failed!");
  };
};

更多随 Firefox OS 附带的此类示例可以在使用 NCF API 中找到。

当前支持的数据类型

WebNFC API 目前支持 NFC 数据交换格式 (NDEF)。未来计划支持非 NDEF 类型。从上面的示例中,它是 4 个字段,它使用 3 个可选 Uint8Array 数据类型定义。TNF 和类型用于将消息路由到相应的已注册 Web 应用程序。

(来源:http://git.mozilla.org/?p=releases/gecko.git;a=blob_plain;f=dom/webidl/MozNDEFRecord.webidl;hb=refs/heads/v2.0

[Constructor(octet tnf, optional Uint8Array type, optional Uint8Array id, optional Uint8Array payload)]
interface MozNDEFRecord
{
  /**
   * Type Name Field (3-bits) - Specifies the NDEF record type in general.
   *   tnf_empty: 0x00
   *   tnf_well_known: 0x01
   *   tnf_mime_media: 0x02
   *   tnf_absolute_uri: 0x03
   *   tnf_external type: 0x04
   *   tnf_unknown: 0x05
   *   tnf_unchanged: 0x06
   *   tnf_reserved: 0x07
   */
  [Constant]
  readonly attribute octet tnf;

  /**
   * type - Describes the content of the payload. This can be a mime type.
   */
  [Constant]
  readonly attribute Uint8Array? type;

  /**
   * id - Identifier is application dependent.
   */
  [Constant]
  readonly attribute Uint8Array? id;

  /**
   * payload - Binary data blob. The meaning of this field is application
   * dependent.
   */
  [Constant]
  readonly attribute Uint8Array? payload;
};

注意,在即将发布的 Firefox OS 版本中,我们将稍微更新数据类型,使 TNF 成为枚举类型,而不是八位字节。

Mozilla 的 Flame 设备支持 NFC,更多设备即将推出

我们的Flame 设备 支持 NFC,我们预计很快将从合作伙伴那里获得更多商用设备。Flame 设备支持来自 NXP (PN547C2) 的 NFC 芯片组。

视频

这是一个基于 Firefox OS 的一些 NFC 共享功能的演示视频

Flame 设备中使用 NFC 的核心应用程序

  • 图库
  • 视频
  • 音乐
  • 设置
  • 系统浏览器

一个示例第三方应用程序

这是一个由 Mozilla 人员Dietrich Ayala 使用 NFC 标签读取 API 编写的应用程序。BikeCommute 是一款应用程序,用于注册一个 NFC 标签来跟踪 Mozilla 波特兰办事处的自行车通勤者。该应用程序运行在搭载 Firefox OS 2.2 的 Nexus 4 上,使用 Famo.us 构建 UI,使用 PouchDB 构建数据存储并同步到远程 CouchDB。目前,该应用程序只是从写入标签的文本记录中读取用户的电子邮件地址。

下一个版本将添加对在用户手机上运行该应用程序的支持,使用本地联系人(用户)而不是纯文本记录,并能够从他们自己的设备配置 NFC 标签。该计划是根据 CouchDB 数据和 Mozillians.org 集成开发排行榜,以便我们可以部署并与其他办事处和世界各地的 Mozilla 人员竞争!源代码可在 GitHub 上获得,欢迎拉取请求!

这是一个该应用程序运行的视频演示

更多 NFC 文档

就是这样!

我们很高兴将此新功能引入 Firefox OS 的不断增长的 API 和功能列表!我们希望开发人员能够充分利用 NFC 通过设备间共享以及未来计划中的非接触式支付等服务提供的全部功能。

开发人员何时可以开始使用此 API?

目前,此 API 可用于认证应用程序。我们迫不及待地想要完成将此 API 提供给特权应用程序的工作,以便所有开发人员都能利用它。如果您希望参与或加入并提供帮助,请随时跟踪Bug 1042851。我们的目标是在下一个版本 v2.2 中完成此工作。

NFC 的下一步

在即将发布的版本中,在合作伙伴的帮助下,我们将重点关注扩展 NFC 覆盖范围以支持安全元素和服务,例如基于 NFC 的支付。我们将在以后的单独文章中对此进行更多介绍。敬请期待。

为了开放的网络!

关于 Sandip Kamat

Sandip Kamat 是 Mozilla 的连接设备产品管理团队成员。他大部分职业生涯都在构建移动技术和产品。在加入 Mozilla 之前,他在摩托罗拉移动 (后被 Google 收购) 和西门子移动工作。他是印度理工学院马德拉斯分校和加州大学圣地亚哥分校 (雷迪) 的校友。他热衷于将尖端技术带给普通人,以使他们的生活变得更加美好。

更多 Sandip Kamat 的文章…

关于 Robert Nyman [荣誉编辑]

技术布道师和 Mozilla Hacks 的编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直从事网络前端开发工作,在瑞典和纽约市都有工作经验。他还定期在http://robertnyman.com 上发博,喜欢旅行和结识新朋友。

更多 Robert Nyman [荣誉编辑] 的文章…


9 条评论

  1. Steve Lee

    我无法编辑兼容性文档以添加评论,但想说的是,我刚详细调查了 NFC 标签,用于http://gpii.net RFID 监听器 [1],我们已经从 MiFair Classic 1K 切换到 NTAG2x3 系列(例如 NFC203,但 NFC213 似乎是最敏感的)。目前,NTAG 似乎是最受欢迎和支持最广泛的标签。我发现很难找到任何清晰的公开文档——主要是因为它们似乎并没有真正遵循 ISO 7 层模型——因此它变得非常令人困惑。

    [1] https://github.com/OpenDirective/GPII-windows/releases/tag/Listeners_V1.3.0

    2014 年 11 月 10 日 下午 11:42

    1. Sandip Kamat

      Steve,感谢你的信息。请随时请求访问该文档以添加评论。谢谢,Sandip

      2014 年 11 月 10 日 下午 1:22

    2. Garner Lee

      只要特定的 NTAG213 可以像标准 NDEF(NFC 数据交换格式)兼容标签一样公开功能,它就应该可以用作 NDEF 标签。基本的 NDEF 格式(tnf、type、id、payload)支持*应该*保持事物互操作性。

      您是否正在将您的代码(Node.js?)移植到 FirefoxOS?

      2014 年 11 月 10 日 下午 4:59

    3. Garner Lee

      只要特定的 NTAG213 可以像标准 NDEF(NFC 数据交换格式)兼容标签一样公开功能,它就应该可以用作 NDEF 标签。基本的 NDEF 格式支持(tnf、type、id、payload)*应该*保持事物互操作性。

      您是否正在将您的代码(Node.js?)移植到 FirefoxOS?

      2014 年 11 月 10 日 下午 5:01

  2. Steve Lee

    Sandip:我应该问谁?

    Garner:是的,他们是 NFC 论坛类型 2 兼容的,因此支持 NDEF

    我们为 Windows、Linux 和 Android 用户提供监听器,因为我们获得了 EC 的资助。由于我参与了 FxOS 的工作,我渴望将核心架构移植到它,至少是那些有意义的组件。是的,它是节点,我正在考虑尝试 browserify

    2014 年 11 月 11 日 上午 2:41

    1. Sandip Kamat

      Steve,您只需从 G-doc 中点击“请求访问”,这样文档所有者就可以收到您要使用的帐户的请求。谢谢

      2014 年 11 月 11 日 下午 6:58

  3. Moinuddin Chinu

    我想知道如何在手机上使用孟加拉语。请帮帮我。

    2014 年 11 月 13 日 上午 8:00

  4. Charles

    NFC API 最终会支持发送和接收原始 APDU 命令吗?

    2014 年 11 月 18 日 上午 4:29

    1. Garner Lee

      有一些关于新标签对象用于处理“transceive(something)”的初步想法,但还没有确定的东西。

      您心目中有什么应用程序和支持?

      2014 年 11 月 19 日 下午 2:51

本文的评论已关闭。