Bluetooth
주변의 Bluetooth Low Energy 기기를 검색하고, 신호 강도 및 광고 데이터를 확인하며, GATT 서비스와 특성을 탐색하고, 연결된 주변기기의 실시간 데이터를 볼 수 있습니다.
개요
Bluetooth 도구는 Apple의 CoreBluetooth 프레임워크를 사용하여 BLE(Bluetooth Low Energy) 중앙 장치로 작동하며 주변 기기를 검색합니다. 발견된 모든 기기를 실시간 신호 강도(RSSI), 광고 데이터, 연결 상태와 함께 표시합니다. 연결 가능한 주변기기에 연결하여 GATT 서비스와 특성을 탐색하고, 값을 읽고, 알림을 구독하며, 제조사 데이터를 검사할 수 있습니다.
목차
개요 화면
개요 화면은 Bluetooth 도구의 메인 화면입니다. 검색 바, 스캔 컨트롤이 있는 상태 카드, 발견된 기기의 스크롤 가능한 목록이 포함되어 있습니다.
검색 바
화면 상단의 텍스트 필드로 이름별로 기기 목록을 필터링합니다. 검색어를 입력하면 광고된 이름 또는 주변기기 이름에 검색 텍스트가 포함된 기기만 즉시 표시됩니다(대소문자 구분 안 함). 필드가 비어 있지 않으면 지우기 버튼이 나타납니다.
Bluetooth 상태 카드
상태 카드에 표시되는 내용:
- Bluetooth 상태 라벨과 현재 라디오 상태(색상으로 구분):
- Powered On(녹색) — Bluetooth가 활성화되어 스캔 준비가 완료됨.
- Powered Off(빨간색) — Bluetooth 라디오가 꺼져 있음.
- Unauthorized(주황색) — 사용자가 앱에 대한 Bluetooth 권한을 거부함.
- Unsupported(빨간색) — 기기 하드웨어가 Bluetooth를 지원하지 않음.
- Unknown / Resetting(회색) — 시스템이 아직 Bluetooth 상태를 확인 중임.
- 스캔 컨트롤 버튼(Bluetooth가 Powered On일 때만 표시):
- Stop Scanning(빨간색) — 활성 스캔을 중지함.
- Start Scanning(녹색) — 주변기기 스캔을 시작함.
도구를 열고 Bluetooth가 켜져 있으면 자동으로 스캔이 시작됩니다.
기기 목록
발견된 기기는 스크롤 가능한 목록에 RSSI순으로 정렬되어 표시됩니다(신호가 강한 순서). 새 기기가 발견되거나 기존 기기의 광고 데이터가 업데이트되면 목록이 실시간으로 갱신됩니다.
기기 행
각 기기는 다음 내용이 포함된 카드로 표시됩니다:
- 원형 배지 안의 Bluetooth 아이콘. 흰색 호가 원 위에 오버레이되어 기기의 신호 강도에 비례하여 채워집니다(0–100%).
- 기기 이름 — 광고된 로컬 이름 또는 주변기기 이름. 이름을 브로드캐스트하지 않는 기기는
[No Name]으로 표시됩니다. - RSSI — dB 단위의 수신 신호 강도(예:
RSSI: -43 dB). - 왼쪽 하단의 상태 표시기, 다음 중 하나를 표시:
- Connected(녹색) — 기기가 현재 연결되어 있음.
- Connectable(파란색) — 기기가 연결을 수락한다고 광고함.
- Services: N — 기기가 광고하는 GATT 서비스 수(서비스가 있지만 아직 연결되지 않은 경우 표시).
- (라벨 없음) — 기기가 연결 가능하지 않고 서비스를 광고하지 않음.
- 오른쪽의 후행 표시기:
- 기기가 연결되어 있으면 녹색 체크마크 아이콘.
- 기기가 연결 가능하면 쉐브론(
>)(탭하여 상세 정보 열기). - 기기가 연결을 수락하지 않으면 Not Connectable 텍스트.
기기 행을 탭하면 기기 상세 화면으로 이동합니다.
빈 상태
개요에는 상황에 맞는 빈 상태가 표시됩니다:
- Scanning — 초기 스캔이 진행 중이고 아직 기기가 발견되지 않았을 때 로딩 애니메이션이 있는 돋보기 아이콘.
- Bluetooth Off / Unsupported — 현재 상태와 Bluetooth를 활성화하라는 안내가 있는 슬래시된 Bluetooth 아이콘.
- Scanning Stopped — Bluetooth가 켜져 있지만 수동으로 스캔을 중지했고 목록에 기기가 없을 때 Start Scanning 버튼이 있는 Bluetooth 아이콘.
기기 상세 화면
기기 행을 탭하면 전용 상세 화면이 열립니다. 화면은 헤더 영역, 신호 강도 게이지, 세 개의 콘텐츠 탭으로 나뉩니다.
헤더 및 연결
헤더에 포함된 내용:
- 개요 화면으로 돌아가는 뒤로 버튼(
< Devices). - 눈에 띄게 표시되는 기기 이름.
- 연결 상태 표시기 — 라벨 옆의 색상 점:
- Connected(녹색)
- Connecting(주황색)
- Disconnected(빨간색)
- Disconnecting(주황색)
- Connect / Disconnect 버튼(연결 가능한 기기에만 표시):
- Connect(파란색) — BLE 연결을 시작함. 연결이 설정되는 동안 로딩 스피너가 표시됩니다.
- Connecting...(파란색, 비활성화) — 연결 시도 중에 표시됨.
- Disconnect(빨간색) — 활성 연결을 종료함.
연결이 설 정되면 도구가 자동으로 모든 GATT 서비스와 해당 특성을 검색합니다. 읽기 가능한 특성은 즉시 읽히고, 알림을 지원하는 특성은 자동으로 구독됩니다.
신호 강도 게이지
신호 강도 섹션은 기기의 무선 신호에 대한 상세한 실시간 보기를 제공합니다:
-
원형 게이지 — 각도 그라데이션(빨간색에서 주황색, 노란색, 녹색으로)으로 0%에서 100%까지 채워지는 호. 현재 dBm 단위의 RSSI 값이 중앙에 표시됩니다.
-
대략적인 거리 — RSSI 값에서 파생된 사람이 읽을 수 있는 추정치:
RSSI 범위 라벨 -30 ~ -50 dBm Very Close -51 ~ -65 dBm Close -66 ~ -80 dBm Medium -81 ~ -90 dBm Far -90 dBm 미만 Very Far -
신호 바 — 신호 강도 백분율에 따라 채워지는 5개 바 표시기.
-
신호 품질 — 텍스트 라벨: Excellent (>80%), Good (>60%), Fair (>40%), Poor (>20%), 또는 Very Poor (<=20%).
-
RSSI — dBm 단위의 원시 값.
-
TX Power — 기기가 광고하는 경우 dBm 단위의 전송 전력 수준. 이 값은 송신기에서 1미터 거리의 신호 강도를 나타내며 거리 추정에 사용할 수 있습니다.
-
Signal History — 마지막 20개 RSSI 측정값의 롤링 바 차트, 색상으로 구분(녹색 >= -60, 노란색 >= -75, 빨간색 < -75). 시간에 따른 신호 안정성을 시각화하는 데 도움이 됩니다.
정보 탭
정보 탭에는 키-값 행으로 구성된 기기에 대한 일반 정보가 표시됩니다:
| 필드 | 설명 |
|---|---|
| Name | 광고된 이름 또는 주변기기 이름(또는 [No Name]). |
| Identifier | CoreBluetooth에서 할당한 주변기기의 UUID. 이것은 로컬 식별자이며 기기의 실제 MAC 주소가 아닙니다. |
| RSSI | 현재 dB 단위의 수신 신호 강도. |
| TX Power | dBm 단위의 전송 전력(기기가 광고하는 경우에만 표시). |
| Connectable | 기기가 BLE 연결을 수락하는지 여부(Yes / No). |
| State | 현재 연결 상태(Connected, Connecting, Disconnected, Disconnecting). |
| Discovered | 이 스캔 세션 중 기기가 처음 발견된 타임스탬프. |
| Last Updated | 가장 최근 광고 또는 RSSI 업데이트의 타임스탬프. |
키-값 행 아래에 기기가 해당 데이터를 제공하면 두 개의 추가 섹션이 나타납니다:
- Advertised Services — 기기가 광고 패킷에 포함하는 GATT 서비스 UUID 목록. 알려진 표준 서비스는 UUID 옆에 사람이 읽을 수 있는 이름으로 표시됩니다(예:
180F (Battery Service),180A (Device Information)). 전체 목록은 인식된 서비스를 참조하세요. - Manufacturer Data — 광고의 원시 제조사별 데이터, 16진수 문자열로 표시. 처음 두 바이트는 Bluetooth SIG 회사 식별자를 인코딩합니다(리틀 엔디안).
서비스 탭
서비스 탭은 기기가 연결된 경우에만 사용할 수 있습니다. 연결 중 발견된 전체 GATT 서비스 및 특성 트리를 보여줍니다.
각 서비스는 확장 가능한 행으로 표시됩니다:
- 서비스 카테고리를 나타내는 색상 아이콘:
- 파란색 — 일반 서비스(Generic Access
1800, Generic Attribute1801) - 녹색 — Battery Service(
180F) - 주황색 — Device Information(
180A) - 보라색 — 벤더별 서비스(
FE로 시작하는 UUID) - 회색 — 기타 / 알 수 없는 서비스
- 파란색 — 일반 서비스(Generic Access
- 서비스 이름(알려진 서비스의 경우 UUID에서 확인) 및 원시 UUID 문자열.
- 해당 서비스에 속한 특성 수를 보여주는 배지.
- 서비스가 확장되면 회전하는 쉐브론.
인식된 서비스
| UUID | 서비스 이름 |
|---|---|
1800 | Generic Access |
1801 | Generic Attribute |
180A | Device Information |
180F | Battery Service |
1812 | HID (Human Interface Device) |
1813 | Scan Parameters |
1819 | Location and Navigation |
181C | User Data |
FE59 | Apple Notification Center |
서비스를 확장하면 특성이 표시됩니다. 각 특성 행에는 다음이 표시됩니다:
- 기본 속성에 따른 색상 아이콘(읽기+쓰기는 보라색, 읽기 전용은 파란색, 쓰기 전용은 녹색, 알림 전용은 주황색, 그 외는 회색).
- 특성 이름(알려진 GATT 특성의 경우 UUID에서 확인) 및 원시 UUID 문자열.
- 속성 필 — 지원되는 각 속성에 대한 작은 색상 코드 라벨:
- Read(파란색) — 값을 요청 시 읽을 수 있음.
- Write(녹색) — 확인과 함께 값을 쓸 수 있음.
- Write No Response(연한 녹색) — 확인 없이 값을 쓸 수 있음.
- Notify(주황색) — 특성이 중앙 장치에 업데이트를 푸시할 수 있음.
- Indicate(연한 주황색) — Notify와 유사하지만 확인이 있음.
- Auth(보라색) — 특성이 인증된 서명 쓰기를 요구함.
- 눈 토글 버튼(특성에 값이 있는 경우 표시). 탭하면 특성의 현재 값이 여러 형식으로 표시됩니다:
- Hex — 원시 바이트 시퀀스.
- String — 바이트가 유효한 텍스트를 형성하는 경우 UTF-8 해석.
- Numeric — 바이트 길이에 따른 자동 해석:
- 1바이트: UInt8 값
- 2바이트: UInt16 값
- 4바이트: UInt32 값 및 Float 값
인식된 특성
| UUID | 특성 이름 |
|---|---|
2A00 | Device Name |
2A01 | Appearance |
2A04 | Peripheral Preferred Connection Parameters |
2A05 | Service Changed |
2A19 | Battery Level |
2A23 | System ID |
2A24 | Model Number String |
2A25 | Serial Number String |
2A26 | Firmware Revision String |
2A27 | Hardware Revision String |
2A28 | Software Revision String |
2A29 | Manufacturer Name String |
2A2A | IEEE 11073-20601 Regulatory Certification Data List |
2A50 | PnP ID |
데이터 탭
데이터 탭은 연결된 기기의 실시간 해석 데이터를 보여줍니다. 기기가 연결되어 있지 않으면 Connect 버튼(연결 가능한 기기의 경우) 또는 안내 메시지가 있는 프롬프트가 표시됩니다.
연결되면 탭에 최대 세 개의 카드가 표시됩니다:
-
Manufacturer Data — 제조사별 광고 페이로드:
- Manufacturer ID — 제조사 데이터의 처음 두 바이트(리틀 엔디안)에서 확인. 알려진 ID에는 Apple(
0x004C), Microsoft(0x0006), Samsung(0x0075), Xiaomi(0x038F), Bosch(0x01D7)가 포함됩니다. 알 수 없는 ID는 16진수로 표시됩니다(예:ID: 0x1234). - Raw Data — 제조사 데이터 바이트의 전체 16진수 덤프.
- Byte visualization — 각 바가 하나의 바이트를 나타내는 수평 바 차트. 바 높이는 바이트 값(0–255)에 비례하여 데이터의 빠른 시각적 지문을 제공합니다.
- Manufacturer ID — 제조사 데이터의 처음 두 바이트(리틀 엔디안)에서 확인. 알려진 ID에는 Apple(
-
Characteristic Values — 읽을 수 있는 값이 있는 모든 특성 목록. 각 항목에는 다음이 표시됩니다:
- 특성 이름(알 수 없는 경우 UUID).
- 해석된 값(데이터 길이에 따라 byte, UInt16, UInt32/Float, UTF-8 문자열 또는 hex).
- 최대 8바이트 값에 대한 작은 바이트 바 차트, 크기에 따라 색상으로 구분(파란색 < 30%, 녹색 < 60%, 노란색 < 80%, 빨간색 >= 80%).
- 알림을 지원하는 특성의 경우 값이 자동으로 업데이트됩니다.
-
Connection Info — 타이밍 및 신호 메타데이터:
- Discovered — 기기가 처음 발견된 시간, 발견 이후 경과 시간.
- Last Update — 가장 최근 데이터 업데이트 시간, 가능한 경우 TX Power 포함.
권한 및 요구 사항
- Bluetooth 권한 — CoreBluetooth는 사용자가 Bluetooth 접근 권한을 부여해야 합니다. 권한이 거부된 경우, Lirum은 사용자가 접근 권한을 다시 활성화할 수 있도록 iOS 설정을 여는 버튼이 있는 권한 화면을 표시합니다.
- Bluetooth 라디오 — Bluetooth가 꺼져 있으면 도구는 접근 가능하지만 스캔 컨트롤이 비활성화되고 Bluetooth를 켜라는 빈 상태가 표시됩니다. 이 경우 권한 게이트는 표시되지 않습니다.
- Bluetooth 권한은 시스템에서 관리됩니다. 명시적인 "권한 요청" 버튼은 없습니다. CoreBluetooth가 처음 초기화될 때 시스템 프롬프트가 자동으로 나타납니다.
기술 세부 정보
- 이 도구는
CBCentralManager를 사용하여 BLE Central로 작동합니다. 모든 주변기기를 스캔하며(scanForPeripherals(withServices: nil)), 광고하는 서비스에 관계없이 기기를 발견합니다. - RSSI(수신 신호 강도 표시기) 값은 일반적으로 -30 dBm(매우 강함, 기기가 매우 가까움)에서 -100 dBm(매우 약함, 기기가 멀거나 장애물이 있음)까지 범위입니다. 도구는 다음 공식을 사용하여 이 범위를 0–100% 스케일로 정규화합니다:
(RSSI + 100) / 70. - 연결된 기기의 경우 RSSI는
readRSSI()를 사용하여 2초마다 폴링됩니다. 노이즈 필터가 시각적 지터를 줄이기 위해 2 dB 미만의 업데이트를 억제합니다. - 연결 시 도구는
discoverServices(nil)을 호출하여 모든 GATT 서비스를 열거한 다음 각 서비스에 대해discoverCharacteristics(nil, for:)를 호출합니다. 읽기 가능한 특성은readValue(for:)를 통해 자동으로 읽히고, 알림 가능한 특성은setNotifyValue(true, for:)를 통해 구독됩니다. - TX Power(
CBAdvertisementDataTxPowerLevelKey)는 송신기에서 1미터 거리의 신호 강도를 나타냅니다. TX Power와 RSSI가 모두 알려진 경우 그 차이를 사용하여 경로 손실과 대략적인 거리를 추정할 수 있습니다. - Manufacturer Data(
CBAdvertisementDataManufacturerDataKey)는 Bluetooth SIG 형식을 따릅니다: 처음 두 바이트는 리틀 엔디안 순서의 회사 식별자이고, 그 뒤에 벤더별 페이로드 바이트가 옵니다. - 정보 탭에 표시되는 주변기기 식별자는 로컬 기기에서 CoreBluetooth가 할당한 UUID입니다. 동일한 기기에 대해 앱 실행 간에 안정적이지만 실제 Bluetooth MAC 주소는 아닙니다(iOS에서 노출하지 않음).
주의 사항 및 제한 사항
- 볼 수 있는 내용은 각 주변기기가 광고하는 내용과 iOS가 CoreBluetooth를 통해 노출하는 내용에 따라 달라집니다. 일부 기기는 최소한의 데이터만 광고합니다.
- 많은 기기가 광고 패킷에 로컬 이름을 포함하지 않기 때문에
[No Name]으로 표시됩니다. - 대략적인 거리 추정치는 RSSI 임계값을 기반으로 한 대략적인 지침입니다. 실제 거리는 환경, 장애물, 안테나 방향, 전송 전력에 따라 크게 달라집니다.
- 모든 연결 가능한 기기가 성공적으로 연결되는 것은 아닙니다. 일부는 iOS 설정을 통한 사전 페어링이 필요하고, 일부는 알 수 없는 중앙 장치의 연결을 거부할 수 있습니다.
- Classic Bluetooth 기기(비 BLE)는 CoreBluetooth를 통해 보이지 않으며 스캔 결과에 나타나지 않습니다.
- RSSI 값은 다중 경로 간섭, 신체 흡수, 기타 환경적 요인으로 인해 빠르게 변동할 수 있습니다. 신호 히스토리 차트는 이러한 변동을 시각적으로 부드럽게 하는 데 도움이 됩니다.
문제 해결
- 기기를 찾을 수 없음 — Bluetooth가 켜져 있는지 확인하고, Bluetooth 화면에 몇 초간 머무르며, 스캔이 중지된 경우 Start Scanning을 탭하세요.
- 권한 거부됨 — 권한 화면에서 Open Settings 버튼을 탭하고 iOS 개인정보 설정에서 Lirum에 대한 Bluetooth 접근을 다시 활성화하세요.
- 연결 실패 — 기기가 먼저 iOS 설정에서 페어링이 필요하거나, 타사 앱의 연결을 지원하지 않거나, 범위를 벗어났을 수 있습니다.
- 서비스 탭이 비어 있음 — 일부 기기는 서비스를 노출하지 않거나 서비스 검색을 지연합니다. 연결 후 몇 초 기다리세요. 서비스가 나타나지 않으면 기기가 표준 GATT 프로필을 지원하지 않을 수 있습니다.
- 특성 값이 hex로만 표시됨 — 도구는 값을 UTF-8 텍스트와 일반적인 숫자 유형으로 해석하려고 시도합니다. 이러한 해석이 적용되지 않으면 원시 16진수 덤프가 표시됩니다.