ESP32-S3 作为主流的 IoT 主控 MCU(微控制器),集成了完整的 Bluetooth5.0 和 4.2 技术栈,可基于蓝牙协议与其他 IoT 设备构建多样化的交互场景。本文将介绍如何实现通过蚂蚁公仔实现智能灯具的控制。
效果展示
下方视频为蚂蚁公仔与博联智能灯具间的交互效果。
此处为语雀视频卡片,点击链接查看:音乐播放_BGM氛围灯.mp4
实现流程
当用户对蚂蚁公仔说出“播放音乐”时:
- 蚂蚁公仔接收语言并发送至百宝箱开放平台;
- 平台进行意图识别,确认为“播放音乐”请求;
- 触发音频串联,同时提取音频波幅信息;
- 将 TTS 语音数据返回给蚂蚁公仔,用于语音反馈;
- 向博联灯具发送蓝牙音控指令,实现灯光随音乐节奏变化。
配置服务端
背景音乐(BGM)由服务端负责播放,并通过 TTS 音频通道进行串流传输。在此过程中,系统实时提取 PCM 流的波幅数据,并将其量化至 0-127 的整数范围。相关实现代码暂未开源,可通过接入百宝箱开放平台的 IoT 板块调用该能力。
配置 ESP32 设备端
源码中各文件的能力如下图所示。
开启配对
在 WiFi 连接的情况下,通过下述代码实现蓝牙的配对。
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"); } }