Bluetooth
Scan for nearby Bluetooth Low Energy devices, inspect signal strength and advertisement data, browse GATT services and characteristics, and view live data from connected peripherals.
Overview
The Bluetooth tool uses Apple's CoreBluetooth framework to act as a BLE (Bluetooth Low Energy) central and scan for nearby peripherals. It displays every device it discovers, along with real-time signal strength (RSSI), advertisement data, and connection status. You can connect to connectable peripherals to browse their GATT services and characteristics, read values, subscribe to notifications, and inspect manufacturer data.
Table of Contents
- Overview Screen
- Device Details Screen
- Permissions And Requirements
- Technical Details
- Notes And Limitations
- Troubleshooting
Overview Screen
The overview screen is the main landing view of the Bluetooth tool. It contains a search bar, a status card with scan controls, and a scrollable list of discovered devices.
Search Bar
A text field at the top of the screen filters the device list by name. Typing a query instantly narrows the list to devices whose advertised or peripheral name contains the search text (case-insensitive). A clear button appears when the field is not empty.
Bluetooth Status Card
The status card displays:
- Bluetooth Status label with the current radio state, color-coded:
- Powered On (green) — Bluetooth is active and ready to scan.
- Powered Off (red) — the Bluetooth radio is turned off.
- Unauthorized (orange) — the user has denied Bluetooth permission for the app.
- Unsupported (red) — the device hardware does not support Bluetooth.
- Unknown / Resetting (gray) — the system is still determining the Bluetooth state.
- A scan control button (only visible when Bluetooth is Powered On):
- Stop Scanning (red) — stops the active scan.
- Start Scanning (green) — begins scanning for nearby peripherals.
Scanning starts automatically when the tool is opened and Bluetooth is powered on.
Device List
Discovered devices appear in a scrollable list, sorted by RSSI (strongest signal first). The list updates in real time as new devices are found or existing devices update their advertisement data.
Device Row
Each device is displayed as a card containing:
- A Bluetooth icon enclosed in a circular badge. A white arc overlays the circle, filling proportionally to the device's signal strength (0–100%).
- Device name — the advertised local name or peripheral name. Devices that do not broadcast a name appear as
[No Name]. - RSSI — the received signal strength in dB (e.g.
RSSI: -43 dB). - A status indicator on the bottom-left, showing one of:
- Connected (green) — the device is currently connected.
- Connectable (blue) — the device advertises that it accepts connections.
- Services: N — the number of GATT services the device advertises (shown when services are present but the device is not yet connected).
- (no label) — the device is not connectable and does not advertise services.
- A trailing indicator on the right:
- A green checkmark icon if the device is connected.
- A chevron (
>) if the device is connectable (tap to open details). - Not Connectable text if the device does not accept connections.
Tap any device row to navigate to the Device Details Screen.
Empty States
The overview shows contextual empty states:
- Scanning — a magnifying glass icon with a loading animation while the initial scan is in progress and no devices have been found yet.
- Bluetooth Off / Unsupported — a slashed Bluetooth icon with the current state and a prompt to enable Bluetooth.
- Scanning Stopped — a Bluetooth icon with a Start Scanning button when Bluetooth is on but scanning has been stopped manually and no devices are in the list.
Device Details Screen
Tapping a device row opens a dedicated details screen. The screen is divided into a header area, a signal strength gauge, and three content tabs.
Header And Connection
The header contains:
- A back button (
< Devices) to return to the overview screen. - The device name displayed prominently.
- A connection state indicator — a colored dot next to a label:
- Connected (green)
- Connecting (orange)
- Disconnected (red)
- Disconnecting (orange)
- A Connect / Disconnect button (only shown for connectable devices):
- Connect (blue) — initiates a BLE connection. A loading spinner is shown while the connection is being established.
- Connecting... (blue, disabled) — displayed during the connection attempt.
- Disconnect (red) — terminates the active connection.
When a connection is established, the tool automatically discovers all GATT services and their characteristics. Readable characteristics are read immediately, and characteristics that support notifications are subscribed to automatically.
Signal Strength Gauge
The signal strength section provides a detailed, real-time view of the device's radio signal:
-
Circular gauge — an arc that fills from 0% to 100% with an angular gradient (red to orange to yellow to green). The current RSSI value in dBm is displayed in the center.
-
Approximate distance — a human-readable estimate derived from the RSSI value:
RSSI Range Label -30 to -50 dBm Very Close -51 to -65 dBm Close -66 to -80 dBm Medium -81 to -90 dBm Far Below -90 dBm Very Far -
Signal bars — a 5-bar indicator that fills based on signal strength percentage.
-
Signal quality — a text label: Excellent (>80%), Good (>60%), Fair (>40%), Poor (>20%), or Very Poor (<=20%).
-
RSSI — the raw value in dBm.
-
TX Power — the transmit power level in dBm, if the device advertises it. This value represents the signal strength at 1 meter from the transmitter and can be used to estimate distance.
-
Signal History — a rolling bar chart of the last 20 RSSI readings, color-coded (green >= -60, yellow >= -75, red < -75). This helps visualize signal stability over time.
Info Tab
The Info tab displays general information about the device, organized as key-value rows:
| Field | Description |
|---|---|
| Name | The advertised or peripheral name (or [No Name]). |
| Identifier | The peripheral's UUID assigned by CoreBluetooth. This is a local identifier and is not the device's actual MAC address. |
| RSSI | Current received signal strength in dB. |
| TX Power | Transmit power in dBm (only shown if advertised by the device). |
| Connectable | Whether the device accepts BLE connections (Yes / No). |
| State | Current connection state (Connected, Connecting, Disconnected, Disconnecting). |
| Discovered | Timestamp when the device was first seen during this scan session. |
| Last Updated | Timestamp of the most recent advertisement or RSSI update. |
Below the key-value rows, two additional sections appear when the device provides the corresponding data:
- Advertised Services — a list of GATT service UUIDs that the device includes in its advertisement packets. Known standard services are shown with their human-readable name next to the UUID (e.g.
180F (Battery Service),180A (Device Information)). See Recognized Services for the full list. - Manufacturer Data — the raw manufacturer-specific data from the advertisement, displayed as a hex string. The first two bytes encode the Bluetooth SIG company identifier (little-endian).
Services Tab
The Services tab is available only when the device is connected. It shows the full GATT service and characteristic tree discovered during the connection.
Each service is displayed as an expandable row:
- A colored icon indicating the service category:
- Blue — Generic services (Generic Access
1800, Generic Attribute1801) - Green — Battery Service (
180F) - Orange — Device Information (
180A) - Purple — Vendor-specific services (UUIDs starting with
FE) - Gray — Other / unknown services
- Blue — Generic services (Generic Access
- The service name (resolved from UUID for known services) and the raw UUID string.
- A badge showing the number of characteristics belonging to that service.
- A chevron that rotates when the service is expanded.
Recognized Services
| UUID | Service Name |
|---|---|
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 |
Expanding a service reveals its characteristics. Each characteristic row shows:
- A colored icon based on the primary property (purple for read+write, blue for read-only, green for write-only, orange for notify-only, gray otherwise).
- The characteristic name (resolved from UUID for known GATT characteristics) and the raw UUID string.
- Property pills — small color-coded labels for each supported property:
- Read (blue) — the value can be read on demand.
- Write (green) — the value can be written with acknowledgment.
- Write No Response (light green) — the value can be written without acknowledgment.
- Notify (orange) — the characteristic can push updates to the central.
- Indicate (light orange) — like Notify but with acknowledgment.
- Auth (purple) — the characteristic requires authenticated signed writes.
- An eye toggle button (shown when the characteristic has a value). Tapping it reveals the characteristic's current value, displayed in multiple formats:
- Hex — the raw byte sequence.
- String — a UTF-8 interpretation, if the bytes form valid text.
- Numeric — automatic interpretation based on byte length:
- 1 byte: UInt8 value
- 2 bytes: UInt16 value
- 4 bytes: UInt32 value and Float value
Recognized Characteristics
| UUID | Characteristic Name |
|---|---|
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 |
Data Tab
The Data tab shows live, interpreted data from the connected device. If the device is not connected, a prompt is displayed with a Connect button (for connectable devices) or an informational message.
When connected, the tab shows up to three cards:
-
Manufacturer Data — the manufacturer-specific advertisement payload:
- Manufacturer ID — resolved from the first two bytes (little-endian) of the manufacturer data. Known IDs include Apple (
0x004C), Microsoft (0x0006), Samsung (0x0075), Xiaomi (0x038F), and Bosch (0x01D7). Unknown IDs are shown in hex (e.g.ID: 0x1234). - Raw Data — the full hex dump of the manufacturer data bytes.
- Byte visualization — a horizontal bar chart where each bar represents one byte. Bar height is proportional to the byte value (0–255), providing a quick visual fingerprint of the data.
- Manufacturer ID — resolved from the first two bytes (little-endian) of the manufacturer data. Known IDs include Apple (
-
Characteristic Values — a list of all characteristics that have a readable value. Each entry shows:
- The characteristic name (or UUID if unknown).
- The interpreted value (as byte, UInt16, UInt32/Float, UTF-8 string, or hex depending on data length).
- A small byte bar chart for values up to 8 bytes, with bars color-coded by magnitude (blue < 30%, green < 60%, yellow < 80%, red >= 80%).
- Values update automatically for characteristics that support notifications.
-
Connection Info — timing and signal metadata:
- Discovered — the time the device was first seen, with elapsed time since discovery.
- Last Update — the time of the most recent data update, with TX Power if available.
Permissions And Requirements
- Bluetooth permission — CoreBluetooth requires the user to grant Bluetooth access. If permission is denied, Lirum shows a permissions screen with a button to open iOS Settings so the user can re-enable access.
- Bluetooth radio — if Bluetooth is powered off, the tool remains accessible but scanning controls are disabled and an empty state prompts the user to turn Bluetooth on. No permission gate is shown in this case.
- Bluetooth permission is managed by the system; there is no explicit "request permission" button. The system prompt appears automatically the first time CoreBluetooth initializes.
Technical Details
- The tool acts as a BLE Central using
CBCentralManager. It scans for all nearby peripherals (scanForPeripherals(withServices: nil)), meaning it discovers devices regardless of what services they advertise. - RSSI (Received Signal Strength Indicator) values typically range from -30 dBm (very strong, device is very close) to -100 dBm (very weak, device is far away or obstructed). The tool normalizes this range to a 0–100% scale using the formula:
(RSSI + 100) / 70. - For connected devices, RSSI is polled every 2 seconds using
readRSSI(). A noise filter suppresses updates smaller than 2 dB to reduce visual jitter. - On connection, the tool calls
discoverServices(nil)to enumerate all GATT services, thendiscoverCharacteristics(nil, for:)on each service. Readable characteristics are read automatically viareadValue(for:), and notify-capable characteristics are subscribed to viasetNotifyValue(true, for:). - TX Power (
CBAdvertisementDataTxPowerLevelKey) represents the signal strength at 1 meter from the transmitter. When both TX Power and RSSI are known, the difference can be used to estimate path loss and approximate distance. - Manufacturer Data (
CBAdvertisementDataManufacturerDataKey) follows the Bluetooth SIG format: the first two bytes are the company identifier in little-endian order, followed by vendor-specific payload bytes. - The peripheral identifier shown in the Info tab is a UUID assigned by CoreBluetooth on the local device. It is stable across app launches for the same device but is not the actual Bluetooth MAC address (which iOS does not expose).
Notes And Limitations
- What you can see depends on what each peripheral advertises and what iOS exposes via CoreBluetooth. Some devices advertise minimal data.
- Many devices appear as
[No Name]because they do not include a local name in their advertisement packets. - The approximate distance estimates are rough guidelines based on RSSI thresholds. Actual distances vary significantly depending on environment, obstacles, antenna orientation, and transmit power.
- Not all connectable devices will successfully connect. Some require prior pairing through iOS Settings, and some may reject connections from unknown centrals.
- Classic Bluetooth devices (non-BLE) are not visible through CoreBluetooth and will not appear in the scan results.
- RSSI values can fluctuate rapidly due to multipath interference, body absorption, and other environmental factors. The signal history chart helps smooth out these variations visually.
Troubleshooting
- No devices found — make sure Bluetooth is turned on, stay on the Bluetooth screen for a few seconds, and tap Start Scanning if scanning has stopped.
- Permission denied — tap the Open Settings button on the permission screen and re-enable Bluetooth access for Lirum in the iOS Privacy settings.
- Connection fails — the device may require pairing in iOS Settings first, may not support connections from third-party apps, or may have moved out of range.
- Services tab is empty — some devices expose no services or delay service discovery. Wait a few seconds after connecting. If no services appear, the device may not support standard GATT profiles.
- Characteristic values show only hex — the tool attempts to interpret values as UTF-8 text and common numeric types. If none of these interpretations apply, the raw hex dump is shown.