# 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`