ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

声波传数据只要3步:ggwave让隔离设备“开口“说话

声波传数据只要3步:ggwave让隔离设备“开口“说话 声波传数据只要3步ggwave让隔离设备开口说话【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave两台没有网络、没有串口线的设备想交换一小段数据ggwave 是一个体积极小的 C 库把任意字节流编码成可听声或超声波再在另一端用麦克风还原。适合做 IoT 配网、离线文件分享、实验项目的工程师。两条命令跑通先让电脑对着电脑喊话这一节的目标5 分钟内看到收发效果再回头讲原理。Linux/macOS 上编译出命令行工具Windows MSYS2 同样命令可用需先装 SDL2 依赖git clone https://gitcode.com/GitHub_Trending/gg/ggwave --recursive cd ggwave mkdir build cd build cmake .. make不装音频后端也能先玩起来。下面这段把文本编码成 WAV 文件稍后用另一台设备听./bin/ggwave-to-file --message hello sound --protocol 1 --output hello.wav ./bin/ggwave-from-file --input hello.wav第二条命令的输出里应出现hello sound。Python 用户最短路径是pip install ggwave两个终端各跑一个脚本A 端扬声器出声B 端麦克风接收几秒后 B 端打印出hello python链路就跑通了# send.py —— 编码并播放 import ggwave, pyaudio p pyaudio.PyAudio() waveform ggwave.encode(hello python, protocolId1, volume20) stream p.open(formatpyaudio.paFloat32, channels1, rate48000, outputTrue, frames_per_buffer4096) stream.write(waveform, len(waveform) // 4)# receive.py —— 持续监听并解码 import ggwave, pyaudio p pyaudio.PyAudio() stream p.open(formatpyaudio.paFloat32, channels1, rate48000, inputTrue, frames_per_buffer1024) instance ggwave.init() while True: data stream.read(1024, exception_on_overflowFalse) res ggwave.decode(instance, data) if res is not None: print(Received:, res.decode(utf-8))30秒看懂原理6个音同时播每个音装4个比特一句话本质ggwave 用 FSK 移频键控把数据搬进声波再用 Reed-Solomon 纠错码兜底。发送侧把数据切成 4 比特一段同时用 6 个不同频率的音承载 3 字节24 比特这 6 个音从 4.5 kHz 带宽内 96 个等距频率点中各选一个。可听声协议起始频率 1875 Hz超声波协议起始 15000 Hz。接收侧先听特殊的起止标记声圈定一段录音再做 FFT 提取频谱按同样的频率点反查回比特最后 Reed-Solomon 解码还原原文顺带修正传输中受损的字节。实测吞吐约 8~16 字节/秒单次载荷上限 256 字节。协议按频段 × 速度排列收发两端必须选同一个协议频段速度特点与适用场景AUDIBLE_NORMAL可听声1875 Hz 起慢每段数据多帧冗余距离与抗噪最好适合演示、远距离AUDIBLE_FAST / FASTEST可听声中 / 快逐帧减冗余换速度FASTEST 最快、容错最弱ULTRASOUND_NORMAL / FAST / FASTEST超声波15000 Hz 起慢 / 中 / 快人耳不感知、不易串扰注意手机与低端板载麦克风往往听不清超声波需外置高灵敏麦DT_NORMAL / FAST / FASTEST双音慢 / 中 / 快单音序发送硬件简单Arduino 蜂鸣器场景常用MT_NORMAL / FAST / FASTEST单音慢 / 中 / 快一个音对应一段数据可一对多广播接收端无需锁定时刻自定义需求还有 10 个GGWAVE_PROTOCOL_CUSTOM_*槽位可改起始频率。完整枚举见 include/ggwave/ggwave.h。接线参考Arduino做发射器ESP32做接收器这一节给你最小可用硬件。发送端Arduino Uno 驱动一个无源蜂鸣器当喇叭加一个按钮触发发送examples/arduino-tx示例接收端ESP32 用片上 ADC 直接读模拟麦克风或走 I2S MEMS 麦收到消息可显示在 OLED 上examples/esp32-rx示例模拟麦克风接线ESP32麦克风3.3VVCC / VDDGNDGNDGPIO 35OutI2S MEMS 麦克风如 SPH0645则用 GPIO 26/33/25 接 BCLK/DOUT/LRCL。注意 ESP32 的 ADC 是 12 位采样率一般开到 30000 Hz 级别即可参数要和实际链路匹配下面调优部分会讲。实战场景配网、离线传文件、免硬件发送三个最常见的用法各配最短代码。场景一给物联网设备配网。手机 App或任何能出声的设备把 Wi-Fi 密码用超声波协议喊给 ESP32设备端循环解码收到后直接WiFi.begin()全程无需按键和屏幕。// ESP32 接收循环核心解码成功即配网 ggwave_Parameters p ggwave_getDefaultParameters(); p.sampleRate 30000; // 按麦克风实际采样率填 p.operatingMode GGWAVE_OPERATING_MODE_RX; ggwave_Instance inst ggwave_init(p); uint8_t buf[256]; int n ggwave_decode(inst, micBuf, micBytes, buf); // 每帧采样后调用 if (n 0) { parseAndConnectWiFi(buf, n); } // 如 ssid:pass场景二离线传小文件。把文件切块逐块编码成 WAV每块不超过 256 字节接收端逐块解码后按序号拼回。命令行工具直接帮你把生成 WAV 这步做掉了./bin/ggwave-to-file --message $(cat chunk.bin) --protocol 1 --output chunk0.wav场景三没有喇叭也能发。PC 内置蜂鸣器可以发出单音序列examples/r2t2演示了用主板喇叭发射、手机接收的完整流程examples/waver则是一个开箱即用的图形界面双机对照测试协议效果很直观调优与排坑4个参数决定成败传输不稳时按下面的顺序排查基本能解决九成问题。音量ggwave_encode的 volume 参数范围 0~100常用 15~30不建议超过 50过大会削波反而丢数据。采样率收发两端的sampleRate必须与声卡/麦克风实际一致桌面声卡推荐 48000Hz设备端如 ESP32 按实测填写。协议白名单收发协议已知时只保留对应协议能明显降低误触发ggwave_rxToggleProtocol(GGWAVE_PROTOCOL_AUDIBLE_FAST, 0); ggwave_rxToggleProtocol(GGWAVE_PROTOCOL_ULTRASOUND_NORMAL, 1); // 只收超声波抗干扰环境嘈杂切超声波协议同一频段内避免多台设备同时发送解码失败时在应用层加计数重发。三个高频问题Q实际能传多远A可听声在安静环境一般 3~5 米超声波 1~2 米房间混响会明显拉低这个值。Q一次最多发多少数据A单次上限 256 字节。更大的内容按块切分接收端负责拼包和校验。Qggwave_decode 总返回 -1 或 0A先确认协议 ID 两端一致、采样率一致仍不行就用 examples/spectrogram/ 里的工具画出频谱看频率是否落在预期区域通常能定位到是噪声还是接线问题。ggwave 把文本/凭据/小文件 → 声波 → 字节整条链路压缩到了init / encode / decode三个调用里src/ggwave.cpp。想直接动手从 examples/ggwave-py/send.py 和 examples/ggwave-py/receive.py 这两个脚本开始十分钟内可以搭起第一条声波链路。【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表