# 蓝牙录音设备接入技术方案 ## 一、概述 本文档详细说明如何在uni-app项目中实现蓝牙录音设备的连接、数据接收和文件处理功能。 ## 二、技术架构 ### 2.1 技术栈 - **框架**: uni-app (Vue 3) - **平台**: APP端 (Android/iOS) - **蓝牙协议**: BLE (低功耗蓝牙) / 经典蓝牙 - **音频格式**: PCM (可根据设备调整) ### 2.2 核心组件 1. **蓝牙工具类** (`common/bluetooth.js`) - 蓝牙适配器管理 - 设备搜索与连接 - 数据接收与处理 - 连接状态管理 2. **蓝牙录音页面** (`pages/bluetooth-recorder/bluetooth-recorder.vue`) - 设备搜索界面 - 连接管理界面 - 数据监控界面 - 文件保存与上传 ## 三、实现步骤 ### 步骤1: 配置权限 在 `manifest.json` 中添加蓝牙相关权限: **Android权限**: ```xml ``` **iOS权限**: 在 `manifest.json` 的 `app-plus` -> `ios` 配置中添加: ```json "privacyDescription": { "NSBluetoothAlwaysUsageDescription": "需要蓝牙权限以连接录音设备", "NSBluetoothPeripheralUsageDescription": "需要蓝牙权限以连接录音设备", "NSLocationWhenInUseUsageDescription": "需要位置权限以搜索蓝牙设备" } ``` ### 步骤2: 初始化蓝牙适配器 ```javascript import bluetoothRecorder from '@/common/bluetooth.js' // 初始化蓝牙适配器 await bluetoothRecorder.initBluetoothAdapter() ``` ### 步骤3: 搜索蓝牙设备 ```javascript // 开始搜索 await bluetoothRecorder.startScan({ allowDuplicatesKey: false, // 不允许重复上报 interval: 0 // 上报间隔 }) // 监听设备发现 bluetoothRecorder.onDeviceFound = (device) => { console.log('发现设备:', device.name, device.deviceId) } ``` ### 步骤4: 连接蓝牙设备 ```javascript // 连接设备 await bluetoothRecorder.connectDevice(deviceId) // 监听连接状态 bluetoothRecorder.onDeviceConnected = (deviceId) => { console.log('设备连接成功:', deviceId) } bluetoothRecorder.onDeviceDisconnected = (deviceId) => { console.log('设备断开:', deviceId) } ``` ### 步骤5: 接收音频数据 连接成功后,系统会自动: 1. 获取设备的服务列表 2. 查找可通知的特征值 3. 启用特征值通知 4. 监听数据变化 ```javascript // 监听音频数据接收 bluetoothRecorder.onAudioDataReceived = (data) => { // data.data: Base64编码的音频数据 // data.arrayBuffer: ArrayBuffer格式的音频数据 // data.timestamp: 时间戳 console.log('收到音频数据:', data) } ``` ### 步骤6: 处理音频数据 #### 6.1 保存到本地文件 ```javascript // 获取所有音频数据 const audioData = bluetoothRecorder.mergeAudioData() // 转换为ArrayBuffer const arrayBuffer = uni.base64ToArrayBuffer(audioData) // 保存到文件系统 const fs = uni.getFileSystemManager() const filePath = `${uni.env.USER_DATA_PATH}/recording.pcm` fs.writeFile({ filePath: filePath, data: arrayBuffer, success: () => { console.log('文件保存成功:', filePath) } }) ``` #### 6.2 上传到服务器 ```javascript // 准备上传数据 const audioData = bluetoothRecorder.mergeAudioData() const arrayBuffer = uni.base64ToArrayBuffer(audioData) // 上传到服务器 const formData = { audio: arrayBuffer, fileName: 'recording.pcm', deviceId: deviceId } const res = await post('/api/audioManagement/uploadBluetoothAudio', formData, { header: { 'Content-Type': 'multipart/form-data' } }) ``` ## 四、蓝牙设备协议说明 ### 4.1 服务UUID和特征值 不同的蓝牙录音设备可能使用不同的服务UUID和特征值。常见的有: **标准音频服务**: - 服务UUID: `0000110a-0000-1000-8000-00805f9b34fb` (A2DP) - 特征值UUID: 设备特定 **自定义服务**: - 需要根据设备厂商提供的文档配置 ### 4.2 数据格式 蓝牙设备传输的音频数据通常是: - **格式**: PCM (脉冲编码调制) - **采样率**: 8kHz, 16kHz, 44.1kHz 等 - **位深**: 16bit - **声道**: 单声道或立体声 ### 4.3 数据包处理 蓝牙BLE设备通常以数据包形式传输音频: - 每个数据包大小: 20字节 (BLE限制) - 需要将多个数据包合并为完整的音频流 - 可能需要处理数据包丢失和重排序 ## 五、使用示例 ### 5.1 完整使用流程 ```javascript import bluetoothRecorder from '@/common/bluetooth.js' // 1. 初始化 await bluetoothRecorder.initBluetoothAdapter() // 2. 搜索设备 bluetoothRecorder.onDeviceFound = (device) => { console.log('发现设备:', device) } await bluetoothRecorder.startScan() // 3. 连接设备 await bluetoothRecorder.connectDevice(deviceId) // 4. 接收数据 bluetoothRecorder.onAudioDataReceived = (data) => { // 处理音频数据 console.log('收到数据:', data) } // 5. 保存数据 const audioData = bluetoothRecorder.mergeAudioData() // ... 保存或上传逻辑 // 6. 断开连接 await bluetoothRecorder.disconnectDevice() // 7. 清理资源 await bluetoothRecorder.closeBluetoothAdapter() ``` ### 5.2 页面集成 在需要使用的页面中: ```vue ``` ## 六、注意事项 ### 6.1 权限要求 1. **Android 12+**: 需要 `BLUETOOTH_SCAN` 和 `BLUETOOTH_CONNECT` 权限 2. **位置权限**: 搜索蓝牙设备需要位置权限(Android要求) 3. **运行时权限**: 需要在代码中动态申请权限 ### 6.2 平台差异 1. **iOS**: - 需要用户明确授权蓝牙权限 - 后台运行限制更严格 - 某些蓝牙功能可能受限 2. **Android**: - 权限管理更复杂 - 不同版本API差异较大 - 需要处理权限动态申请 ### 6.3 性能优化 1. **数据缓冲**: 使用缓冲区避免频繁处理小数据包 2. **内存管理**: 及时清理不需要的数据,避免内存溢出 3. **连接管理**: 合理管理连接状态,避免资源泄漏 ### 6.4 错误处理 常见错误及处理: 1. **蓝牙未开启**: 提示用户开启蓝牙 2. **权限被拒绝**: 引导用户到设置页面授权 3. **设备连接失败**: 检查设备是否在范围内,是否已被其他设备连接 4. **数据接收中断**: 实现重连机制 ## 七、调试方法 ### 7.1 日志输出 工具类已内置详细日志,可通过控制台查看: - 设备搜索日志 - 连接状态日志 - 数据接收日志 - 错误日志 ### 7.2 测试步骤 1. 确保手机蓝牙已开启 2. 确保蓝牙录音设备已开启并处于可发现状态 3. 运行应用,点击"开始搜索" 4. 等待发现设备后,点击设备进行连接 5. 连接成功后,观察数据接收情况 6. 测试保存和上传功能 ## 八、扩展功能 ### 8.1 音频格式转换 如果需要转换为其他格式(如MP3、WAV),可以使用: - 前端转换库(如 lamejs) - 后端转换服务 ### 8.2 实时播放 可以结合 `uni.createInnerAudioContext()` 实现实时播放接收到的音频数据。 ### 8.3 数据加密 如果需要对传输的音频数据进行加密,可以在接收数据后进行解密处理。 ## 九、常见问题 ### Q1: 搜索不到设备? - 检查蓝牙是否开启 - 检查位置权限是否授权 - 检查设备是否处于可发现状态 - 尝试重启蓝牙 ### Q2: 连接失败? - 检查设备是否在范围内 - 检查设备是否已被其他应用连接 - 检查设备是否支持BLE - 查看错误日志获取详细信息 ### Q3: 接收不到数据? - 检查是否已启用特征值通知 - 检查服务UUID和特征值UUID是否正确 - 检查设备是否正在发送数据 - 查看设备文档确认数据格式 ### Q4: 数据不完整? - 检查数据包是否丢失 - 实现数据包校验和重传机制 - 检查缓冲区是否溢出 ## 十、参考资料 - [uni-app 蓝牙API文档](https://uniapp.dcloud.net.cn/api/system/bluetooth.html) - [Android 蓝牙开发指南](https://developer.android.com/guide/topics/connectivity/bluetooth) - [iOS Core Bluetooth 文档](https://developer.apple.com/documentation/corebluetooth) ## 十一、更新日志 - **2024-01-XX**: 初始版本,实现基础蓝牙连接和数据接收功能 - 后续根据实际使用情况进行优化和扩展