P2P 网络:Firefox OS 中的 Wi-Fi Direct

在 Mozilla,我们预见网络的未来在于其直接连接多个设备的能力,而无需使用互联网。许多不同的技术已经存在并已被实施以允许点对点连接。今天是介绍这些技术的系列文章中的第一篇。让我向您介绍 Wi-Fi Direct。

它是什么?

Wi-Fi Direct 是 Wi-Fi 联盟的通信标准,允许多个设备在不使用本地网络的情况下连接。它具有使用 Wi-Fi(一种快速且普遍可用的技术)的优势。

此标准允许设备通过在设备上启用可供其他人连接的便携式 Wi-Fi 接入点来发现对等体并连接到它们。在 Wi-Fi Direct 行话中,接入点称为组所有者。连接到组所有者的设备称为客户端对等体

Wi-Fi Direct diagram

在 Flame 上启用 Wi-Fi Direct

为了使用,设备驱动程序必须支持 Wi-Fi Direct,并且 Flame 上就是这样。但在开始之前,首先要做的是启用支持。运行此 gist 中的代码,将已植根的设备连接到您的计算机。

Firefox OS 中的 Wi-Fi Direct API 目前仅适用于认证应用程序。不要忘记在您的 manifest.webapp 文件中请求wifi-manage 权限。这也意味着您无法在 Firefox 市场中分发此类应用程序,但您仍然可以使用它并使用该技术。

本文中的 JavaScript 代码使用承诺和 Firefox OS 最新版本中支持的一些 ES6 结构。确保您熟悉这些结构!

让我们看看周围都有谁

可以通过navigator.mozWifiP2pManager 对象访问 Wi-Fi Direct API。
首先要做的是:启用 Wi-Fi Direct 以获取周围对等体的列表。启用和获取对等体的分别是setScanEnabled(true)getPeerList(),两者都返回承诺。

navigator.mozWifiP2pManager.setScanEnabled(true)
  .then(result => {
    if (!result) {
      throw(new Error('wifiP2pManager activation failed.'));
    }

    // Wi-Fi Direct is enabled! Now, let's check who's around.
    return navigator.mozWifiP2pManager.getPeerList();
  })
  .then(peers => {
    console.log(`Number of peers around: ${peers.length}!`);
  });

true 传递给navigator.mozWifiP2pManager.setScanEnabled() 以启动 Wi-Fi Direct,如果激活成功,承诺将返回 true。使用它来检查您的设备是否支持 Wi-Fi Direct。

navigator.mozWifiP2pManager.getPeerList() 返回的承诺将返回一个对象数组,代表您周围启用 Wi-Fi Direct 的对等体。

{
  name: "Guillaume's Flame",
  connectionStatus: "disconnected",
  address: "02:0a:f5:f7:38:44", // MAC address of the device
  isGroupOwner: false
}

可以使用navigator.mozWifiP2pManager.setDeviceName(`Guillaume's Flame`) 设置对等体名称。它是一个允许人类识别设备的字符串。
正如您所料,connectionStatus 属性告诉我们设备是否已连接。它有 4 个可能的值

  • ‘disconnected’
  • ‘connecting’
  • ‘connected’
  • ‘disconnecting’

您可以监听navigator.mozWifiP2pManager 发出的peerinfoupdate 事件,以了解何时出现任何对等体状态更改(新对等体出现或消失;对等体连接状态更改)。然后,您需要调用getPeerList() 以获取更新。

敲敲。谁在那儿?

既然我们知道了您周围的设备,让我们与它们连接。我们将使用navigator.mozWifiP2pManager.connect(address, wps, intent)。这 3 个参数代表

  1. 设备的 MAC 地址
  2. WPS 方法(例如‘pbc’)
  3. 从 0 到 15 的意图值

MAC 地址在使用getPeerList() 检索的对等体对象中给出。
WPS 方法现在可以安全地忽略,但请关注 MDN 以了解更多信息。
对于初始连接,意图的值将决定谁将成为 Wi-Fi Direct 网络的组所有者。值越高,发出连接的设备越有可能成为组所有者。

// Given `peer`, a peer object.
navigator.mozWifiP2pManager.connect(peer.address, 'pbc', 1)
  .then(result => {
    if (!result) {
      throw(new Error(`Cannot request a connection with ${peer.name}.`));
    }

    // The connect request was successfully issued.
  });

在这个阶段,您仍然没有连接到对等体。返回值将告诉您连接是否可以启动。
要了解连接的状态,您需要监听一个事件。

打破僵局

Wi-Fi Direct 对象会发出不同类型的事件。当另一个设备连接时,会触发statuschange 事件。

连接的详细信息在navigator.mozWifiP2pManager.groupOwner 中可用。使用以下属性提供的信息

  • isLocal:设备是否是组所有者。
  • ipAddress:组所有者的 IP 地址。

还公开了更多属性,但上述属性足以构建基本应用程序。

当另一个对等体使用navigator.mozWifiP2pManager.disconnect(address) 断开连接时,也会触发statuschange

打个招呼

Wi-Fi Direct 只是一个连接协议,现在由您决定如何进行通信。连接后,您将获得组所有者的 IP 地址。这可与fxos-web-server(运行在您设备上的 Web 服务器)一起使用,以请求信息。然后,组所有者将充当服务器。

您还可以使用p2p-helper.js,这是一个由Justin D’Arcangelo 开发的方便的助手库,它可以抽象出 Wi-Fi Direct API 的复杂性,并轻松构建应用程序。

我建议您查看以下示例应用程序

  • Firedrop,一个在设备之间共享媒体文件的示例应用程序。
  • Wi-Fi Columns,一个跨多个设备运行的游戏。请查看下面的演示。

现在,轮到您创建令人惊叹的应用程序,这些应用程序可以让多个设备在没有蜂窝数据或互联网连接的情况下进行交互!

关于 Guillaume Cedric Marty

Guillaume 在网络行业工作了十多年。他对网络技术充满热情,并定期为开源项目贡献代码,他会在自己的技术博客 上写下这些内容。他还痴迷于电子游戏、动画和日语,并且喜欢学习外语。

更多 Guillaume Cedric Marty 的文章…


8 条评论

  1. niutech

    谢谢,但 wifi-manage 权限仅适用于认证应用程序。如何在未植根的 Alcatel One Touch Fire 上运行此类应用程序?或者如何先安全地植根我的手机?

    2015 年 1 月 28 日 下午 09:30

    1. Guillaume Cedric Marty

      您好。如果您将其用作您的主要设备,我不建议您植根它。最好的选择是使用 Flame,它既易于植根又安全。也就是说,Wi-Fi Direct 仍处于早期阶段,一些经过认证的 API 在被证明安全和隐私安全后会更改为特权 API。将来 Wi-Fi Direct 可能会出现这种情况。

      2015 年 1 月 29 日 上午 02:37

  2. Caspy7

    在演示中,当我们看到游戏出现并开始玩时,究竟展示了什么?发生了什么样的通信?一个设备是将游戏的像素发送到另一个设备,还是我们实际上什么也没看到,而两名玩家只是有可能?

    2015 年 1 月 29 日 上午 04:46

    1. Guillaume Cedric Marty

      上面的设备将图像发送到下面的设备。正如您在演示开始时看到的那样,没有任何设备有互联网连接。所有操作都使用 Wi-Fi Direct 完成。
      如果您查看 YouTube 网站上的视频,您可以在视频播放时看到以注释形式的解释。

      2015 年 1 月 29 日 上午 05:58

      1. Caspy7

        太棒了!谢谢。
        我没有看到明确说明(如果我错过了,请原谅),但是此设置是否允许设备之间进行双向通信?
        (我猜答案是肯定的。)

        2015 年 1 月 29 日 上午 06:25

        1. Guillaume Cedric Marty

          是的,您可以进行双向通信,就像客户端通过传统网络与服务器进行通信一样。

          2015 年 1 月 30 日 上午 11:55

  3. Daniel Daines-Hutt

    我忍不住看到这个就想起了玩旧的连接 Game Boy 等

    有人想玩俄罗斯方块吗!?

    这个实际的应用范围会很大

    首先想到的就是文件传输!

    2015 年 2 月 2 日 下午 7:50

    1. Caspy7

      你说文件传输?
      https://hacks.mozilla.ac.cn/?p=27752

      2015 年 2 月 9 日 下午 2:55

本文的评论功能已关闭。