返回资讯中心
外部精选
软件工程
#开发者实时流

Ggwave – Data-over-Sound Library

Click on the images below to hear what it sounds like:

Hacker News 最新esher2026/10/30 · 今天9 分钟阅读

以下正文同步自 Hacker News 最新,版权归原站所有,已转换为易读排版。

Click on the images below to hear what it sounds like:

talking-buttons-demo-0.mp4

arduino-tx-3-github.mp4

This library allows you to communicate small amounts of data between air-gapped devices using sound. It implements a simple FSK-based transmission protocol that can be easily integrated in various projects. The bandwidth rate is between 8-16 bytes/sec depending on the protocol parameters. Error correction codes (ECC) are used to improve demodulation robustness.

This library is used only to generate and analyze the RAW waveforms that are played and captured from your audio devices (speakers, microphones, etc.). You are free to use any audio backend (e.g. PulseAudio, ALSA, etc.) as long as you provide callbacks for queuing and dequeuing audio samples.

Here is a list of possible applications of ggwave with a few examples:

You can easily test the library using the free waver application which is available on the following platforms:

https://waver.ggerganov.com

https://ggwave.ggerganov.com

https://ggwave-js.ggerganov.com

HTTP service

audible example

curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello%20world!' --output hello.wav

ultrasound example

curl -sS 'https://ggwave-to-file.ggerganov.com/?m=Hello%20world!&p=4' --output hello.wav

Technical details

Below is a short summary of the modulation and demodulation algorithm used in ggwave for encoding and decoding data into sound.

The current approach uses a multi-frequency Frequency-Shift Keying (FSK) modulation scheme. The data to be transmitted is first split into 4-bit chunks. At each moment of time, 3 bytes are transmitted using 6 tones - one tone for each 4-bit chunk. The 6 tones are emitted in a 4.5kHz range divided in 96 equally-spaced frequencies:

For all protocols: dF = 46.875 Hz. For non-ultrasonic protocols: F0 = 1875.000 Hz. For ultrasonic protocols: F0 = 15000.000 Hz.

The original data is encoded using Reed-Solomon error codes. The number of ECC bytes is determined based on the length of the original data. The encoded data is the one being transmitted.

Beginning and ending of the transmission are marked with special sound markers (#13). The receiver listens for these markers and records the in-between sound data. The recorded data is then Fourier transformed to obtain a frequency spectrum. The detected frequencies are decoded back to binary data in the same way they were encoded.

Reed-Solomon decoding is finally performed to obtain the original data.

The examples folder contains several sample applications of the library:

Other projects using ggwave or one of its prototypes:

Dependencies for SDL-based examples

[Ubuntu] $ sudo apt install libsdl2-dev

[Mac OS with brew] $ brew install sdl2

[MSYS2] $ pacman -S git cmake make mingw-w64-x86_64-dlfcn mingw-w64-x86_64-gcc mingw-w64-x86_64-SDL2

Linux, Mac, Windows (MSYS2)

build

git clone https://github.com/ggerganov/ggwave --recursive cd ggwave && mkdir build && cd build cmake .. make

running

./bin/ggwave-cli

Local Debian packages

Build reproducible libggwave-dev and python3-ggwave Debian packages:

Fetch source

git clone https://github.com/ggerganov/ggwave --recursive cd ggwave

Configure

cmake . -DGGWAVE_BUILD_EXAMPLES=OFF -DCMAKE_BUILD_TYPE=Release

Build

make deb

Install

sudo dpkg -i dist/*.deb

Emscripten

git clone https://github.com/ggerganov/ggwave --recursive cd ggwave mkdir build && cd build emcmake cmake .. make

Python

pip install ggwave

More info: https://pypi.org/project/ggwave/

npm install ggwave

More info: https://www.npmjs.com/package/ggwave

Available as a Swift Package: https://github.com/ggerganov/ggwave-spm

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →