通过声音实现无服务器、点对点的本地文件共享

2020-09-25 12:37:31

使用声音的WebRTC信令的概念验证。适用于所有带麦克风+扬声器的设备。在浏览器中运行。

附近的设备通过音频音调序列交换必要的会话描述协议(SDP)数据来协商WebRTC连接。协商成功后,浏览器之间将建立本地WebRTC连接,允许通过LAN交换数据。

WebRTC技术允许运行在不同设备上的两个浏览器相互连接并交换数据。不需要安装插件或下载应用程序。为了发起连接,对等体交换联系信息(IP地址、网络端口、会话ID等)。这个过程称为信令。WebRTC规范没有为信令定义任何标准-接触交换可以通过任何协议或技术来实现。

在这个项目中,信号是通过声音来执行的。信令序列如下所示:

对等体A通过将会话数据编码成音调来广播WebRTC连接的要约。

附近的对等体捕获对等体A发出的声音并解码WebRTC会话数据。

想要与对等体A建立连接的对等体B用音频应答进行响应。答案中包含对等体B';的联系信息。此外,对等设备B开始尝试连接到对等设备A。

对等体A接收来自对等体B的应答,对发送的联系数据进行解码,并允许对等体B连接

所描述的信令序列不涉及信令服务器。因此,使用通过声音发送信号的应用程序例如可以由静态网页提供服务。唯一的要求是控制音频输出/捕获设备。

当前方法的明显限制(特征)是只有附近的设备(例如,在同一房间内)才能彼此建立连接。此外,由于NAT不可用,设备必须连接在同一本地网络中。

通过声音通信的数据包含初始化WebRTC连接所需的联系信息。此数据以会话描述协议(SDP)格式存储。由于声音数据在带宽和健壮性方面有很大限制,因此希望传输尽可能少的数据。因此,SDP被从所有不相关的信息中剥离,并且仅传输建立连接所需的基本数据。目前,包含最低要求的SDP数据的声音包的格式如下:

音频包的总大小为112字节。使用当前的音频编码算法,SDP包可以在5-10秒内传输(具体取决于使用的TX协议)。使用较慢的协议可以在嘈杂的环境中或在通信设备彼此相距较远的情况下提供更可靠的传输。

当前方法使用多频频移键控(FSK)调制方案。要传输的数据首先被分成4位块。在每个时刻,使用6个音调传输3个字节-每个4位块一个音调。这6个音调在4.5 kHz范围内发射,分为96个等间距频率:

对于所有协议:df=46.875 Hz。非超声检查:F0=1875.000 Hz。超声方案:F0=15000.000 Hz。

为方便起见,使用简单的WebRTC黑客自动检测您计算机的本地IP地址,因此您不必手动提供它。但是,出于安全原因,最新的WebRTC规范阻止了这一点,因此在某个时候,该特性将在所有浏览器中停止工作。例如,它不再适用于Safari。

您需要一个Emscripten编译器。此外,您还需要使用Emscripten构建FFTW。运行编译.sh脚本。

这是一个简单的工具,使用说明的波形共享声音TX/RX协议接收和发送数据。在标准输入上键入一些文本,然后按Enter键进行传输。

在存在多个本地网络的情况下,当前无法选择要使用的网络。总是使用第一个。

Emscripten生成的.js太大(~1MB)。用纯JS重写吗?

在移动设备上,使用Firefox,即使在关闭选项卡之后,页面仍可以在后台运行