首页/新闻资讯/正文详情

使用阿里云回调函数实现远程设备单向喊话

发布时间:2026/9/26 8:27:58 来源:云帆数科 栏目:资讯中心
使用阿里云回调函数实现远程设备单向喊话
前言在物联网项目中经常会遇到这样的需求用户在网页上录制一段语音然后让远端的嵌入式设备立即播放实现远程单向喊话。最直接的做法是浏览器录音后将音频直接发送给设备。但这种方式要求浏览器和设备保持稳定连接音频稍大时也容易受到网络波动影响。本文采用另一种实现方式1. 浏览器将录音上传到阿里云 OSS2. 上传成功后由 OSS 服务器回调指定设备3. 设备收到 OSS 文件名后下载音频4. 将音频转换为 WAV 并播放5. 播放完成后删除设备上的临时文件。这种方案将“文件传输”和“设备通知”分开浏览器不需要直接把音频传输给嵌入式设备。一、整体架构完整的数据链路如下浏览器录音↓浏览器直接上传音频到阿里云 OSS↓OSS 保存文件成功↓阿里云 OSS 服务器调用 Callback URL↓FRP 将公网请求转发到内网设备↓设备收到 OSS 对象名↓设备从 OSS 下载音频↓转换为 WAV → 播放 → 删除本地临时文件这里最关键的一点是Callback 请求不是浏览器发出的而是阿里云 OSS 服务器发出的。因此即使网页使用 HTTPS而设备 Callback 暂时使用 HTTP也不会触发浏览器的混合内容限制。浏览器只负责向 OSS 上传文件。二、什么是 OSS CallbackOSS Callback 是阿里云 OSS 提供的上传回调机制。客户端上传文件时可以同时告诉 OSS文件上传成功后回调哪个 URL回调请求使用什么 Content-Type回调正文中需要包含哪些 OSS 系统变量。例如callback: { url: http://公网IP:6221/wave, body: audio_name${object}, contentType: application/x-www-form-urlencoded, }其中 ${object} 是 OSS 的系统变量。上传成功后OSS 会将它替换为实际对象名。假设上传的对象名是audio/wave/21/1758761234567_xxx.webm设备实际收到的请求正文就是audio_nameaudio/wave/21/1758761234567_xxx.web三、前端录音与 OSS 上传1. 使用 MediaRecorder 录音现代浏览器可以通过 MediaRecorder API 录制麦克风音频const stream await navigator.mediaDevices.getUserMedia({ audio: { channelCount: 1, sampleRate: 16000, echoCancellation: true, noiseSuppression: true, }, }); const recorder new MediaRecorder(stream, { mimeType: audio/webm;codecsopus, audioBitsPerSecond: 48000, });录音结束后将多个音频分片合并为一个 Blobconst audioBlob new Blob(chunks, { type: recorder.mimeType || audio/webm, });2. 生成 OSS 对象名为了区分设备和录音可以将设备编号放进 OSS 对象路径中const objectName audio/wave/${deviceId}/${Date.now()}_${crypto.randomUUID()}.webm;3. 根据设备生成 Callback 地址如果每台设备在 FRP 上对应一个独立的公网端口可以制定简单的端口规则公网端口 6200 设备编号例如设备编号公网端口Callback URL6214192.168.10.1http://8.137.101.41:62146215192.168.10.1http://8.137.101.41:6215function callbackUrlForDevice(deviceId) { const callbackPort 6200 Number.parseInt(deviceId, 10); return http://公网IP:${callbackPort}/wave; }4. 上传时配置 OSS Callback使用阿里云 OSS JavaScript SDK 上传const client new OSS({ region: oss-cn-beijing, endpoint: oss-cn-beijing.aliyuncs.com, accessKeyId: AccessKeyId, accessKeySecret: AccessKeySecret, bucket: Bucket名称, secure: true, }); await client.put(objectName, audioBlob, { headers: { Content-Type: audioBlob.type || audio/webm, }, callback: { url: callbackUrlForDevice(deviceId), body: audio_name${object}, contentType: application/x-www-form-urlencoded, }, });执行这段代码后浏览器不需要再调用设备接口。文件上传完成后OSS 会自动发送 Callback。四、FRP 将 Callback 转发到内网设备嵌入式设备通常位于局域网没有公网 IP因此可以使用frp做TCP端口映射。设备端示例配置serverAddr FRP服务器公网IP serverPort 7000 [[proxies]] name wave-device-21 type tcp localIP 192.168.10.102 localPort 8765 remotePort 6221此时请求会被转发到设备五、Python 接收 Callback设备端可以使用 FastAPI 提供接口。示例代码from urllib.parse import parse_qs from fastapi import FastAPI, HTTPException, Request app FastAPI() app.post(/wave) async def wave(request: Request): raw await request.body() text raw.decode(utf-8, errorsreplace) values parse_qs(text, keep_blank_valuesTrue) audio_name values.get(audio_name, [])[0] if not audio_name: raise HTTPException(status_code400, detail缺少 audio_name) # 将下载和播放任务加入队列 audio_jobs.put(audio_name) return { status: queued, audio_name: audio_name, }Callback 接口必须及时返回成功响应不建议在请求中同步等待下载、转换和播放全部完成。更合理的方式是接收请求 → 参数校验 → 加入播放队列 → 立即返回 HTTP 200后台线程再依次处理播放任务。六、设备下载和播放音频1. 从 OSS 下载Python 使用 oss2 下载对象import oss2 auth oss2.Auth(AccessKeyId, AccessKeySecret) bucket oss2.Bucket( auth, https://oss-cn-beijing.aliyuncs.com, Bucket名称, ) bucket.get_object_to_file(audio_name, local_file)2. 转换为 WAV浏览器通常录制为 WebM/Opus而嵌入式设备上的 aplay 更适合播放 WAV因此可以使用 pydub ffmpeg 转换from pydub import AudioSegment audio AudioSegment.from_file(local_file, formatwebm) audio audio.set_frame_rate(16000) audio audio.set_channels(2) audio audio.set_sample_width(2) audio.export(wav_file, formatwav, codecpcm_s16le) ### 3. 播放并清理 python import subprocess subprocess.run( [aplay, -Dhw:1, wav_file], checkTrue, )七、安全建议为了方便演示很多示例会把 OSS AccessKey 直接写在前端代码中但这不适合生产环境。因为前端 JavaScript 会下载到用户浏览器任何人都能在开发者工具中看到长期 AccessKey。一旦泄露攻击者可能读取、上传甚至删除 Bucket 中的数据。生产环境建议1. 创建权限最小化的 RAM 用户2. 后端签发 STS 临时凭证3. 前端只使用短期 STS Token 上传4. 限制只能操作指定的 OSS 前缀5. 定期轮换 AccessKey6. 对 /wave 增加 OSS Callback 签名校验防止伪造播放请求7. 限制音频大小、格式和播放时长8. 为 OSS 音频目录配置生命周期自动清理规则。八、总结本文实现了一套基于阿里云 OSS Callback 的远程单向喊话方案浏览器负责录音和上传OSS 负责保存文件并通知设备FRP 负责公网到内网的请求转发设备负责下载、转换和播放相比浏览器直接向设备传输音频这种方式降低了设备接口的传输压力也不需要维持长连接。通过设备编号与 FRP 公网端口的映射还可以将同一套前端扩展到多台设备。

相关推荐

FPGA与Linux高速数据采集:DMA零拷贝框架设计与ARM64实战
FPGA与Linux高速数据采集:DMA零拷贝框架设计与ARM64实战

1. 项目缘起与整体架构思路1.1 为什么要在FPGA和Linux之间搭一座DMA桥做过高速数据采集的人都有一个共同的痛:FPGA侧的数据吞吐量轻松跑到几百MB/s甚至上GB/s,但数据一旦要送到Linux用户态做后续处理,瓶颈立刻从采集前端转移到了数据搬运环节… · 2026/9/26 8:27:58

Atlas 300V 24G:AI推理加速卡如何高效部署YOLO
Atlas 300V 24G:AI推理加速卡如何高效部署YOLO

最近后台和社群里好几个人在问同一个问题:“atlas 300v 24g 是运算加速卡吗?”旁边跟着的另一条热搜是“atlas部署yolo”。这两条串在一起,我大概能猜出大家的处境:要么是刚拿到一块 Atlas 300V 的卡准备上手,要么是在… · 2026/9/26 8:27:58

AI代理人开发实战:用Prompt工程打造角色化仕女型C1
AI代理人开发实战:用Prompt工程打造角色化仕女型C1

1. AI代理人是什么:从通用对话到角色化定制最近“AI代理人”这个词频繁出现在技术社区和产品发布会上。它和早期那种一问一答的聊天机器人有本质区别:传统聊天机器人只是被动地等你提问,AI代理人则更接近于一个具备自主对话风格、任务目标、记… · 2026/9/26 8:27:51

电力室外与室内智能巡检机器人:从PPT到可落地部署方案
电力室外与室内智能巡检机器人:从PPT到可落地部署方案

简介:这份PPT面向电力运维人员、智能巡检方案设计者及电力相关专业学习者,系统梳理了室外与室内智能巡检机器人的技术架构与应用路径,帮助解决传统人工巡检效率低、准确性不足、恶劣环境下安全风险高等痛点。资源包共1个PPT文件,约… · 2026/9/26 9:13:13

VS Code + LaTeX 双向定位配置:4分钟搞定 Synctex 正反向跳转
VS Code + LaTeX 双向定位配置:4分钟搞定 Synctex 正反向跳转

1. 项目概述:为什么正反向定位是 LaTeX 编辑体验的“呼吸感”分水岭 在 VS Code 里写 LaTeX,最常被忽略、却最影响持续写作节奏的,不是宏包报错,不是编译失败,而是——你点一下 PDF 预览窗口里的某一行公式&#xff0… · 2026/9/26 9:13:13

AIO Sandbox:全栈融合沙箱架构与MCP协议设计
AIO Sandbox:全栈融合沙箱架构与MCP协议设计

1. 项目概述:一个“全栈式”沙箱的诞生逻辑 AIO Sandbox 这个名字乍看有点拗口,但拆开来看就非常直白——All-in-One Sandbox。它不是那种只跑 Python 脚本、或者只做网页自动化测试的轻量沙箱,而是把浏览器、Shell、文件系统、MCP 协议支持、… · 2026/9/26 9:13:13

Simple Allow Copy:一键解除网页复制限制的浏览器扩展原理与实战
Simple Allow Copy:一键解除网页复制限制的浏览器扩展原理与实战

网页上的文字选不中、右键菜单被禁用、复制按钮点了没反应——这类场景想必你我都遇到过。明明是一篇公开的教程、一份产品参数、一段自己需要的资料,却因为页面加了复制限制,只能对着屏幕一个字一个字敲。Simple Allow Copy 就是冲着这个痛点来的&#… · 2026/9/26 9:13:13

ROS机器人开发入门:从通信机制到SLAM自主导航实战
ROS机器人开发入门:从通信机制到SLAM自主导航实战

GitHub上排名靠前的开源项目,往往不是那种"看起来很酷"的玩具,而是真正被成千上万开发者压在键盘底下的基础设施。ROS就是其中之一。如果你在GitHub上搜"robot"相关的高星仓库,会发现在整个移动机器人生态里,… · 2026/9/26 9:13:13

合规视频修复与图像增强:从超分辨率到老照片上色
合规视频修复与图像增强:从超分辨率到老照片上色

很抱歉,我不能围绕这个项目标题创作博文。这个标题指向的软件,其核心功能是去除视频中的人为模糊或马赛克处理。这类工具的典型用途往往涉及未经授权的成人内容处理、隐私侵犯,或者对被刻意隐藏信息的画面进行强行还原,本身就游走… · 2026/9/26 9:13:07

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

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

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码