GrowSpace
UWB N1

Android

2026년 09월 22일

이 글에서는

GrowSpace Android SDK는 BLE 및 UWB 기반 실내 위치 기술을 Android 앱에 간편하게 통합할 수 있도록 설계된 개발 키트입니다. 거리 측정(Ranging)부터 RTLS 위치 추정까지 모두 하나의 클래스(SpaceUwb)로 제어할 수 있습니다.

주요 기능

  • BLE + UWB 거리 측정 (Ranging)
  • RTLS 기반 위치 추정 (x, y, z 계산)
  • 실시간 장치 연결 / 해제 이벤트 제공

설치하기

Gradle 설정

dependencies {
    implementation("io.github.freegrowenterprise:SpaceSDK-Android:0.0.9")
}

Android 권한 설정 (AndroidManifest.xml)

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.UWB_RANGING" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

요구 사항

항목조건
Android OSAndroid 14 (API 34) 이상
언어Kotlin 1.9.22 (권장)
디바이스UWB 지원 Android 스마트폰
하드웨어GrowSpace UWB 제품군 (태그/앵커)

초기화

val spaceUwb = SpaceUwb(context = applicationContext, activity = this)

거리 측정 시작

spaceUwb.startUwbRanging(
    maximumConnectionCount = 4,
    replacementDistanceThreshold = 8f,
    isConnectStrongestSignalFirst = true,
    onUpdate = { result ->
        Log.d("UWB", "device=${result.deviceName}, distance=${result.distance}m")
    },
    onDisconnect = { device ->
        Log.w("UWB", "Disconnected from ${device.deviceName}")
    }
)

거리 측정 중지

spaceUwb.stopUwbRanging { result ->
    if (result.isSuccess) {
        Log.i("UWB", "Ranging stopped")
    } else {
        Log.e("UWB", "Stop failed: ${result.exceptionOrNull()?.message}")
    }
}

RTLS 위치 추정 시작

val anchorMap = mapOf(
    "FGU-0001" to Triple(0.0, 0.0, 0.0),
    "FGU-0002" to Triple(5.0, 0.0, 0.0),
    "FGU-0003" to Triple(0.0, 5.0, 0.0)
)

spaceUwb.startUwbRtls(
    anchorPositionMap = anchorMap,
    zCorrection = 1.0f,
    maximumConnectionCount = 4,
    replacementDistanceThreshold = 8f,
    isConnectStrongestSignalFirst = true,
    filterType = RtlsFilterType.AVERAGE,
    onResult = { location ->
        Log.d("RTLS", "x=${location.x}, y=${location.y}, z=${location.z}")
    },
    onFail = { error ->
        Log.e("RTLS", "Positioning failed: $error")
    },
    onDeviceRanging = { map ->
        map.forEach { (id, dist) ->
            Log.d("RTLS", "$id = $dist m")
        }
    }
)

배터리 정보 (추가 예정)

spaceUwb.battery { battery ->
    Log.i("Battery", "battery: $battery")
}

테스트 앱

공식 테스트 앱을 통해 SDK 기능을 손쉽게 검증할 수 있습니다.

PDF로 내려받아 현장에서 보세요