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