모바일 앱(안드로이드)

디버그 모드에서 가짜 Bluetooth 스캔 결과 시뮬레이션하기

Billcorea 2024. 9. 17. 15:14
반응형

디버그 모드에서 가짜 Bluetooth 스캔 결과 시뮬레이션하기

블루투스 스캔 결과 모방 하기

 
안드로이드 개발 중 Bluetooth 기능을 테스트할 때, 실제 장치가 없거나 테스트 환경을 조작하고 싶을 때가 있습니다. 이 글에서는 no.nordicsemi.android.support.v18.scanner.ScanCallback을 사용하여 디버그 모드에서 가짜 Bluetooth 스캔 결과를 시뮬레이션하는 방법을 소개합니다.

1. Mock 데이터 생성

먼저, ScanResult와 ScanRecord를 포함한 Mock 데이터를 생성합니다.

Kotlin
 
import no.nordicsemi.android.support.v18.scanner.ScanCallback
import no.nordicsemi.android.support.v18.scanner.ScanResult
import android.bluetooth.BluetoothDevice
import android.bluetooth.le.ScanRecord
import java.lang.reflect.Constructor

// Mock BluetoothDevice 생성
fun createMockBluetoothDevice(address: String, name: String): BluetoothDevice {
    val constructor = BluetoothDevice::class.java.getDeclaredConstructor(String::class.java)
    constructor.isAccessible = true
    val device = constructor.newInstance(address)
    val nameField = BluetoothDevice::class.java.getDeclaredField("mName")
    nameField.isAccessible = true
    nameField.set(device, name)
    return device
}

// Mock ScanRecord 생성
fun createMockScanRecord(): ScanRecord? {
    return try {
        val constructor: Constructor<ScanRecord> = ScanRecord::class.java.getDeclaredConstructor(
            ByteArray::class.java, // 광고 데이터
            ByteArray::class.java, // 스캔 응답 데이터
            List::class.java, // 서비스 UUIDs
            Int::class.javaPrimitiveType, // 광고 플래그
            Int::class.javaPrimitiveType, // TxPowerLevel
            String::class.java, // Device Name
            Int::class.javaPrimitiveType // Manufacturer Specific Data
        )
        constructor.isAccessible = true
        constructor.newInstance(
            byteArrayOf(0x02, 0x01, 0x06), // 광고 데이터
            byteArrayOf(0x09, 0x09, 0x4D, 0x6F, 0x63, 0x6B, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65), // 스캔 응답 데이터
            listOf(), // 서비스 UUIDs
            -1, // 광고 플래그
            0, // TxPowerLevel
            "Mock Device", // Device Name
            0 // Manufacturer Specific Data
        )
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

// Mock ScanResult 생성
fun createMockScanResult(): ScanResult {
    val mockDevice = createMockBluetoothDevice("00:11:22:33:44:55", "Mock Device")
    val mockScanRecord = createMockScanRecord()
    return ScanResult(mockDevice, mockScanRecord, 0, System.nanoTime())
}
AI가 생성한 코드입니다. 신중하게 검토하고 사용하세요. FAQ의 자세한 정보.

2. ScanCallback 설정

이제 ScanCallback을 설정하고, Mock 데이터를 사용하여 콜백을 호출합니다.

Kotlin
 
val mockScanResult = createMockScanResult()

val scanCallback = object : ScanCallback() {
    override fun onScanResult(callbackType: Int, result: ScanResult) {
        super.onScanResult(callbackType, mockScanResult)
        // 결과 처리
    }

    override fun onBatchScanResults(results: List<ScanResult>) {
        super.onBatchScanResults(listOf(mockScanResult))
        // 결과 처리
    }

    override fun onScanFailed(errorCode: Int) {
        super.onScanFailed(errorCode)
        // 오류 처리
    }
}

// 디버그 모드에서 Mock 데이터로 콜백 호출
scanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, mockScanResult)
AI가 생성한 코드입니다. 신중하게 검토하고 사용하세요. FAQ의 자세한 정보.

이 코드를 사용하면 디버그 모드에서 no.nordicsemi.android.support.v18.scanner.ScanCallback을 가짜로 만들어 테스트할 수 있습니다. 이를 통해 실제 장치 없이도 Bluetooth 기능을 테스트하고 디버깅할 수 있습니다.


이 블로그 게시물이 도움이 되길 바랍니다! 추가로 궁금한 점이 있으면 언제든지 물어보세요. 😊


...
하지만 실제 코딩에서는 진척이 없습니다.  읽어 주셔서 감사합니다.

반응형