# BLE 蓝牙能力层集成说明 ## 概述 `capability-ble` 模块封装了新大洲本田蓝牙协议,提供简洁的高级 API 供业务模块调用。所有底层细节(连接、握手、配对、分包、加密等)都在能力层内部完成,业务层只需要调用简单的 API 即可。 ## 快速开始 ### 方式一:最简单(推荐) ```kotlin import com.narutohuo.xindazhou.ble.factory.BLEServiceFactory import com.narutohuo.xindazhou.ble.api.BLEService class VehicleControlActivity : AppCompatActivity() { private lateinit var bleService: BLEService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 获取服务实例并一键初始化连接 bleService = BLEServiceFactory.create(this) val userId = getUserId() // 16字节,从用户信息获取 val userType = BLEConstants.USER_TYPE_OWNER // 一键完成:初始化监听 + 扫描 + 连接 + 握手 bleService.initializeAndConnect( userId = userId, userType = userType, onConnected = { // 连接成功,已自动完成握手和配对,可以直接使用 showToast("连接成功") setupControls() }, onDisconnected = { showToast("连接已断开") }, onDataReceived = { data -> // 处理接收到的数据 handleReceivedData(data) }, onError = { error -> showError(error) } ) } private fun setupControls() { // 设防 btnDefense.setOnClickListener { bleService.setDefense(enabled = true) { response -> if (response.success) showToast("设防成功") } } // 上电 btnPower.setOnClickListener { bleService.powerOn { response -> if (response.success) showToast("上电成功") } } } override fun onDestroy() { super.onDestroy() if (bleService.isConnected()) { bleService.disconnect() } } } ``` ### 方式二:分步操作(更灵活) ### 1. 获取服务实例 ```kotlin import com.narutohuo.xindazhou.ble.factory.BLEServiceFactory import com.narutohuo.xindazhou.ble.api.BLEService // 在任何地方获取单例实例 val bleService: BLEService = BLEServiceFactory.create(context) ``` ### 2. 扫描设备 ```kotlin // 开始扫描 bleService.startScan { device -> // 找到设备 println("发现设备: ${device.name}, MAC: ${device.address}") } // 停止扫描(通常在找到设备后或超时后调用) bleService.stopScan() ``` ### 3. 连接设备(自动完成握手和配对) ```kotlin // 准备用户信息 val userId = ByteArray(16) { /* 从用户信息获取 */ } val userType = BLEConstants.USER_TYPE_OWNER // 0x02=车主 // 连接设备(连接成功即表示已完成握手和配对) val device = BLEDevice( name = "新大洲", address = "AA:BB:CC:DD:EE:FF", rssi = -50 ) bleService.connect(device, userId, userType) { response -> if (response.success) { // 连接成功,已自动完成握手和配对,可以直接使用 println("连接成功") } else { // 连接失败 println("连接失败: ${response.errorMessage}") } } ``` ### 4. 发送指令 连接成功后,就可以发送各种指令了。推荐使用便捷方法,更简单易用: #### 4.1 便捷方法(推荐) ```kotlin // 设防/撤防 bleService.setDefense(enabled = true) { response -> if (response.success) { println("设防成功") } } // 上电/下电 bleService.powerOn { response -> if (response.success) { println("上电成功") } } bleService.powerOff { response -> if (response.success) { println("下电成功") } } // 寻车 bleService.findCar { response -> if (response.success) { println("寻车成功") } } // 座桶锁 bleService.unlockSeat { response -> if (response.success) { println("座桶锁已打开") } } // 龙头锁 bleService.unlockHandlebar { response -> if (response.success) { println("龙头锁已打开") } } bleService.lockHandlebar { response -> if (response.success) { println("龙头锁已关闭") } } // 尾箱锁 bleService.unlockTrunk { response -> if (response.success) { println("尾箱锁已打开") } } bleService.lockTrunk { response -> if (response.success) { println("尾箱锁已关闭") } } // 感应解锁开关 bleService.setSensorUnlock(enabled = true) { response -> if (response.success) { println("感应解锁已开启") } } // 氛围灯开关 bleService.setAmbientLight(enabled = true) { response -> if (response.success) { println("氛围灯已开启") } } // 氛围灯颜色(RGB) bleService.setAmbientLightColor(r = 255, g = 0, b = 0) { response -> if (response.success) { println("氛围灯颜色已设置为红色") } } // 自动下电时间(秒) bleService.setAutoPowerOffTime(timeSeconds = 300) { response -> if (response.success) { println("自动下电时间已设置为300秒") } } // 蓝牙音箱音量(0-100) bleService.setSpeakerVolume(volume = 50) { response -> if (response.success) { println("音量已设置为50%") } } ``` #### 4.2 通用方法(高级用法) 如果需要更灵活的控制,可以使用通用方法: ```kotlin import com.narutohuo.xindazhou.ble.model.AppControlInstruction // 应用控制指令 bleService.sendAppControlCommand( instructionType = AppControlInstruction.SET_DEFENSE, data = byteArrayOf(0x01) ) { response -> // 处理响应 } ``` #### 4.3 查询车辆信息 ```kotlin bleService.queryVehicleInfo { response -> if (response.success && response.data != null) { // 解析车辆信息 val data = response.data!! // 根据协议文档解析数据 // data[0]: 设防状态 // data[1]: 上电状态 // data[2]: 门锁状态 // ... } else { println("查询失败: ${response.errorMessage}") } } ``` #### 4.4 系统控制指令(其他) 对于便捷方法未覆盖的指令,可以使用通用方法: ```kotlin import com.narutohuo.xindazhou.ble.model.SystemControlInstruction // 被盗锁定开关 bleService.sendSystemControlCommand( instructionType = SystemControlInstruction.STOLEN_LOCK, data = byteArrayOf(0x01) // 0x01=开启, 0x00=关闭 ) { response -> // 处理响应 } // 更多指令类型请查看 SystemControlInstruction 对象 ``` #### 4.5 系统设置指令 ```kotlin import com.narutohuo.xindazhou.ble.config.BLEConstants import com.narutohuo.xindazhou.ble.model.BLECommand // 钥匙学码 val command = BLECommand( functionCode = BLEConstants.FUNCTION_CODE_SYSTEM_SETTING, instructionType = 0x01.toByte(), applicationData = byteArrayOf(0x01) ) bleService.sendCommand(command) { response -> // 处理响应 } // 震动灵敏度设置 val command = BLECommand( functionCode = BLEConstants.FUNCTION_CODE_SYSTEM_SETTING, instructionType = 0x02.toByte(), applicationData = byteArrayOf(3) // 1-5级 ) bleService.sendCommand(command) { response -> // 处理响应 } ``` ### 5. 接收数据 ```kotlin import com.narutohuo.xindazhou.ble.callback.DataCallback bleService.setDataReceivedListener(object : DataCallback { override fun onDataReceived(data: ByteArray) { // 处理接收到的数据(通常是JSON格式) val jsonString = String(data, Charsets.UTF_8) println("收到数据: $jsonString") // 解析JSON并处理业务逻辑 // ... } }) ``` ### 6. 断开连接 ```kotlin bleService.disconnect() ``` ## 完整使用示例 ### 方式三:分步操作(更灵活) 如果需要更精细的控制,可以分步操作: ```kotlin class VehicleControlActivity : AppCompatActivity() { private lateinit var bleService: BLEService override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 1. 获取服务实例 bleService = BLEServiceFactory.create(this) // 2. 设置数据接收监听 bleService.setDataReceivedListener(object : DataCallback { override fun onDataReceived(data: ByteArray) { handleReceivedData(data) } }) // 3. 扫描设备 scanDevices() } private fun scanDevices() { bleService.startScan { device -> // 找到设备,停止扫描 bleService.stopScan() // 连接设备 connectToDevice(device) } // 10秒后自动停止扫描 Handler(Looper.getMainLooper()).postDelayed({ bleService.stopScan() }, 10000) } private fun connectToDevice(device: BLEDevice) { val userId = getUserId() // 16字节 val userType = BLEConstants.USER_TYPE_OWNER bleService.connect(device, userId, userType) { response -> if (response.success) { // 连接成功,已自动完成握手和配对 onConnected() } else { showError("连接失败: ${response.errorMessage}") } } } private fun onConnected() { // 连接成功后,可以发送各种指令 // ... } override fun onDestroy() { super.onDestroy() if (bleService.isConnected()) { bleService.disconnect() } } } ``` ## API 参考 ### 基础连接功能 #### `initializeAndConnect(...)` ⭐⭐⭐ 最推荐,最简单 一键完成所有初始化、监听设置、扫描、连接、握手,最简单的方式。 **参数:** - `userId`: 用户ID(16字节) - `userType`: 用户类型(0x01=最高权限, 0x02=车主, 0x03=分享用户) - `onConnected`: 连接成功回调(已自动完成握手和配对) - `onDisconnected`: 断开连接回调(可选) - `onDataReceived`: 数据接收回调(可选) - `onError`: 错误回调(可选) - `scanTimeoutMs`: 扫描超时时间(毫秒),默认10秒 **示例:** ```kotlin bleService.initializeAndConnect( userId = getUserId(), userType = BLEConstants.USER_TYPE_OWNER, onConnected = { // 连接成功,已自动完成握手和配对,可以直接使用 showToast("连接成功") }, onDisconnected = { showToast("连接已断开") }, onDataReceived = { data -> // 处理接收到的数据 handleData(data) }, onError = { error -> showError(error) } ) ``` #### `scanAndConnect(...)` ⭐⭐ 推荐使用 一键完成扫描+连接+握手。 **参数:** - `userId`: 用户ID(16字节) - `userType`: 用户类型(0x01=最高权限, 0x02=车主, 0x03=分享用户) - `scanTimeoutMs`: 扫描超时时间(毫秒),默认10秒 - `onScanning`: 扫描中回调(可选) - `onDeviceFound`: 找到设备回调(可选) - `onConnected`: 连接成功回调(已自动完成握手和配对) - `onError`: 错误回调 **示例:** ```kotlin bleService.scanAndConnect( userId = getUserId(), userType = BLEConstants.USER_TYPE_OWNER, onScanning = { showToast("正在扫描...") }, onDeviceFound = { device -> showToast("找到设备: ${device.name}") }, onConnected = { // 连接成功,已自动完成握手和配对,可以直接使用 showToast("连接成功") }, onError = { error -> showError(error) } ) ``` #### `setConnectionListener(...)` ⭐ 推荐使用 设置连接状态监听器,自动监听连接/断开事件。 **参数:** - `onConnected`: 连接成功回调 - `onDisconnected`: 断开连接回调 - `onError`: 错误回调 **示例:** ```kotlin bleService.setConnectionListener( onConnected = { // 连接成功,已自动完成握手和配对 showToast("连接成功") }, onDisconnected = { showToast("连接已断开") }, onError = { error -> showError(error) } ) ``` #### `startScan(callback: (BLEDevice) -> Unit)` 开始扫描 BLE 设备(用于分步操作)。 **参数:** - `callback`: 扫描结果回调,每次发现设备时调用 **示例:** ```kotlin bleService.startScan { device -> println("发现设备: ${device.name}") } ``` #### `stopScan()` 停止扫描设备。 #### `connect(device: BLEDevice, userId: ByteArray, userType: Byte, callback: (BLEResponse) -> Unit)` 连接设备并自动完成握手和配对(用于分步操作)。 **参数:** - `device`: 要连接的设备 - `userId`: 用户ID(16字节) - `userType`: 用户类型(0x01=最高权限, 0x02=车主, 0x03=分享用户) - `callback`: 连接结果回调,连接成功表示已完成握手和配对 **注意:** 连接成功即表示已完成握手和配对,业务层无需再调用握手方法。 #### `disconnect()` 断开连接。 #### `isConnected(): Boolean` 检查是否已连接。 ### 指令发送功能 #### 便捷方法(推荐) **应用控制:** - `setDefense(enabled: Boolean, callback)` - 设防/撤防 - `powerOn(callback)` - 上电 - `powerOff(callback)` - 下电 - `findCar(callback)` - 寻车 - `unlockSeat(callback)` - 打开座桶锁 - `unlockHandlebar(callback)` - 打开龙头锁 - `lockHandlebar(callback)` - 关闭龙头锁 - `unlockTrunk(callback)` - 打开尾箱锁 - `lockTrunk(callback)` - 关闭尾箱锁 **系统控制:** - `setSensorUnlock(enabled: Boolean, callback)` - 设置感应解锁开关 - `setAmbientLight(enabled: Boolean, callback)` - 设置氛围灯开关 - `setAmbientLightColor(r: Int, g: Int, b: Int, callback)` - 设置氛围灯颜色 - `setAutoPowerOffTime(timeSeconds: Int, callback)` - 设置自动下电时间 - `setSpeakerVolume(volume: Int, callback)` - 设置蓝牙音箱音量 #### 通用方法(高级用法) #### `sendAppControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)` 发送应用控制指令(用于便捷方法未覆盖的场景)。 **常用指令类型:** - `AppControlInstruction.SET_DEFENSE` - 设撤防 - `AppControlInstruction.POWER_ON_OFF` - 上下电 - `AppControlInstruction.FIND_CAR` - 寻车 - `AppControlInstruction.SEAT_LOCK` - 座桶锁 - `AppControlInstruction.HANDLEBAR_LOCK` - 龙头锁 - `AppControlInstruction.TRUNK_LOCK` - 尾箱锁 #### `sendSystemControlCommand(instructionType: Byte, data: ByteArray, callback: (BLEResponse) -> Unit)` 发送系统控制指令(用于便捷方法未覆盖的场景)。 **常用指令类型:** - `SystemControlInstruction.SENSOR_UNLOCK` - 感应解锁开关 - `SystemControlInstruction.AMBIENT_LIGHT` - 氛围灯开关 - `SystemControlInstruction.AMBIENT_LIGHT_COLOR` - 氛围灯颜色 - `SystemControlInstruction.AUTO_POWER_OFF_TIME` - 自动下电时间 - `SystemControlInstruction.SPEAKER_VOLUME` - 蓝牙音箱音量 - 更多指令类型请查看 `SystemControlInstruction` 对象 #### `queryVehicleInfo(callback: (BLEResponse) -> Unit)` 查询车辆信息。 **响应数据:** - `response.data`: 车辆信息数据(ByteArray),需要根据协议文档解析 #### `sendCommand(command: BLECommand, callback: (BLEResponse) -> Unit)` 发送自定义指令(用于系统设置等)。 **示例:** ```kotlin val command = BLECommand( functionCode = BLEConstants.FUNCTION_CODE_SYSTEM_SETTING, instructionType = 0x01.toByte(), applicationData = byteArrayOf(0x01) ) bleService.sendCommand(command) { response -> // 处理响应 } ``` ### 数据接收 #### `setDataReceivedListener(listener: DataCallback)` 设置数据接收监听器。 **示例:** ```kotlin bleService.setDataReceivedListener(object : DataCallback { override fun onDataReceived(data: ByteArray) { // 处理接收到的数据 } }) ``` ## 常量定义 ### 用户类型 ```kotlin BLEConstants.USER_TYPE_HIGHEST // 0x01 - 最高权限 BLEConstants.USER_TYPE_OWNER // 0x02 - 车主 BLEConstants.USER_TYPE_SHARED // 0x03 - 分享用户 ``` ### 功能码 ```kotlin BLEConstants.FUNCTION_CODE_HANDSHAKE // 0x01 - 握手 BLEConstants.FUNCTION_CODE_APP_CONTROL // 0x02 - 应用控制 BLEConstants.FUNCTION_CODE_SYSTEM_CONTROL // 0x03 - 系统控制 BLEConstants.FUNCTION_CODE_SYSTEM_QUERY // 0x04 - 系统查询 BLEConstants.FUNCTION_CODE_SYSTEM_SETTING // 0x05 - 系统设置 ``` ## 注意事项 1. **单例模式**:`BLEService` 使用单例模式,全局共享同一个连接状态。 2. **自动握手**:连接时传入用户信息,连接成功即表示已完成握手和配对,无需手动调用握手方法。 3. **线程安全**:所有回调都在主线程执行,可以直接更新 UI。 4. **错误处理**:所有 API 都通过 `BLEResponse` 返回结果,需要检查 `response.success` 判断是否成功。 5. **权限要求**:需要在 `AndroidManifest.xml` 中添加蓝牙相关权限: ```xml ``` 6. **生命周期管理**:建议在 `onDestroy()` 中调用 `disconnect()` 断开连接。 ## 架构说明 能力层内部自动处理: - ✅ GATT 连接管理 - ✅ 服务发现 - ✅ 握手认证(连接时自动完成) - ✅ 配对处理(连接时自动完成) - ✅ 数据分包和组包 - ✅ ACK/REX 机制 - ✅ 超时重试 - ✅ AES 加密/解密 - ✅ 协议包构建和解析 业务层只需要: - ✅ 调用高级 API - ✅ 处理业务逻辑 - ✅ 更新 UI ## 更多信息 详细的协议说明请参考:`doc/蓝牙协议.md`