diff --git a/app/src/main/java/icu/fur93/esp32_car/repository/BluetoothRepository.kt b/app/src/main/java/icu/fur93/esp32_car/repository/BluetoothRepository.kt index 9eebbed..896ef27 100644 --- a/app/src/main/java/icu/fur93/esp32_car/repository/BluetoothRepository.kt +++ b/app/src/main/java/icu/fur93/esp32_car/repository/BluetoothRepository.kt @@ -3,6 +3,7 @@ package icu.fur93.esp32_car.repository import android.annotation.SuppressLint import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice +import android.bluetooth.BluetoothDevice.TRANSPORT_LE import android.bluetooth.BluetoothGatt import android.bluetooth.BluetoothGattCallback import android.bluetooth.BluetoothGattCharacteristic @@ -12,6 +13,7 @@ import android.bluetooth.le.ScanCallback import android.bluetooth.le.ScanResult import android.bluetooth.le.ScanSettings import android.content.Context +import android.widget.Toast import icu.fur93.esp32_car.entity.BleDevice import icu.fur93.esp32_car.viewmodel.CarCommands import icu.fur93.esp32_car.viewmodel.CarState @@ -26,6 +28,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch +import java.util.UUID // 蓝牙通信接口 interface BluetoothRepository { @@ -43,6 +46,10 @@ enum class ConnectionState { DISCONNECTING } +val serviceUUID = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" +val rxCharUUID = "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" +val txCharUUID = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" + // 蓝牙通信实现 class BluetoothRepositoryImpl( private val context: Context, @@ -121,7 +128,6 @@ class BluetoothRepositoryImpl( @SuppressLint("MissingPermission") fun connectToDevice(device: BluetoothDevice) { _connectionState.value = ConnectionState.CONNECTING - device.connectGatt( context, false, @@ -131,6 +137,12 @@ class BluetoothRepositoryImpl( status: Int, newState: Int ) { + if (status != BluetoothGatt.GATT_SUCCESS) { + scope.launch(Dispatchers.Main) { + Toast.makeText(context, "连接失败,错误码: $status", Toast.LENGTH_SHORT).show() + } + return + } when (newState) { BluetoothProfile.STATE_CONNECTED -> { bluetoothGatt = gatt @@ -159,7 +171,7 @@ class BluetoothRepositoryImpl( gatt.services?.forEach { service -> service.characteristics?.forEach { characteristic -> // 这里需要根据你的设备具体的UUID来匹配 - if (characteristic.uuid.toString() == "YOUR_CHARACTERISTIC_UUID") { + if (characteristic.uuid == UUID.fromString(rxCharUUID)) { rxCharacteristic = characteristic } } @@ -172,9 +184,12 @@ class BluetoothRepositoryImpl( characteristic: BluetoothGattCharacteristic, value: ByteArray ) { - onReceivePacket(value) + if (characteristic.uuid == UUID.fromString(txCharUUID)) { + onReceivePacket(value) + } } - } + }, + TRANSPORT_LE ) } @@ -209,6 +224,8 @@ class BluetoothRepositoryImpl( if (!isValidPacket(packet)) return when (packet[2].toUByte().toUInt()) { + + // `01 0C E0 电机A_IN_1_2 电机A_PWM 电机B_IN_1_2 电机B_PWM 电机C_IN_1_2 电机C_PWM 电机D_IN_1_2 电机D_PWM FE` CarCommands.CMD_STATUS_MOTOR -> updateMotorStatus(packet) } }