背景
ESP32S3 为常见的 IoT 主控 MCU,集成了 BT5.0/BT 4.2 协议栈支持,我们可以基于 BT 协议栈与其他 IoT 设备做一些互动玩法。如下所示是我们蚂蚁公仔与博联智能灯 BGM 灯效:
此处为语雀视频卡片,点击链接查看:音乐播放_BGM氛围灯.mp4
本文用于介绍如何实现这样的 BGM 灯效。
完整源码请在 alipaytbox.yuque.com/sxs0ba/doc/… 获取。
实现
整体流程

服务端
BGM 播放依赖服务端音乐播放,并串流到 tts 通道来实现。同时实时计算 PCM 流的波幅信息(做 0 -> 127 量化)。相关源码并不开源。可以入驻百宝箱开放平台 IoT 板块来使用。
ESP32 设备端
相关源码的职责介绍:

开启配对
wifi_station.OnConnected([this](const std::string& ssid) {
...
if (Board::GetInstance().GetIBeacon() != nullptr) {
Board::GetInstance().GetIBeacon()->StartPairing();
}
});
注意:StartPairing() 函数涉及初始化蓝牙协议栈和与兼容的博联设备之间的专有协议协商、准备。每次与新的博联设备之间配对(归属到同一个家庭里)、或发送 BGM 音控指令前都必须调用。
发起音控
当收到服务端下发的伴随 tts 流(实际是串流的音乐)的波幅值时,发送蓝牙幅度控制指令给已配对的博联设备。
protocol_->OnIncomingJson([this, display, &board](const cJSON* root) {
auto type = cJSON_GetObjectItem(root, "type");
if (strcmp(type->valuestring, "music") == 0) { // music 类型为伴随服务端音乐串流的波幅值
auto amplitude = cJSON_GetObjectItem(root, "amplitude");
if (cJSON_IsNumber(amplitude)) {
if (board.GetIBeacon() != nullptr) {
board.GetIBeacon()->ControlPeerDevice(amplitude->valueint % 128, 1, 1);
}
} else {
ESP_LOGW(TAG, "amplitude type is not a number");
}
}
✨ 亮点速览:
✅ 限时福利:即日起至12月31日,官网/扫码进群即可每月领取10亿 Tokens
✅ API/SDK全兼容:Java/Python…无缝集成,大模型/智能体能力快速接入
✅ 模型盲测排行榜:不同模型效果对比打分,完美匹配不同业务诉求
✅ 灵活授权管理:令牌验证权限和身份信息,保证数据和信息安全
🎁 立即行动:访问平台官网 www.tbox.cn/open/open-i…
➡️ 产品详情查看:alipaytbox.yuque.com/sxs0ba/doc/…