如何零基础用 ggwave 让两台设备用声音传数据:完整实操指南
如何零基础用 ggwave 让两台设备用声音传数据完整实操指南【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave没有网、没有线、没有蓝牙一台电脑怎么把一小段数据交给旁边的 ESP32ggwave 声波传输库就是干这个的发送端把数据编码成一段声波从扬声器播出去接收端用麦克风录下这段声音做频谱分析后还原成数据。它基于 FSK 频移键控调制传输速率 8-16 字节/秒Python 几行代码就能跑起来Arduino、ESP32 这类小单片机也带得动。 它是什么、凭什么工作一句话ggwave 把数据变成一个声学二维码。发送时数据被切成 4-bit 小块用 6 个同时播放的音调承载落在一段 4.5kHz 宽的频率带里可听声协议基频 1875Hz超声波协议 15kHz原始数据先经过 Reed-Solomon 纠错编码接收端有轻微误码也能自行修复接收端先监听专门的起止标记声确认传输边界后再对录音做 FFT 频谱分析逐帧还原出数据库本身只负责数据 ↔ 原始波形这一层音频设备ALSA、PortAudio、Web Audio由你自己接所有协议常量和参数含义都在 include/ggwave/ggwave.h 的注释里读一遍就清楚每个字段的用途。能力全景先选对调再动手库内置 4 组、共 12 个预置协议加 10 个可自定义的空位协议族常量示例每块字节数特点适合场景可听声GGWAVE_PROTOCOL_AUDIBLE_NORMAL/_FAST/_FASTEST3人耳可闻基频 1875Hz档位越高速率越高、抗噪越差演示、近距离传文件超声波GGWAVE_PROTOCOL_ULTRASOUND_NORMAL/_FAST/_FASTEST3基频 15kHz 起人听不见、不扰人自动配对、后台静默传输DT 多音GGWAVE_PROTOCOL_DT_NORMAL/_FAST/_FASTEST1多音调直传速率最慢但更稳信道条件差的远距离MT 单音GGWAVE_PROTOCOL_MT_NORMAL/_FAST/_FASTEST1单音调、内存占用最低只有无源蜂鸣器的 Arduino 等 MCU怎么选记住三条就够要听得见、能演示AUDIBLE_FAST要听不见、不碍事ULTRASOUND_NORMAL设备只有一个蜂鸣器MT 族 GGWAVE_OPERATING_MODE_TX_ONLY_TONES只生成音调列表不合成完整波形省内存 从零跑起来三步收到第一句话步骤 1获取代码并构建git clone https://gitcode.com/GitHub_Trending/gg/ggwave --recursive cd ggwave mkdir build cd build cmake .. make如果不想编译 C 代码也可以直接pip install ggwave装 Python 包配合 PortAudio 就能收发。步骤 2最小发送示例import ggwave, pyaudio p pyaudio.PyAudio() waveform ggwave.encode(hello ggwave, protocolId1, volume20) # 1AUDIBLE_FAST stream p.open(formatpyaudio.paFloat32, channels1, rate48000, outputTrue, frames_per_buffer4096) stream.write(waveform, len(waveform)//4) # 扬声器播放这段声波 stream.stop_stream(); stream.close(); p.terminate()步骤 3另一台机器上接收import ggwave, pyaudio p pyaudio.PyAudio() inst ggwave.init() # 默认参数48kHz、1024 帧 stream p.open(formatpyaudio.paFloat32, channels1, rate48000, inputTrue, frames_per_buffer1024) while True: data stream.read(1024, exception_on_overflowFalse) res ggwave.decode(inst, data) # 每帧喂一次收到才返回内容 if res is not None: print(Received:, res.decode(utf-8)); break跑通这两段你手里就是一个空气传数据的收发系统了。硬件准备接单片机时用 Arduino 当发送端的话硬件极简无源蜂鸣器接数字引脚示例用 10两个按键控制发送内容5V 供电即可对应代码在examples/arduino-tx/arduino-tx.ino接收侧的 ESP32 / RP2040 接麦克风电路在examples/esp32-rx/和examples/rp2040-rx/。两个真实用法演示场景 1给 IoT 设备配网手机或电脑把 WiFi 的 SSID密码用声音播出去ESP32 用模拟麦克风MAX9814、KY-037 等听音解码拿到凭据直接连网省掉串口手输的步骤uint8_t buf[256]; int n ggwave_decode(inst, micData, nBytes, buf); // 麦克风音频喂进去 if (n 0) { buf[n] \0; // 解码结果不带结束符手动补 connectWiFi((char*)buf); // 解析 SSID/密码并连接 }价值在于设备出厂不用预置任何配置靠近手机听一下就完成了配网且凭据走的是人耳听不太懂的超声波频段。场景 2浏览器之间传小文件把 ggwave 编译成 WebAssemblyexamples/ggwave-wasm/两个网页各开一个标签页一个用 Web Audio API 播放波形、一个用麦克风解码中间没有任何服务器和插件char payload[256]; while (running) { // 接收标签页的主循环 int n ggwave_decode(inst, micBuf, nBytes, payload); if (n 0) { payload[n] 0; saveToFile(payload); } // 文件还原 }几百字节的文件、密钥片段、剪贴板内容播个一两秒就过去了。 调优与避坑4 个常见状况的处理发了没反应多半是背景噪声太大或音量太小。把 volume 保持在 15-30头文件注释建议 25别超过 50协议从 FAST 档退回 NORMAL 档或开启 DSS 直接序列扩展模式提升鲁棒性。ggwave_decode频繁返回 -1表示解码失败通常就是噪声。缩短设备间距、避开大音量声源另外确认麦克风的采样率设置sampleRateInp与实际一致不一致时库会自动重采样但误差太大照样解不出。Arduino Uno 蜂鸣器发不出声无源蜂鸣器在 1-2kHz 低段可能物理发不出来。用 MT 单音协议并用ggwave_txProtocolSetFreqStart把基频上移arduino-tx 示例移了 48 个 bin ≈ 2250Hz接收端记得移相同的量。数据超过 140 字节发不出去变长载荷上限 140 字节、固定长度模式上限 64 字节。大文件要自己分片加序号、逐片发送、接收端重组失败重传。❓ 常见疑问Q一次到底能发多少数据 A变长模式每包最大 140 字节固定长度模式 64 字节更大的数据靠分片。Q采样率必须是 48000Hz 吗 A默认工作速率 48kHz。设备实际采样率不同时把sampleRateInp/sampleRateOut设成设备值ggwave 会内部重采样。Q接收端要不要全协议都开着 A默认全部启用。收发协议已知时用ggwave_rxToggleProtocol只留目标协议误报更少、内存更省。Q笔记本自带的扬声器和麦克风能用吗 A能。examples/r2t2/甚至演示了直接用 PC 板载喇叭发数据。延伸资源examples/ggwave-py/send.py 与 examples/ggwave-py/receive.pyPython 收发对的最小实现逐行对应本文步骤 2/3examples/arduino-tx/arduino-tx.inoMCU 上用蜂鸣器发文本的完整示例含频率偏移处理src/ggwave.cpp调制、Reed-Solomon 编解码与频谱分析的完整实现想深挖协议细节看这里【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026桌面AI避坑指南:预算有限如何选型部署与成本控制

2026桌面AI避坑指南:预算有限如何选型部署与成本控制

1. 先搞清楚“云避坑”到底在避什么“只有穷鬼才懂的痛”这句话,放在桌面AI这个语境里,其实指向一个非常具体的现实:预算有限,但又想用上真正能提升效率的AI工具。2026年的桌面AI生态已经和两年前完全不同了,本地模型、…

2026/9/20 1:44:31 阅读更多 →
Roc 语言 REPL 快照测试解析:List.count_if 在空列表上返回 0 的边界语义验证

Roc 语言 REPL 快照测试解析:List.count_if 在空列表上返回 0 的边界语义验证

【免费下载链接】roc A fast, friendly, functional language. 项目地址: https://gitcode.com/GitHub_Trending/ro/roc 点击查看 免费下载 导读 本文以 list_count_if_empty.md 这份 REPL 快照测试文件为核心,剖析 Roc 语言标准库中 List.count_if 函…

2026/9/20 1:44:31 阅读更多 →
用 OpenDesign 复刻 Discord 设计系统:Dark-First 三层深度、Blurple 与 gg sans 的完整落地指南

用 OpenDesign 复刻 Discord 设计系统:Dark-First 三层深度、Blurple 与 gg sans 的完整落地指南

AI 应用人工智能AI 技能设计系统媒体生成 【免费下载链接】open-design 🎨 Best DeepSeek Harness Design Plugin. The open-source Claude Design alternative. 🖥️ Local-first desktop app. 🖼️ Your coding agent becomes the design e…

2026/9/20 1:44:31 阅读更多 →

最新新闻

OpenELM-3B-Instruct FastAPI 部署调用实战:从环境配置到接口服务(Datawhale self-llm 教程)

OpenELM-3B-Instruct FastAPI 部署调用实战:从环境配置到接口服务(Datawhale self-llm 教程)

OpenELM-3B-Instruct FastAPI 部署调用实战:从环境配置到接口服务(Datawhale self-llm 教程) 【免费下载链接】self-llm 《开源大模型食用指南》针对中国宝宝量身打造的基于Linux环境快速微调(全参数/Lora)、部署国内外…

2026/9/20 2:37:59 阅读更多 →
CANN Runtime 进程间通信(IPC)实践指南:跨进程共享内存、Event 与 Notify 同步

CANN Runtime 进程间通信(IPC)实践指南:跨进程共享内存、Event 与 Notify 同步

CANNAscend人工智能任务调度 【免费下载链接】runtime 本项目提供CANN运行时组件和维测功能组件。 项目地址: https://gitcode.com/cann/runtime 点击查看 免费下载 CANN Runtime 允许同一进程内的多个线程直接引用由某个主机线程创建的设备内存、Event 与 Notify …

2026/9/20 2:37:59 阅读更多 →
Claude Code与TRAE实测对比:并非平替,选型取决于你的开发习惯

Claude Code与TRAE实测对比:并非平替,选型取决于你的开发习惯

最近后台私信里高频出现一个问题:网上都在说 TRAE 是 Claude Code 的“平替”,积分便宜、开箱即用、效果也不差,那我到底该选哪个?这个问题我拖了很久没正面回答,因为一句两句说不清。直到前阵子我特意把两个工具分别塞…

2026/9/20 2:37:59 阅读更多 →
Ant Design Image 预览内容自定义指南:用 imageRender 打造视频、动图与任意媒体预览

Ant Design Image 预览内容自定义指南:用 imageRender 打造视频、动图与任意媒体预览

前端UI组件设计系统 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/gh_mirrors/ant/ant-design 点击查看 免费下载 导读 本文围绕 Ant Design(antd)Image 组件的…

2026/9/20 2:37:59 阅读更多 →
DSH 桌面化启动实战:DeepSeek 本地工作台安装与插件配置

DSH 桌面化启动实战:DeepSeek 本地工作台安装与插件配置

先说结论:DSH 这个工具我自己折腾了小一周,从命令行启动到 Web 界面,从插件报错到桌面快捷方式,踩的坑比预想的多,但最终跑起来之后,确实值得。DeepSeek Harness(DSH)本质上是一套面…

2026/9/20 2:37:59 阅读更多 →
SSE 握手报 4xx Conflict?TaoToken 这样改 Codex 的 Base URL

SSE 握手报 4xx Conflict?TaoToken 这样改 Codex 的 Base URL

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 2:36:59 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →