|
|
|
@ -189,48 +189,75 @@ object BleService { |
|
|
|
// ====================================================================================================== |
|
|
|
// 扫描功能 |
|
|
|
// ====================================================================================================== |
|
|
|
fun reinitializeBle() { |
|
|
|
val manager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager |
|
|
|
bluetoothAdapter = manager.adapter // 重新获取新引用 |
|
|
|
bluetoothLeScanner = bluetoothAdapter?.bluetoothLeScanner |
|
|
|
} |
|
|
|
/** |
|
|
|
* 开始主动扫描BLE设备 |
|
|
|
* @param timeout 扫描超时时间(毫秒) |
|
|
|
* @return 是否成功开始扫描 |
|
|
|
*/ |
|
|
|
fun startScan(timeout: Long = 15000): Boolean { |
|
|
|
fun startScan(deviceName:String,timeout: Long = 15000): Boolean { |
|
|
|
// Log.i(TAG, "liwei---------startScan 1 $deviceName") |
|
|
|
if (!isInitialized) { |
|
|
|
Log.e(TAG, "BLE服务未初始化") |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 2") |
|
|
|
// 获取一个局部引用,避免并发访问问题 |
|
|
|
val scanner = bluetoothLeScanner ?: return false |
|
|
|
// val scanner = bluetoothLeScanner ?: return false |
|
|
|
// 💡 每次都重新取最新实例 |
|
|
|
val scanner = bluetoothLeScanner ?: run { |
|
|
|
Log.e(TAG, "bluetoothLeScanner == null,尝试重启蓝牙") |
|
|
|
reinitializeBle() |
|
|
|
return false |
|
|
|
} |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 3") |
|
|
|
if (isScanning) return false |
|
|
|
// Log.i(TAG, "liwei---------startScan 4") |
|
|
|
Log.i(TAG, "开始主动扫描BLE设备...") |
|
|
|
scanResults.clear() |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 5") |
|
|
|
// val filter = ScanFilter.Builder() |
|
|
|
// // .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) |
|
|
|
// .setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) |
|
|
|
// .build() |
|
|
|
// Log.i(TAG, "liwei---------startScan 6") |
|
|
|
// val settings = ScanSettings.Builder() |
|
|
|
// .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) |
|
|
|
// // .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) |
|
|
|
// .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) // 使用ALL_MATCHES获取所有结果 |
|
|
|
// .setReportDelay(0) // 立即报告结果 |
|
|
|
// .build() |
|
|
|
val filter = ScanFilter.Builder() |
|
|
|
// 建议用 Service UUID 或 Device Name 替代 Manufacturer Data |
|
|
|
// .setServiceUuid(ParcelUuid(BleConst.PRIMARY_SERVICE_UUID)) |
|
|
|
.setManufacturerData(0xEFAB, byteArrayOf(0xA0.toByte(), 0x01)) |
|
|
|
// .setDeviceName(deviceName) // 更通用、更安全 |
|
|
|
.build() |
|
|
|
|
|
|
|
val settings = ScanSettings.Builder() |
|
|
|
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) |
|
|
|
// .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) |
|
|
|
.setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH) // 使用ALL_MATCHES获取所有结果 |
|
|
|
.setReportDelay(0) // 立即报告结果 |
|
|
|
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES) // 推荐:不会触发权限问题 |
|
|
|
.setReportDelay(0) |
|
|
|
.build() |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 7") |
|
|
|
try { |
|
|
|
scanner.startScan(listOf(filter), settings, scanCallback) |
|
|
|
isScanning = true |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 8") |
|
|
|
// 设置扫描超时 |
|
|
|
scanHandler.postDelayed({ |
|
|
|
Log.d(TAG, "扫描超时,停止扫描") |
|
|
|
stopScan() |
|
|
|
}, timeout) |
|
|
|
|
|
|
|
// Log.i(TAG, "liwei---------startScan 9") |
|
|
|
return true |
|
|
|
} catch (e: Exception) { |
|
|
|
Log.e(TAG, "启动扫描失败: ${e.message}", e) |
|
|
|
// Log.i(TAG, "liwei---------startScan 10") |
|
|
|
isScanning = false |
|
|
|
return false |
|
|
|
} |
|
|
|
@ -296,6 +323,7 @@ object BleService { |
|
|
|
|
|
|
|
override fun onScanFailed(errorCode: Int) { |
|
|
|
Log.e(TAG, "扫描失败 error=$errorCode") |
|
|
|
stopScan() |
|
|
|
isScanning = false |
|
|
|
} |
|
|
|
} |
|
|
|
@ -306,6 +334,7 @@ object BleService { |
|
|
|
val idx = scanResults.indexOfFirst { it.device.address == address } |
|
|
|
Log.d(TAG, "获取设备信息:${address} idx:$idx") |
|
|
|
if (idx >= 0){ |
|
|
|
stopScan() |
|
|
|
val result = scanResults[idx]; |
|
|
|
return printDeviceInfo(result) |
|
|
|
} |
|
|
|
@ -321,9 +350,9 @@ object BleService { |
|
|
|
val serviceUuids = |
|
|
|
scanRecord?.serviceUuids?.joinToString(", ") { it.uuid.toString() } ?: "无" |
|
|
|
|
|
|
|
Log.d( |
|
|
|
TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " + |
|
|
|
"RSSI=${result.rssi}, 服务UUID=[$serviceUuids]" |
|
|
|
// Log.d( |
|
|
|
// TAG, "liwei--------- 扫描到设备: 名称=${device.name ?: "未知"}, 地址=${device.address}, " + |
|
|
|
// "RSSI=${result.rssi}, 服务UUID=[$serviceUuids]" |
|
|
|
) |
|
|
|
val info = mutableMapOf( |
|
|
|
"name" to (device.name ?: "未知"), |
|
|
|
@ -333,7 +362,7 @@ object BleService { |
|
|
|
val scanData = scanRecord?.bytes |
|
|
|
if (scanData != null) { |
|
|
|
val hexString = scanData.joinToString("") { String.format("%02X", it) } |
|
|
|
Log.d(TAG, "liwei------------ 广播数据: $hexString") |
|
|
|
// Log.d(TAG, "liwei------------ 广播数据: $hexString") |
|
|
|
info["hex"] = hexString |
|
|
|
// 解析服务数据 |
|
|
|
scanRecord.serviceData?.forEach { (uuid, data) -> |
|
|
|
|