如何快速搭建无网络数据传输链路:用 ggwave 三步发出第一声
如何快速搭建无网络数据传输链路用 ggwave 三步发出第一声【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave手头有两台设备一台是只有喇叭和麦克风的电脑另一台是刚出厂、没联网、没屏幕的 ESP32中间没有 WiFi、没有蓝牙、没有线缆——一小段数据怎么送过去ggwave 就是为这个问题而生的它是一个轻量级 C/C 声波传输库把数据变成声音播出去、再由对端麦克风听回来并还原。没有网络的设备之间从此多了一条用声音当网线的通道。选协议先明确你的传输场景结论拿不准就用可听声快速档GGWAVE_PROTOCOL_AUDIBLE_FAST先跑通再换档。ggwave 底层用的是 FSK频移键控简单说就是用不同频率的音高代表 0 和 1并内置 Reed-Solomon 纠错码吸收环境噪声。它把协议分成四个家族频率起点不同可听声从 1875Hz 起步人耳能听见超声波从 15000Hz 起步人耳基本听不见。协议家族适合什么注意什么可听声GGWAVE_PROTOCOL_AUDIBLE_*演示、配对、普通 PC 与手机之间互发会发出吱哇声适合安静环境传播距离相对最远超声波GGWAVE_PROTOCOL_ULTRASOUND_*不想被人听见、怕干扰别人的场合距离更近且要求麦克风能听到高频手机/耳机麦通常不行双工GGWAVE_PROTOCOL_DT_*需要一来一回交互的远程控制、握手收发双方都要保持在线占用时间更长多目标GGWAVE_PROTOCOL_MT_*一对多广播一份数据周围多个设备同时收接收端越多现场越吵注意错开重发每个家族都有NORMAL / FAST / FASTEST三档速度速度越快、抗噪越弱。如果你已经确定收发双方用什么协议可以用ggwave_rxToggleProtocol关掉其它接收协议减少误报。协议常量都定义在 include/ggwave/ggwave.h 里。搭一条最小传输链路发送端与接收端结论一条链路只需要两个角色——发送端把数据唱出来接收端把声音听回去两边各自选一种硬件即可。发送端负责把字节编码成音频波形并从扬声器/蜂鸣器播放候选电脑或手机扬声器最简单浏览器 Web Audio 也行Arduino Uno配一个普通蜂鸣器就能当发射机示例在 examples/arduino-tx/。接收端负责持续采集麦克风音频并喂给解码器候选电脑声卡 麦克风零成本起步ESP32板载 12-bit ADC 可直接采模拟麦克风也支持 I2S MEMS 麦克风还能把收到的内容显示到 OLED 上示例在 examples/esp32-rx/RP2040 / Raspberry Pi Pico配模拟麦克风使用示例在 examples/rp2040-rx/。收发两端不要求同款硬件——电脑发、ESP32 收或浏览器发、Arduino 收都成立。三步发出第一声安装、编码、解码结论库的公开 API 只有两件事——ggwave_encode把数据变成波形ggwave_decode把波形变回数据。第 1 步 安装。克隆仓库后用 CMake 构建git clone https://gitcode.com/GitHub_Trending/gg/ggwave --recursive cd ggwave mkdir build cd build cmake .. make第 2 步 编码。先建实例再调用ggwave_encode得到可播放的音频波形。第 3 步 解码。把麦克风采到的音频持续喂给ggwave_decode一旦返回正数输出缓冲区里就是收到的数据。最小骨架如下ggwave_Parameters p ggwave_getDefaultParameters(); ggwave_Instance in ggwave_init(p); int n ggwave_encode(in, payload, 4, GGWAVE_PROTOCOL_AUDIBLE_FAST, 25, NULL, 1); // 按 n 分配 waveformBuffer 后再用 query0 重新调用 ggwave_encode 生成波形 while (true) { /* 捕获一帧音频 frame */ int m ggwave_decode(in, frame, frameBytes, out); if (m 0) { /* out 中有 m 字节有效数据 */ } }注意ggwave_encode传query1时只返回波形需要的字节数不真正生成波形ggwave_decode输出的数据不带结尾\0自己补。真实场景落地场景一给 ESP32 下发 WiFi 凭据物联网设备配置。电脑把SSID:密码拼成一条文本用超声波协议编码后播放ESP32 端在 examples/esp32-rx/ 里持续采麦解码收到后直接WiFi.begin。整个过程不需要屏幕、按键或扫码设备快速配对一次完成。场景二浏览器间互发小文件。Node.js 侧用官方绑定var factory require(ggwave); factory().then(function(ggwave) { var parameters ggwave.getDefaultParameters(); var instance ggwave.init(parameters); // 编码 hello js得到可直接用 Web Audio 播放的波形 var waveform ggwave.encode(instance, hello js, ggwave.ProtocolId.GGWAVE_PROTOCOL_AUDIBLE_FAST, 10); var res ggwave.decode(instance, waveform); // 解码回文本 });浏览器端把波形交给AudioContext播放、把麦克风数据流喂回decode即可适合传几百字节以内的配置片段、剪贴板内容。JS 绑定源码见 bindings/javascript/ggwave.js。场景三声音二维码广播。用多目标协议把剪贴板内容广播出去范围内任何开着接收端的设备都能抓到一份数据多个收点适合局域网外的一对多分发。调优清单距离、速度与抗干扰按场景选家族普通 PC 对 PC 用可听声办公室/课堂用超声波交互控制用双工一对多广播用多目标速度档按需演示用FAST赶时间用FASTEST容噪最弱音量从 25 起步库注释明确通常 25 够用别超过 50收发两端采样率都按 48000Hz 配置采样率不一致时库会自动重采样但保持一致最稳协议已知时用ggwave_rxToggleProtocol关掉多余的接收协议降低误报环境吵就换超声波档并调低接收端soundMarkerThreshold灵敏度应用层再包一层校验值 超时重发把丢了重传做成默认行为避坑问答Q到底能传多远A安静房间里可听声协议几米内一般没问题超声波更近且受麦克风高频能力限制。隔墙、开风扇、有人说话都会明显变差——先把设备挪近、把噪声源关停再测。Q一次能发多少数据A单次有效数据上限 256 字节库常量kMaxDataSize带宽约 8–16 字节/秒。更大的数据请分片每片自带序号接收端拼完校验。Q解码失败怎么办Aggwave_decode返回 -1 是解码出错通常是噪声太大返回 -2 是输出缓冲区不够返回 0 只是这帧还没听到数据。库内置 Reed-Solomon 纠错能吸收一定误码重要数据再在应用层加校验和重传。声音当信道听起来像玩具但 FSK 调制、声音标记、纠错码这些工程细节 ggwave 都替你封好了——你要做的只是调用ggwave_encode和ggwave_decode。仓库 examples/ 里就有现成的收发对Python 看 examples/ggwave-py/PC 命令行看 examples/ggwave-cli/浏览器看 examples/ggwave-js/。挑一套跑起来五分钟就能听到属于你的第一声。【免费下载链接】ggwaveTiny>项目地址: https://gitcode.com/GitHub_Trending/gg/ggwave创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

winget-cli 的 Update-WinGetPackage 命令详解:用 Microsoft.WinGet.Client PowerShell 模块批量升级已安装软件包

winget-cli 的 Update-WinGetPackage 命令详解:用 Microsoft.WinGet.Client PowerShell 模块批量升级已安装软件包

包管理器CLI 【免费下载链接】winget-cli WinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface). 项目地址: https:/…

2026/9/20 14:59:22 阅读更多 →
Gemini报错排查指南:从白屏到API错误的系统化解决思路

Gemini报错排查指南:从白屏到API错误的系统化解决思路

1. 从一次白屏说起:Gemini报错到底卡在哪一层第一次遇到Gemini显示“出了点问题”或者英文界面下的“Something went wrong”,很多人下意识反应是网络问题,然后反复刷新页面。我一开始也这么干,刷了十几次,白屏依旧&am…

2026/9/20 14:59:22 阅读更多 →
Page Assist:本地 AI 网页浏览侧边栏扩展全解

Page Assist:本地 AI 网页浏览侧边栏扩展全解

Page Assist:本地 AI 网页浏览侧边栏扩展全解 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist 你正在读一篇英文长文,遇到…

2026/9/20 14:59:22 阅读更多 →

最新新闻

Windows与Ubuntu双系统安装全攻略:准备、分区与排坑指南

Windows与Ubuntu双系统安装全攻略:准备、分区与排坑指南

/* 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 16:21:56 阅读更多 →
3步搞定macOS录屏:QuickRecorder

3步搞定macOS录屏:QuickRecorder

3步搞定macOS录屏:QuickRecorder 【免费下载链接】QuickRecorder A lightweight screen recorder based on ScreenCapture Kit for macOS / 基于 ScreenCapture Kit 的轻量化多功能 macOS 录屏工具 项目地址: https://gitcode.com/GitHub_Trending/qu/QuickRecord…

2026/9/20 16:21:56 阅读更多 →
用Web面板给Homebrew提速:BrewUI设计实战

用Web面板给Homebrew提速:BrewUI设计实战

/* 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 16:21:56 阅读更多 →
Ant Design Table 自定义空状态(Empty)完整指南:从 emptyText 到 renderEmpty 全局定制

Ant Design Table 自定义空状态(Empty)完整指南:从 emptyText 到 renderEmpty 全局定制

Ant Design Table 自定义空状态(Empty)完整指南:从 emptyText 到 renderEmpty 全局定制 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/gh_mirrors/ant/ant-des…

2026/9/20 16:21:56 阅读更多 →
首件检验记录表设计指南:核心字段、流程与防呆技巧

首件检验记录表设计指南:核心字段、流程与防呆技巧

简介:面向制造企业质检人员、生产管理者及质量管理体系内审员的PDF版产品首件检验记录表格,用于规范新产品导入、换线或设备调整后首件产品的检验流程,避免批量投料后才发现异常。表格覆盖客户、批号、品名/规格、机台号、检验日期、使用量具…

2026/9/20 16:21:56 阅读更多 →
Qt 5.15.19 终结与 Qt for MCUs 2.11 LTS 发布:ESP32-S3 和 RA8D1 支持及地图渲染解析

Qt 5.15.19 终结与 Qt for MCUs 2.11 LTS 发布:ESP32-S3 和 RA8D1 支持及地图渲染解析

/* 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 16:20:55 阅读更多 →

日新闻

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 阅读更多 →