在 Mozilla,我们预见网络的未来在于其直接连接多个设备的能力,而无需使用互联网。许多不同的技术已经存在并已被实施以允许点对点连接。今天是介绍这些技术的系列文章中的第一篇。让我向您介绍 Wi-Fi Direct。
它是什么?
Wi-Fi Direct 是 Wi-Fi 联盟的通信标准,允许多个设备在不使用本地网络的情况下连接。它具有使用 Wi-Fi(一种快速且普遍可用的技术)的优势。
此标准允许设备通过在设备上启用可供其他人连接的便携式 Wi-Fi 接入点来发现对等体并连接到它们。在 Wi-Fi Direct 行话中,接入点称为组所有者。连接到组所有者的设备称为客户端或对等体。
在 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 个参数代表
- 设备的 MAC 地址
- WPS 方法(例如‘pbc’)
- 从 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 在网络行业工作了十多年。他对网络技术充满热情,并定期为开源项目贡献代码,他会在自己的技术博客 上写下这些内容。他还痴迷于电子游戏、动画和日语,并且喜欢学习外语。
8 条评论