正文字数:1807 阅读时长:3分钟
这是一个有关于使用声音的WebRTC信号的概念验证。适用于所有有麦克风+扬声器的设备。在浏览器中运行。
Written By ZION3R
url : https://www.kitploit.com/2020/10/wave-share-serverless-peer-to-peer.html
首先,附近的设备通过一系列音频音频序列交换必要的会话描述协议(SDP)数据来协商WebRTC连接。在成功的协商之后,浏览器之间建立一个本地的WebRTC连接,并允许通过局域网交换数据。
具体细节如下(2分钟视频):https://youtu.be/d30QDrKyQkg
你也可以自己试试:https://ggerganov.github.io/wave-share
运作原理
WebRTC技术允许运行在不同设备上的两个浏览器相互连接并交换数据。不需要安装插件或下载应用程序。为了启动连接,对等方需要交换联系信息(ip地址、网络端口、会话id等)。这个过程被称为“信号传递/信令”。WebRTC规范没有定义任何信令标准-联系人交换可以通过任何协议或技术实现。
在这个项目中,信令是通过声音执行的。信号序列如下:
所述信令序列不涉及信令服务器。因此,使用通过声音发出信号的应用程序可以由静态网页提供服务。唯一的要求是控制音频输出/捕获设备。
目前的方法有一个明显的局限性(特征),即只有附近的设备(例如在同一房间内)才能建立连接。此外,设备必须连接在同一个本地网络,因为NAT是不可用的。
声音发射/接收
通过声音通信的数据包含初始化WebRTC连接所需的联系信息。该数据以会话描述协议(SDP)格式存储。由于声音数据在带宽和健壮性/鲁棒性robustness方面有明显的限制,因此最好传输尽可能少的数据。因此,SDP从所有不相关的信息中剥离,只传输建立连接所需的必要数据。目前,包含所需的最小SDP数据的声音包的格式如下:
Size, [B] | Description |
---|---|
1 | Type of the SDP - Offer or Answer |
1 | Packet size in bytes (not including ECC bytes) |
4 | IP address of the transmitting peer |
2 | Network port that will be used for the communication |
32 | SHA-256 fingerprint of the session data |
40 | ICE Credentials - 16 bytes username + 24 bytes password |
32 | ECC correction bytes used to correct errors during Tx |
音频包的总大小为112字节。使用当前的音频编码算法,SDP包可以在5-10秒内传输(取决于使用的Tx协议)。使用较慢的协议在嘈杂的环境中或在通信设备彼此相距较远的情况下提供更可靠的传输。
Data-to-sound编码
目前的方法使用多频移频键控(FSK)调制方案。要传输的数据首先被分成4位块。在每一时刻,使用6个音调传输3个字节—每个4位块一个音调。6个音调在4.5kHz的范围内发射,分为96个等距频率:
Freq, [Hz] | Value, [bits] | Freq, [Hz] | Value, [bits] | ... | Freq, [Hz] | Value, [bits] |
---|---|---|---|---|---|---|
F0 + 00*dF | Chunk 0: 0000 | F0 + 16*dF | Chunk 1: 0000 | ... | F0 + 80*dF | Chunk 5: 0000 |
F0 + 01*dF | Chunk 0: 0001 | F0 + 17*dF | Chunk 1: 0001 | ... | F0 + 81*dF | Chunk 5: 0001 |
F0 + 02*dF | Chunk 0: 0010 | F0 + 18*dF | Chunk 1: 0010 | ... | F0 + 82*dF | Chunk 5: 0010 |
... | ... | ... | ... | ... | ... | ... |
F0 + 14*dF | Chunk 0: 1110 | F0 + 30*dF | Chunk 1: 1110 | ... | F0 + 94*dF | Chunk 5: 1110 |
F0 + 15*dF | Chunk 0: 1111 | F0 + 31*dF | Chunk 1: 1111 | ... | F0 + 95*dF | Chunk 5: 1111 |
For all protocols(对所有的协议): dF = 46.875 Hz
. For non-ultrasonic protocols(对非超声波协议): F0 = 1875.000 Hz
. For ultrasonic protocols:(对超声波协议) F0 = 15000.000 Hz
.
获取本地IP地址
为了方便起见,一个简单的WebRTC hack被用来自动检测您机器的本地IP地址,所以您不必手动提供它。然而,由于安全原因,最新的WebRTC规范阻止了这一点的发生,因此在某个时候,这个“特性”将在所有浏览器中停止工作。例如,它不再适用于Safari。
构建
Web Assembly 模块wave.wasm
您需要一个Emscripten编译器。另外,您需要使用Emscripten构建FFTW。运行compile.sh
脚本。
CLI工具 wave-share
这是一个简单的工具,使用 wave-share
共享tx/rx协议接收和发送数据。在标准输入上键入一些文本,然后按Enter键发送。
git clone https://github.com/ggerganov/wave-share
cd wave-share && mkdir build && cd build
cmake ..
make
# running
./wave-share
下面是一个演示如何使用CLI工具的短片:https://youtu.be/TcfjCMCyqF0
已知的问题/需要改进的东西
本文分享自 LiveVideoStack 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!