|
|
2 тижнів тому | |
|---|---|---|
| .. | ||
| src | 2 тижнів тому | |
| README.md | 3 тижнів тому | |
| build.gradle | 3 тижнів тому | |
| 业务模块调用示例.md | 4 тижнів тому | |
| 使用说明-单例模式.md | 4 тижнів тому | |
| 集成说明.html | 3 тижнів тому | |
| 集成说明.md | 2 тижнів тому | |
capability-ble 模块封装了新大洲本田蓝牙协议,提供简洁的高级 API 供业务模块调用。所有底层细节(连接、握手、配对、分包、加密等)都在能力层内部完成,业务层只需要调用简单的 API 即可。
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()
}
}
}
import com.narutohuo.xindazhou.ble.factory.BLEServiceFactory
import com.narutohuo.xindazhou.ble.api.BLEService
// 在任何地方获取单例实例
val bleService: BLEService = BLEServiceFactory.create(context)
// 开始扫描
bleService.startScan { device ->
// 找到设备
println("发现设备: ${device.name}, MAC: ${device.address}")
}
// 停止扫描(通常在找到设备后或超时后调用)
bleService.stopScan()
// 准备用户信息
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}")
}
}
连接成功后,就可以发送各种指令了。推荐使用便捷方法,更简单易用:
// 设防/撤防
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%")
}
}
如果需要更灵活的控制,可以使用通用方法:
import com.narutohuo.xindazhou.ble.model.AppControlInstruction
// 应用控制指令
bleService.sendAppControlCommand(
instructionType = AppControlInstruction.SET_DEFENSE,
data = byteArrayOf(0x01)
) { response ->
// 处理响应
}
bleService.queryVehicleInfo { response ->
if (response.success && response.data != null) {
// 解析车辆信息
val data = response.data!!
// 根据协议文档解析数据
// data[0]: 设防状态
// data[1]: 上电状态
// data[2]: 门锁状态
// ...
} else {
println("查询失败: ${response.errorMessage}")
}
}
对于便捷方法未覆盖的指令,可以使用通用方法:
import com.narutohuo.xindazhou.ble.model.SystemControlInstruction
// 被盗锁定开关
bleService.sendSystemControlCommand(
instructionType = SystemControlInstruction.STOLEN_LOCK,
data = byteArrayOf(0x01) // 0x01=开启, 0x00=关闭
) { response ->
// 处理响应
}
// 更多指令类型请查看 SystemControlInstruction 对象
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 ->
// 处理响应
}
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并处理业务逻辑
// ...
}
})
bleService.disconnect()
如果需要更精细的控制,可以分步操作:
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()
}
}
}
initializeAndConnect(...) ⭐⭐⭐ 最推荐,最简单一键完成所有初始化、监听设置、扫描、连接、握手,最简单的方式。
参数:
userId: 用户ID(16字节)userType: 用户类型(0x01=最高权限, 0x02=车主, 0x03=分享用户)onConnected: 连接成功回调(已自动完成握手和配对)onDisconnected: 断开连接回调(可选)onDataReceived: 数据接收回调(可选)onError: 错误回调(可选)scanTimeoutMs: 扫描超时时间(毫秒),默认10秒示例:
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: 错误回调示例:
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: 错误回调示例:
bleService.setConnectionListener(
onConnected = {
// 连接成功,已自动完成握手和配对
showToast("连接成功")
},
onDisconnected = {
showToast("连接已断开")
},
onError = { error ->
showError(error)
}
)
startScan(callback: (BLEDevice) -> Unit)开始扫描 BLE 设备(用于分步操作)。
参数:
callback: 扫描结果回调,每次发现设备时调用示例:
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)发送自定义指令(用于系统设置等)。
示例:
val command = BLECommand(
functionCode = BLEConstants.FUNCTION_CODE_SYSTEM_SETTING,
instructionType = 0x01.toByte(),
applicationData = byteArrayOf(0x01)
)
bleService.sendCommand(command) { response ->
// 处理响应
}
setDataReceivedListener(listener: DataCallback)设置数据接收监听器。
示例:
bleService.setDataReceivedListener(object : DataCallback {
override fun onDataReceived(data: ByteArray) {
// 处理接收到的数据
}
})
BLEConstants.USER_TYPE_HIGHEST // 0x01 - 最高权限
BLEConstants.USER_TYPE_OWNER // 0x02 - 车主
BLEConstants.USER_TYPE_SHARED // 0x03 - 分享用户
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 - 系统设置
单例模式:BLEService 使用单例模式,全局共享同一个连接状态。
自动握手:连接时传入用户信息,连接成功即表示已完成握手和配对,无需手动调用握手方法。
线程安全:所有回调都在主线程执行,可以直接更新 UI。
错误处理:所有 API 都通过 BLEResponse 返回结果,需要检查 response.success 判断是否成功。
权限要求:需要在 AndroidManifest.xml 中添加蓝牙相关权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
生命周期管理:建议在 onDestroy() 中调用 disconnect() 断开连接。
能力层内部自动处理:
业务层只需要:
详细的协议说明请参考:doc/蓝牙协议.md