diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9060d1a..7e8b647 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,7 +15,9 @@ android:name="android.permission.BLUETOOTH_ADMIN" tools:ignore="ProtectedPermissions" /> - + (null) } if (permissionState.allPermissionsGranted) { val context = LocalContext.current @@ -139,6 +141,7 @@ fun Main() { } else if (intent.action == AirPodsNotifications.AIRPODS_DISCONNECTED) { Log.d("MainActivity", "AirPods Disconnected intent received") + isRemotelyConnected.value = CrossDevice.isAvailable isConnected.value = false } } @@ -172,7 +175,8 @@ fun Main() { dev = airPodsService.value?.device, service = airPodsService.value!!, navController = navController, - isConnected = isConnected.value + isConnected = isConnected.value, + isRemotelyConnected = isRemotelyConnected.value ) } } @@ -208,7 +212,7 @@ fun Main() { context.bindService(Intent(context, AirPodsService::class.java), serviceConnection, Context.BIND_AUTO_CREATE) - if (airPodsService.value?.isConnected == true) { + if (airPodsService.value?.isConnectedLocally == true) { isConnected.value = true } } else { diff --git a/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt b/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt index 3ec6116..34598a9 100644 --- a/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt +++ b/android/app/src/main/java/me/kavishdevar/aln/screens/AirPodsSettingsScreen.kt @@ -91,7 +91,7 @@ import me.kavishdevar.aln.utils.AirPodsNotifications @SuppressLint("MissingPermission") @Composable fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService, - navController: NavController, isConnected: Boolean) { + navController: NavController, isConnected: Boolean, isRemotelyConnected: Boolean) { val sharedPreferences = LocalContext.current.getSharedPreferences("settings", MODE_PRIVATE) var device by remember { mutableStateOf(dev) } var deviceName by remember { @@ -187,7 +187,7 @@ fun AirPodsSettingsScreen(dev: BluetoothDevice?, service: AirPodsService, ) } ) { paddingValues -> - if (isConnected == true) { + if (isConnected == true || isRemotelyConnected == true) { Column( modifier = Modifier .haze(hazeState) @@ -308,7 +308,7 @@ fun AirPodsSettingsScreenPreview() { ALNTheme ( darkTheme = true ) { - AirPodsSettingsScreen(dev = null, service = AirPodsService(), navController = rememberNavController(), isConnected = true) + AirPodsSettingsScreen(dev = null, service = AirPodsService(), navController = rememberNavController(), isConnected = true, isRemotelyConnected = false) } } } \ No newline at end of file diff --git a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsQSService.kt b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsQSService.kt index 42b26ff..b4f6148 100644 --- a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsQSService.kt +++ b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsQSService.kt @@ -48,7 +48,7 @@ class AirPodsQSService: TileService() { qsTile.state = Tile.STATE_UNAVAILABLE qsTile.updateTile() } - if (ServiceManager.getService()?.isConnected == true) { + if (ServiceManager.getService()?.isConnectedLocally == true) { qsTile.state = Tile.STATE_ACTIVE qsTile.updateTile() } @@ -89,7 +89,7 @@ class AirPodsQSService: TileService() { IntentFilter(AirPodsNotifications.Companion.ANC_DATA) ) } - qsTile.state = if (ServiceManager.getService()?.isConnected == true) Tile.STATE_ACTIVE else Tile.STATE_UNAVAILABLE + qsTile.state = if (ServiceManager.getService()?.isConnectedLocally == true) Tile.STATE_ACTIVE else Tile.STATE_UNAVAILABLE val ancIndex = ServiceManager.getService()?.getANC() currentModeIndex = if (ancIndex != null) { if (ancIndex == 2) 0 else if (ancIndex == 3) 1 else if (ancIndex == 4) 2 else 2 } else 0 updateTile() diff --git a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt index baa3757..92db3cb 100644 --- a/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt +++ b/android/app/src/main/java/me/kavishdevar/aln/services/AirPodsService.kt @@ -24,10 +24,15 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service import android.appwidget.AppWidgetManager +import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothManager import android.bluetooth.BluetoothProfile import android.bluetooth.BluetoothSocket +import android.bluetooth.le.ScanCallback +import android.bluetooth.le.ScanFilter +import android.bluetooth.le.ScanResult +import android.bluetooth.le.ScanSettings import android.content.BroadcastReceiver import android.content.ComponentName import android.content.Context @@ -46,7 +51,10 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.core.app.NotificationCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.launch import me.kavishdevar.aln.BatteryWidget import me.kavishdevar.aln.MainActivity @@ -55,11 +63,13 @@ import me.kavishdevar.aln.utils.AirPodsNotifications import me.kavishdevar.aln.utils.Battery import me.kavishdevar.aln.utils.BatteryComponent import me.kavishdevar.aln.utils.BatteryStatus +import me.kavishdevar.aln.utils.CrossDevice import me.kavishdevar.aln.utils.Enums import me.kavishdevar.aln.utils.LongPressPackets import me.kavishdevar.aln.utils.MediaController import me.kavishdevar.aln.utils.Window import org.lsposed.hiddenapibypass.HiddenApiBypass +import java.io.OutputStream object ServiceManager { private var service: AirPodsService? = null @@ -88,6 +98,7 @@ object ServiceManager { //@Suppress("unused") class AirPodsService: Service() { + private var macAddress = "" inner class LocalBinder : Binder() { fun getService(): AirPodsService = this@AirPodsService } @@ -107,6 +118,30 @@ class AirPodsService: Service() { popupShown = true } + private fun handleMessage(message: String, outputStream: OutputStream) { + when (message) { + "PAUSE_MEDIA" -> MediaController.sendPause() + "PLAY_MEDIA" -> MediaController.sendPlay() + "CONNECT_AIRPODS" -> connectToAirPods() + "DISCONNECT_AIRPODS" -> disconnectFromAirPods() + else -> { + forwardPacket(message, outputStream) + } + } + } + private fun forwardPacket(packet: String, outputStream: OutputStream) { + outputStream.write(packet.toByteArray()) + } + + private fun connectToAirPods() { + Log.d("AirPodsQuickSwitchService", "Should connect to AirPods now.") + } + + private fun disconnectFromAirPods() { + Log.d("AirPodsQuickSwitchService", "Should disconnect from AirPods now.") + } + + @Suppress("ClassName") private object bluetoothReceiver: BroadcastReceiver() { @SuppressLint("MissingPermission") @@ -123,7 +158,7 @@ class AirPodsService: Service() { if (bluetoothDevice != null && action != null && !action.isEmpty()) { Log.d("AirPodsService", "Received bluetooth connection broadcast") if (BluetoothDevice.ACTION_ACL_CONNECTED == action) { - if (ServiceManager.getService()?.isConnected == true) { + if (ServiceManager.getService()?.isConnectedLocally == true) { ServiceManager.getService()?.manuallyCheckForAudioSource() return } @@ -139,11 +174,47 @@ class AirPodsService: Service() { } } - var isConnected = false + var isConnectedLocally = false var device: BluetoothDevice? = null private lateinit var earReceiver: BroadcastReceiver + @SuppressLint("MissingPermission") + fun scanForAirPods(bluetoothAdapter: BluetoothAdapter): Flow> = callbackFlow { + val bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner + ?: throw IllegalStateException("Bluetooth adapter unavailable") + + val scanCallback = object : ScanCallback() { + override fun onScanResult(callbackType: Int, result: ScanResult) { + if (result.device != null) { + trySend(listOf(result)) + } + } + + override fun onBatchScanResults(results: List) { + trySend(results) + } + + override fun onScanFailed(errorCode: Int) { + close(Exception("Scan failed with error: $errorCode")) + } + } + + val scanSettings = ScanSettings.Builder() + .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) + .build() + + val scanFilters = listOf( + ScanFilter.Builder() + .setManufacturerData(0x004C, byteArrayOf()) + .build() + ) + + bluetoothLeScanner.startScan(scanFilters, scanSettings, scanCallback) + awaitClose { bluetoothLeScanner.stopScan(scanCallback) } + } + + fun startForegroundNotification() { val notificationChannel = NotificationChannel( "background_service_status", @@ -261,6 +332,11 @@ class AirPodsService: Service() { Log.d("AirPodsService", "Service started") ServiceManager.setService(this) startForegroundNotification() + + Log.d("AirPodsService", "Initializing CrossDevice") + CrossDevice.init(this) + Log.d("AirPodsService", "CrossDevice initialized") + val serviceIntentFilter = IntentFilter().apply { addAction("android.bluetooth.device.action.ACL_CONNECTED") addAction("android.bluetooth.device.action.ACL_DISCONNECTED") @@ -294,14 +370,19 @@ class AirPodsService: Service() { this@AirPodsService.getSharedPreferences("settings", MODE_PRIVATE).edit() .putString("name", name).apply() } - Log.d("AirPodsService", "$name connected") - showPopup(this@AirPodsService, name.toString()) - connectToSocket(device!!) - updateNotificationContent(true, name.toString(), batteryNotification.getBattery()) + Log.d("AirPodsQuickSwitchServices", CrossDevice.isAvailable.toString()) + if (!CrossDevice.isAvailable) { + Log.d("AirPodsService", "$name connected") + showPopup(this@AirPodsService, name.toString()) + connectToSocket(device!!) + isConnectedLocally = true + macAddress = device!!.address + updateNotificationContent(true, name.toString(), batteryNotification.getBattery()) + } } else if (intent?.action == AirPodsNotifications.Companion.AIRPODS_DISCONNECTED) { device = null - isConnected = false + isConnectedLocally = false popupShown = false updateNotificationContent(false) } @@ -319,6 +400,28 @@ class AirPodsService: Service() { } val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter + if (bluetoothAdapter.isEnabled) { + CoroutineScope(Dispatchers.IO).launch { + var lastData = byteArrayOf() + scanForAirPods(bluetoothAdapter).collect { scanResults -> + scanResults.forEach { scanResult -> + val device = scanResult.device + device.fetchUuidsWithSdp() + val manufacturerData = scanResult.scanRecord?.manufacturerSpecificData?.get(0x004C) + if (manufacturerData != null && manufacturerData != lastData) { + lastData = manufacturerData + val formattedHex = manufacturerData.joinToString(" ") { "%02X".format(it) } + val rssi = scanResult.rssi + Log.d( + "AirPodsBLEService", + "Received broadcast of size ${manufacturerData.size} from ${device.address} | $rssi | $formattedHex" + ) + } + } + } + } + } + bluetoothAdapter.bondedDevices.forEach { device -> device.fetchUuidsWithSdp() if (device.uuids != null) @@ -331,7 +434,9 @@ class AirPodsService: Service() { if (profile == BluetoothProfile.A2DP) { val connectedDevices = proxy.connectedDevices if (connectedDevices.isNotEmpty()) { - connectToSocket(device) + if (!CrossDevice.isAvailable) { + connectToSocket(device) + } this@AirPodsService.sendBroadcast( Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED) ) @@ -365,7 +470,7 @@ class AirPodsService: Service() { HiddenApiBypass.addHiddenApiExemptions("Landroid/bluetooth/BluetoothSocket;") val uuid: ParcelUuid = ParcelUuid.fromString("74ec2172-0bad-4d01-8f77-997b2be0722a") - if (isConnected != true) { + if (isConnectedLocally != true) { try { socket = HiddenApiBypass.newInstance( BluetoothSocket::class.java, @@ -401,7 +506,7 @@ class AirPodsService: Service() { try { socket.connect() this@AirPodsService.device = device - isConnected = true + isConnectedLocally = true socket.let { it -> // sometimes doesn't work ;-; // i though i move it to the coroutine @@ -437,7 +542,6 @@ class AirPodsService: Service() { Intent(AirPodsNotifications.Companion.AIRPODS_CONNECTED) .putExtra("device", device) ) - while (socket.isConnected == true) { socket.let { val audioManager = @@ -453,6 +557,7 @@ class AirPodsService: Service() { }) val bytes = buffer.copyOfRange(0, bytesRead) val formattedHex = bytes.joinToString(" ") { "%02X".format(it) } + CrossDevice.sendReceivedPacket(bytes) Log.d("AirPods Data", "Data received: $formattedHex") } else if (bytesRead == -1) { Log.d("AirPods Service", "Socket closed (bytesRead = -1)") @@ -565,15 +670,11 @@ class AirPodsService: Service() { if (inEar == true) { if (!justEnabledA2dp) { justEnabledA2dp = false -// if (audioManager.activePlaybackConfigurations.any { it.audioDeviceInfo?.address == device.address }) { MediaController.sendPlay() MediaController.iPausedTheMedia = false -// } } } else { -// if (audioManager.activePlaybackConfigurations.any { it.audioDeviceInfo?.address == device.address }) { MediaController.sendPause() -// } } } } @@ -593,12 +694,16 @@ class AirPodsService: Service() { ) } } else if (ancNotification.isANCData(data)) { + CrossDevice.sendRemotePacket(data) + CrossDevice.ancBytes = data ancNotification.setStatus(data) sendBroadcast(Intent(AirPodsNotifications.Companion.ANC_DATA).apply { putExtra("data", ancNotification.status) }) Log.d("AirPods Parser", "ANC: ${ancNotification.status}") } else if (batteryNotification.isBatteryData(data)) { + CrossDevice.sendRemotePacket(data) + CrossDevice.batteryBytes = data batteryNotification.setBattery(data) sendBroadcast(Intent(AirPodsNotifications.Companion.BATTERY_DATA).apply { putParcelableArrayListExtra( @@ -651,7 +756,7 @@ class AirPodsService: Service() { } } Log.d("AirPods Service", "Socket closed") - isConnected = false + isConnectedLocally = false socket.close() sendBroadcast(Intent(AirPodsNotifications.Companion.AIRPODS_DISCONNECTED)) } @@ -663,59 +768,91 @@ class AirPodsService: Service() { } } + fun disconnect() { + socket.close() + val bluetoothAdapter = getSystemService(BluetoothManager::class.java).adapter + bluetoothAdapter.getProfileProxy(this, object : BluetoothProfile.ServiceListener { + override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) { + if (profile == BluetoothProfile.A2DP) { + val connectedDevices = proxy.connectedDevices + if (connectedDevices.isNotEmpty()) { + MediaController.sendPause() + } + } + bluetoothAdapter.closeProfileProxy(profile, proxy) + } + + override fun onServiceDisconnected(profile: Int) {} + }, BluetoothProfile.A2DP) + HiddenApiBypass.invoke(BluetoothDevice::class.java, device, "disconnect") + isConnectedLocally = false + } fun sendPacket(packet: String) { val fromHex = packet.split(" ").map { it.toInt(16).toByte() } + if (!isConnectedLocally && CrossDevice.isAvailable) { + CrossDevice.sendRemotePacket(fromHex.toByteArray()) + return + } socket.outputStream?.write(fromHex.toByteArray()) socket.outputStream?.flush() } + + fun sendPacket(packet: ByteArray) { + if (!isConnectedLocally && CrossDevice.isAvailable) { + CrossDevice.sendRemotePacket(packet) + return + } + socket.outputStream?.write(packet) + socket.outputStream?.flush() + } fun setANCMode(mode: Int) { Log.d("AirPodsService", "setANCMode: $mode") when (mode) { 1 -> { - socket.outputStream?.write(Enums.NOISE_CANCELLATION_OFF.value) + sendPacket(Enums.NOISE_CANCELLATION_OFF.value) } 2 -> { - socket.outputStream?.write(Enums.NOISE_CANCELLATION_ON.value) + sendPacket(Enums.NOISE_CANCELLATION_ON.value) } 3 -> { - socket.outputStream?.write(Enums.NOISE_CANCELLATION_TRANSPARENCY.value) + sendPacket(Enums.NOISE_CANCELLATION_TRANSPARENCY.value) } 4 -> { - socket.outputStream?.write(Enums.NOISE_CANCELLATION_ADAPTIVE.value) + sendPacket(Enums.NOISE_CANCELLATION_ADAPTIVE.value) } } socket.outputStream?.flush() } fun setCAEnabled(enabled: Boolean) { - socket.outputStream?.write(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value) + sendPacket(if (enabled) Enums.SET_CONVERSATION_AWARENESS_ON.value else Enums.SET_CONVERSATION_AWARENESS_OFF.value) socket.outputStream?.flush() } fun setOffListeningMode(enabled: Boolean) { - socket.outputStream?.write(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)) + sendPacket(byteArrayOf(0x04, 0x00 ,0x04, 0x00, 0x09, 0x00, 0x34, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00)) socket.outputStream?.flush() } fun setAdaptiveStrength(strength: Int) { val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x2E, strength.toByte(), 0x00, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setPressSpeed(speed: Int) { // 0x00 = default, 0x01 = slower, 0x02 = slowest val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x17, speed.toByte(), 0x00, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setPressAndHoldDuration(speed: Int) { // 0 - default, 1 - slower, 2 - slowest val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x18, speed.toByte(), 0x00, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } @@ -723,25 +860,25 @@ class AirPodsService: Service() { // 0 - default, 1 - longer, 2 - longest val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x23, speed.toByte(), 0x00, 0x00, 0x00) Log.d("AirPodsService", "Setting volume swipe speed to $speed by packet ${bytes.joinToString(" ") { "%02X".format(it) }}") - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setNoiseCancellationWithOnePod(enabled: Boolean) { val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1B, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setVolumeControl(enabled: Boolean) { val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x25, if (enabled) 0x01 else 0x02, 0x00, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setToneVolume(volume: Int) { val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x09, 0x00, 0x1F, volume.toByte(), 0x50, 0x00, 0x00) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } @@ -754,7 +891,7 @@ class AirPodsService: Service() { fun setCaseChargingSounds(enabled: Boolean) { val bytes = byteArrayOf(0x12, 0x3a, 0x00, 0x01, 0x00, 0x08, if (enabled) 0x00 else 0x01) - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } @@ -763,16 +900,21 @@ class AirPodsService: Service() { } fun getBattery(): List { + if (!isConnectedLocally && CrossDevice.isAvailable) { + batteryNotification.setBattery(CrossDevice.batteryBytes) + } return batteryNotification.getBattery() } fun getANC(): Int { + if (!isConnectedLocally && CrossDevice.isAvailable) { + ancNotification.setStatus(CrossDevice.ancBytes) + } return ancNotification.status } fun disconnectAudio(context: Context, device: BluetoothDevice?) { val bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter - bluetoothAdapter?.getProfileProxy(context, object : BluetoothProfile.ServiceListener { override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) { if (profile == BluetoothProfile.A2DP) { @@ -850,7 +992,7 @@ class AirPodsService: Service() { val nameBytes = name.toByteArray() val bytes = byteArrayOf(0x04, 0x00, 0x04, 0x00, 0x1a, 0x00, 0x01, nameBytes.size.toByte(), 0x00) + nameBytes - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() val hex = bytes.joinToString(" ") { "%02X".format(it) } updateNotificationContent(true, name, batteryNotification.getBattery()) @@ -860,18 +1002,18 @@ class AirPodsService: Service() { fun setPVEnabled(enabled: Boolean) { var hex = "04 00 04 00 09 00 26 ${if (enabled) "01" else "02"} 00 00 00" var bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray() - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() hex = "04 00 04 00 17 00 00 00 10 00 12 00 08 E${if (enabled) "6" else "5"} 05 10 02 42 0B 08 50 10 02 1A 05 02 ${if (enabled) "32" else "00"} 00 00 00" bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray() - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun setLoudSoundReduction(enabled: Boolean) { val hex = "52 1B 00 0${if (enabled) "1" else "0"}" val bytes = hex.split(" ").map { it.toInt(16).toByte() }.toByteArray() - socket.outputStream?.write(bytes) + sendPacket(bytes) socket.outputStream?.flush() } fun findChangedIndex(oldArray: BooleanArray, newArray: BooleanArray): Int { diff --git a/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt b/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt new file mode 100644 index 0000000..b05af4b --- /dev/null +++ b/android/app/src/main/java/me/kavishdevar/aln/utils/CrossDevice.kt @@ -0,0 +1,120 @@ +package me.kavishdevar.aln.utils + +import android.annotation.SuppressLint +import android.bluetooth.BluetoothAdapter +import android.bluetooth.BluetoothManager +import android.bluetooth.BluetoothServerSocket +import android.bluetooth.BluetoothSocket +import android.content.Context +import android.util.Log +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import me.kavishdevar.aln.services.ServiceManager +import java.io.IOException +import java.util.UUID + +enum class CrossDevicePackets(val packet: ByteArray) { + AIRPODS_CONNECTED(byteArrayOf(0x00, 0x01, 0x00, 0x01)), + AIRPODS_DISCONNECTED(byteArrayOf(0x00, 0x01, 0x00, 0x00)), + REQUEST_DISCONNECT(byteArrayOf(0x00, 0x02, 0x00, 0x00)), + REQUEST_BATTERY_BYTES(byteArrayOf(0x00, 0x02, 0x00, 0x01)), + REQUEST_ANC_BYTES(byteArrayOf(0x00, 0x02, 0x00, 0x02)), + AIRPODS_DATA_HEADER(byteArrayOf(0x00, 0x04, 0x00, 0x01)), +} + +object CrossDevice { + private val uuid = UUID.fromString("1abbb9a4-10e4-4000-a75c-8953c5471342") + private var serverSocket: BluetoothServerSocket? = null + private var clientSocket: BluetoothSocket? = null + private lateinit var bluetoothAdapter: BluetoothAdapter + var isAvailable: Boolean = false // set to true when airpods are connected to another device + var batteryBytes: ByteArray = byteArrayOf() + var ancBytes: ByteArray = byteArrayOf() + + @SuppressLint("MissingPermission") + fun init(context: Context) { + Log.d("AirPodsQuickSwitchService", "Initializing CrossDevice") + this.bluetoothAdapter = context.getSystemService(BluetoothManager::class.java).adapter + startServer() + } + + @SuppressLint("MissingPermission") + fun startServer() { + serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord("AirPodsSwitch", uuid) + Log.d("AirPodsQuickSwitchService", "Server started") + CoroutineScope(Dispatchers.IO).launch { + while (serverSocket != null) { + try { + val socket = serverSocket!!.accept() + handleClientConnection(socket) + } catch (e: IOException) { + e.printStackTrace() + } + } + } + } + + fun setAirPodsConnected(connected: Boolean) { + if (connected) { + isAvailable = true + clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_CONNECTED.packet) + } else { + clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DISCONNECTED.packet) + } + } + + fun sendReceivedPacket(packet: ByteArray) { + Log.d("AirPodsQuickSwitchService", "Sending packet to remote device") + clientSocket?.outputStream?.write(CrossDevicePackets.AIRPODS_DATA_HEADER.packet + packet) + } + + private fun handleClientConnection(socket: BluetoothSocket) { + clientSocket = socket + val inputStream = socket.inputStream + val buffer = ByteArray(1024) + var bytes: Int + setAirPodsConnected(ServiceManager.getService()?.isConnectedLocally == true) + while (true) { + bytes = inputStream.read(buffer) + val packet = buffer.copyOf(bytes) + if (bytes == -1) { + break + } else if (packet.contentEquals(CrossDevicePackets.REQUEST_DISCONNECT.packet)) { + ServiceManager.getService()?.disconnect() + } else if (packet.contentEquals(CrossDevicePackets.AIRPODS_CONNECTED.packet)) { + isAvailable = true + } else if (packet.contentEquals(CrossDevicePackets.AIRPODS_DISCONNECTED.packet)) { + isAvailable = false + } else if (packet.contentEquals(CrossDevicePackets.REQUEST_BATTERY_BYTES.packet)) { + Log.d("AirPodsQuickSwitchService", "Received battery request, battery data: ${batteryBytes.joinToString("") { "%02x".format(it) }}") + sendRemotePacket(batteryBytes) + } else if (packet.contentEquals(CrossDevicePackets.REQUEST_ANC_BYTES.packet)) { + Log.d("AirPodsQuickSwitchService", "Received ANC request") + sendRemotePacket(ancBytes) + } + else { + if (ServiceManager.getService()?.isConnectedLocally == true) { + val packetInHex = packet.joinToString("") { "%02x".format(it) } + ServiceManager.getService()?.sendPacket(packetInHex) + } else if (ServiceManager.getService()?.batteryNotification?.isBatteryData(packet) == true) { + batteryBytes = packet + ServiceManager.getService()?.batteryNotification?.setBattery(packet) + ServiceManager.getService()?.updateBatteryWidget() + } else if (ServiceManager.getService()?.ancNotification?.isANCData(packet) == true) { + ServiceManager.getService()?.ancNotification?.setStatus(packet) + ancBytes = packet + } + } + } + } + + fun sendRemotePacket(byteArray: ByteArray) { + if (clientSocket == null) { + Log.d("AirPodsQuickSwitchService", "Client socket is null") + } + clientSocket?.outputStream?.write(byteArray) + clientSocket?.outputStream?.flush() + Log.d("AirPodsQuickSwitchService", "Sent packet to remote device") + } +} \ No newline at end of file diff --git a/linux/crossdevice.py b/linux/crossdevice.py new file mode 100644 index 0000000..8e6c32e --- /dev/null +++ b/linux/crossdevice.py @@ -0,0 +1,74 @@ +import bluetooth +import time +import threading + +# Bluetooth MAC address of the target device +TARGET_MAC = "22:22:F5:BB:1C:A0" # Replace with the actual MAC address +UUID = "1abbb9a4-10e4-4000-a75c-8953c5471342" + +# Define packets +PACKETS = { + "AIRPODS_CONNECTED": b"\x00\x01\x00\x01", + "AIRPODS_DISCONNECTED": b"\x00\x01\x00\x00", + "REQUEST_BATTERY_BYTES": b"\x00\x02\x00\x01", + "REQUEST_ANC_BYTES": b"\x00\x02\x00\x02", + "REQUEST_DISCONNECT": b"\x00\x02\x00\x00" +} + +def send_packet(sock, packet_name): + if packet_name in PACKETS: + packet = PACKETS[packet_name] + sock.send(packet) + print(f"Sent packet: {packet_name}") + else: + print(f"Packet {packet_name} not defined.") + +def listen_for_packets(sock): + try: + while True: + data = sock.recv(1024) + if data: + print(f"Received packet: {data}") + except Exception as e: + print(f"Error receiving data: {e}") + +def main(): + # Discover services to find the channel using the UUID + services = bluetooth.find_service(address=TARGET_MAC, uuid=UUID) + if len(services) == 0: + print(f"Could not find services for UUID {UUID}") + return + + # Use the first service found + service = services[0] + port = service["port"] + name = service["name"] + host = service["host"] + + print(f"Connecting to \"{name}\" on {host}, port {port}") + + # Create a Bluetooth socket + sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM) + sock.connect((host, port)) + print(f"Connected to {TARGET_MAC} on port {port}") + + # Start listening for packets in a background thread + listener_thread = threading.Thread(target=listen_for_packets, args=(sock,)) + listener_thread.daemon = True + listener_thread.start() + + try: + while True: + packet_name = input("Enter packet name to send (or 'exit' to quit): ") + if packet_name.lower() == "exit": + break + send_packet(sock, packet_name) + time.sleep(1) + except Exception as e: + print(f"Error: {e}") + finally: + sock.close() + print("Connection closed.") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/linux/main.cpp b/linux/main.cpp index fadaa15..498a8c4 100644 --- a/linux/main.cpp +++ b/linux/main.cpp @@ -24,6 +24,11 @@ #include #include #include +#include +#include +#include +#include +#include Q_LOGGING_CATEGORY(airpodsApp, "airpodsApp") @@ -266,8 +271,7 @@ public slots: file.close(); } } - -private slots: + private slots: void onTrayIconActivated(QSystemTrayIcon::ActivationReason reason) { if (reason == QSystemTrayIcon::Trigger) { LOG_INFO("Tray icon activated"); @@ -550,4 +554,5 @@ int main(int argc, char *argv[]) { return app.exec(); } + #include "main.moc" diff --git a/log.txt b/log.txt new file mode 100644 index 0000000..c0dc382 --- /dev/null +++ b/log.txt @@ -0,0 +1,313 @@ +--------- beginning of main +01-18 01:36:57.299 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:36:57.299 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:36:57.331 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:57.331 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:57.608 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -67 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:57.608 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -67 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:57.761 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:36:57.761 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:36:57.882 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:57.882 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.158 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.158 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.391 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -98 | 12 02 00 03 +01-18 01:36:58.391 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -98 | 12 02 00 03 +01-18 01:36:58.428 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:36:58.428 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:36:58.437 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.438 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.720 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.720 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.992 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:58.992 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.271 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.271 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.301 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:36:59.301 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:36:59.551 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.552 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.763 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:36:59.764 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:36:59.829 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:36:59.829 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.112 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.112 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.378 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.379 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.395 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:00.396 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:00.653 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:00.654 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:01.311 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:01.311 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:01.744 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:01.744 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:01.762 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:37:01.762 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:37:02.018 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.018 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.290 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.290 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.440 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:02.440 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:02.560 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.560 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.833 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:02.833 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.105 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.105 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.409 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.409 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.661 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.662 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.769 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:03.769 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:03.941 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:03.941 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:04.433 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:04.433 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:04.447 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:04.448 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:04.758 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:04.758 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.039 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.039 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.299 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.299 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.319 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -50 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:05.320 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -50 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:05.572 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.573 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.763 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:05.763 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:05.853 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:05.853 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.121 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.121 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.404 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.405 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.434 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:06.434 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:06.446 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:06.447 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:06.676 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.676 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.949 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:06.949 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:07.224 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:07.225 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:07.771 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03 +01-18 01:37:07.772 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03 +01-18 01:37:07.777 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:07.777 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.057 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.057 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.333 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.334 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.442 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:08.444 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:08.450 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:08.451 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:08.612 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.612 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.886 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:08.887 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:09.161 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:09.161 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:09.322 13709 13774 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:09.323 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:09.767 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:37:09.767 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -60 | 12 02 00 03 +01-18 01:37:09.985 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:09.985 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:10.260 13709 13774 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:10.260 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:10.450 13709 13774 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:10.450 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:10.455 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:10.455 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:11.093 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.093 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.330 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:11.330 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:11.369 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.369 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.644 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.644 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.769 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:11.769 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:11.912 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:11.913 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:12.195 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:12.195 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:12.456 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:12.457 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:12.482 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:12.483 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:13.777 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:13.777 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:14.399 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:14.399 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:14.460 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -87 | 12 02 00 03 +01-18 01:37:14.461 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -87 | 12 02 00 03 +01-18 01:37:14.462 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:14.462 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:14.678 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:14.678 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:14.949 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:14.949 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:15.493 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:15.493 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:15.772 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:15.772 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:16.463 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:16.464 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:16.470 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:16.470 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:16.878 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:16.878 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.155 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.155 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.427 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.427 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.700 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.700 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:17.775 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:17.775 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -61 | 12 02 00 03 +01-18 01:37:18.250 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:18.251 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:18.473 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -94 | 12 02 00 03 +01-18 01:37:18.473 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -94 | 12 02 00 03 +01-18 01:37:18.480 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:18.481 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:18.517 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:18.517 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:18.790 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:18.790 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:19.065 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:19.065 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.165 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.166 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.447 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.448 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.473 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -97 | 12 02 00 03 +01-18 01:37:20.473 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -97 | 12 02 00 03 +01-18 01:37:20.477 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:20.478 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:20.726 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:20.726 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:21.283 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:21.283 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:21.353 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:21.353 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:21.781 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03 +01-18 01:37:21.781 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -58 | 12 02 00 03 +01-18 01:37:22.103 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:22.103 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:22.376 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:22.376 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:22.483 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:22.484 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -89 | 12 02 00 03 +01-18 01:37:22.486 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:22.486 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -64 | 12 02 00 02 +01-18 01:37:22.656 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:22.656 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.209 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.210 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.363 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:23.363 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -54 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:23.483 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.483 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.759 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.759 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:23.783 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:23.783 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:24.038 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:24.038 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:24.324 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:24.324 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:24.486 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -65 | 12 02 00 02 +01-18 01:37:24.486 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -65 | 12 02 00 02 +01-18 01:37:24.861 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:24.862 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:25.365 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:25.366 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:25.411 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:25.412 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:25.783 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:25.783 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:26.782 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:26.782 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.053 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.054 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.328 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.328 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.376 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:27.376 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:27.803 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:27.804 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -62 | 12 02 00 03 +01-18 01:37:27.887 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:27.890 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.147 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.147 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.435 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.436 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.498 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:28.498 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -88 | 12 02 00 03 +01-18 01:37:28.508 13709 13778 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:28.508 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:28.697 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.697 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.967 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:28.967 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:29.382 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:29.383 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -52 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:29.793 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:29.793 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -59 | 12 02 00 03 +01-18 01:37:30.070 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:30.070 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:30.514 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:30.514 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:30.527 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -96 | 12 02 00 03 +01-18 01:37:30.527 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -96 | 12 02 00 03 +01-18 01:37:30.621 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:30.621 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:30.899 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:30.899 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.162 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.162 13709 13778 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -62 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.389 13709 13778 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:31.390 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:31.442 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.442 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.787 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03 +01-18 01:37:31.787 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03 +01-18 01:37:31.991 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:31.991 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -65 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:32.269 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:32.269 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:33.392 13709 13784 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:33.393 13709 13777 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -51 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:33.642 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:33.642 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:33.791 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03 +01-18 01:37:33.791 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -64 | 12 02 00 03 +01-18 01:37:33.915 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:33.916 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -64 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.189 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.189 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.470 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.470 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.525 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:34.525 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from DF:B6:BA:2A:BE:07 | -63 | 12 02 00 02 +01-18 01:37:34.539 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -90 | 12 02 00 03 +01-18 01:37:34.539 13709 13784 D AirPodsBLEService: Received broadcast of size 4 from D7:1A:73:FA:66:AC | -90 | 12 02 00 03 +01-18 01:37:34.752 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:34.753 13709 13784 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:35.296 13709 13777 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:35.296 13709 13776 D AirPodsBLEService: Received broadcast of size 25 from 6E:74:A9:28:8F:7D | -63 | 10 06 1E 1E C5 8A 58 7B 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 +01-18 01:37:35.400 13709 13776 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:35.400 13709 13777 D AirPodsBLEService: Received broadcast of size 23 from E1:2E:99:8C:E2:A5 | -53 | 12 02 E0 01 07 11 06 95 1D 5C 38 BB EA 94 B9 17 2A 68 D6 94 3E D7 03 +01-18 01:37:35.800 13709 13776 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -63 | 12 02 00 03 +01-18 01:37:35.801 13709 13777 D AirPodsBLEService: Received broadcast of size 4 from 38:FC:FE:68:19:DC | -63 | 12 02 00 03 diff --git a/root-module-manual/META-INF/com/google/android/update-binary b/root-module-manual/META-INF/com/google/android/update-binary new file mode 100644 index 0000000..ea4889e --- /dev/null +++ b/root-module-manual/META-INF/com/google/android/update-binary @@ -0,0 +1,33 @@ +#!/sbin/sh + +################# +# Initialization +################# + +umask 022 + +# echo before loading util_functions +ui_print() { echo "$1"; } + +require_new_magisk() { + ui_print "*******************************" + ui_print " Please install Magisk v20.4+! " + ui_print "*******************************" + exit 1 +} + +######################### +# Load util_functions.sh +######################### + +OUTFD=$2 +ZIPFILE=$3 + +mount /data 2>/dev/null + +[ -f /data/adb/magisk/util_functions.sh ] || require_new_magisk +. /data/adb/magisk/util_functions.sh +[ $MAGISK_VER_CODE -lt 20400 ] && require_new_magisk + +install_module +exit 0 \ No newline at end of file diff --git a/root-module-manual/META-INF/com/google/android/updater-script b/root-module-manual/META-INF/com/google/android/updater-script new file mode 100644 index 0000000..11d5c96 --- /dev/null +++ b/root-module-manual/META-INF/com/google/android/updater-script @@ -0,0 +1 @@ +#MAGISK diff --git a/root-module-manual/btl2capfix.zip b/root-module-manual/btl2capfix.zip new file mode 100644 index 0000000..c61433a Binary files /dev/null and b/root-module-manual/btl2capfix.zip differ diff --git a/root-module-manual/module.prop b/root-module-manual/module.prop new file mode 100644 index 0000000..616d101 --- /dev/null +++ b/root-module-manual/module.prop @@ -0,0 +1,6 @@ +id=btl2capfix +name=Bluetooth L2CAP workaround for AirPods +version=v1 +versionCode=1 +author=kavishdevar +description=Fixes the Bluetooth L2CAP connection issue with AirPods \ No newline at end of file diff --git a/wak.toml b/wak.toml new file mode 100644 index 0000000..27cb795 --- /dev/null +++ b/wak.toml @@ -0,0 +1,15 @@ +# https://github.com/iamawatermelo/wakapi-anyide v0.6.8 + +[meta] +version = 1 +watchers = ['files'] + +[files] +include = ["*"] # files to include in tracking +exclude = [] # files to exclude in tracking +exclude_files = [".gitignore"] # files whose contents will be used to exclude other files from tracking +exclude_binary_files = true # whether to ignore binary files +# language_mapping = {".kicad_sch" = "Kicad Schematic"} # custom language mapping + +[project] +name = "AirPodsLikeNormal" # your project name \ No newline at end of file