nRF54L Channel Sounding on iOS 27 Beta

Dear all,

I was excited with the announcement at WWDC last week that Apple was now supporting Bluetooth Channel Sounding on iOS 27 (currently Beta) 
They even had a session and provided a sample app ready to go https://developer.apple.com/documentation/corebluetooth/measuring-distance-between-devices-using-channel-sounding

The presentation is also worth a watch, particularly they explain the hardware "Your accessory must support Bluetooth 6.3, and the inline PCT feature is required. iOS uses phase based ranging, so your chipset must also support mode-0 and mode-2, as defined by the Bluetooth spec.T_FCS is the interspace timing between tones. Make sure your accessory supports T_FCS of at least 100µs."

I've been trying to get it to work on the Seeed XIAO nRF54L board with mostly the ras_reflector example with some tweaks to the configuration. I tried the Android configuration but it didn't solve the issues.

The iPhone running iOS 27 beta manages to add the device The radio link appears fully functional! Using Apple's PacketLogger, I can confirm that iOS and the nRF54L are successfully executing CS procedures. Mode 0 (RTT) and Mode 2 (PBR) steps are completing successfully.

Most importantly, Inline PCT is working over the air. In the iOS HCI trace, I can see Step 4 (Mode 2) returning valid I/Q data for both the iPhone and the nRF54L:

Step 004:
Mode: 0x02 (PBR)
Parsed Data:
Tone PCT[0]: 0x188F62 <-- iPhone's measurement (I=-158, Q=392)
Tone PCT[1]: 0x192F7B <-- nRF54L's Inline PCT measurement (I=-133, Q=402)
Tone Quality: 0x20 : Tone extension slot; tone expected to be present

If Inline PCT was failing, I expect Tone PCT[1] would report I=0, Q=0. The fact that iOS is parsing the nRF54L's PCT data suggests the controller configuration and over-the-air payload are fundamentally correct.

The Problem: Despite the successful exchange and seeing the CS traffic on both sides of the connection, the iOS 27 Beta appears to be silently filtering out or rejecting the results. The sample app always shows 0 readings. Also the connection is not always sucessful it takes a couple of tries sometimes, others it fails with a Channel Sounding configuration failed on the iOS side)

I am using NCS v3.3.1 (I tried v3.4.0-rc1 but encountered MPU faults, so I reverted).

Any guidance on what Apple's newest framework is strictly validating in the CS negotiation would be hugely appreciated!

---------- 2026-06-16 11:35:32 +0100: Logging Started ----------

D: BT mempool size: 8704, required: 8688
*** Booting nRF Connect SDK v3.3.1-1d7a0b0e49b8 ***
*** Using Zephyr OS v4.3.99-37e6c28576ee ***
I: Starting Channel Sounding Reflector Sample
D: 
I: 8 Sectors of 4096 bytes
I: alloc wra: 0, f10
I: data wra: 0, 120
D: Open
I: SoftDevice Controller build revision: 
I: fc 51 7a e9 58 2c 6f fb |.Qz.X,o.
I: 6d 35 9f 17 3e 08 c8 c1 |m5..>...
I: 7b e9 5b 95             |{.[.    
D: 
D: 
D: Exit: 0
D: Command Complete (0x0c03) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x1003) status: 0x00, ncmd: 1, len 12
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x1001) status: 0x00, ncmd: 1, len 12
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x1002) status: 0x00, ncmd: 1, len 68
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2003) status: 0x00, ncmd: 1, len 12
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2002) status: 0x00, ncmd: 1, len 7
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x201c) status: 0x00, ncmd: 1, len 12
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x202f) status: 0x00, ncmd: 1, len 12
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2024) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x202e) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x202a) status: 0x00, ncmd: 1, len 5
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2074) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2001) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x0c01) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0xfc01) status: 0x00, ncmd: 1, len 16
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0xfc02) status: 0x00, ncmd: 1, len 68
D: start
D: no connection wants to do stuff
D: LE SC enabled
D: Decoded 5c13cc555eac0 as 5C:13:CC:55:5E:AC (public)
D: id: 0, addr: 5C:13:CC:55:5E:AC (public)
D: id: 0, addr: 00:00:00:00:00:00 (public)
D: Read SC: len 4
D: Restored SC for 5C:13:CC:55:5E:AC (public)
D: name 5c13cc555eac0 val 110600001010220000000000000000000000ff96f669e37563d02a21ab2afa9eae39259aa48a1b87cfacdb3e82d52401c492406531c1694a02000000
D: Decoded 5c13cc555eac0 as 5C:13:CC:55:5E:AC (public)
D: 5C:13:CC:55:5E:AC (public)
D: created 0x20008d08 for 5C:13:CC:55:5E:AC (public)
D: Successfully restored keys for 5C:13:CC:55:5E:AC (public)
D: Stored Hash: 
D: 85 b9 e5 c1 96 69 dd 66 |.....i.f
D: f9 26 06 09 cf 65 1e 65 |.&...e.e
D: 
D: 
D: 
D: Exit: 0
D: Command Complete (0x1009) status: 0x00, ncmd: 1, len 10
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0xfc09) status: 0x00, ncmd: 1, len 27
D: start
D: no connection wants to do stuff
D: key 9de3b9fd0005f7db7f7cdd5ca67b7df4 d 1 r 0
D: key
D: 9d e3 b9 fd 00 05 f7 db |........
D: 7f 7c dd 5c a6 7b 7d f4 |.|.\.{}.
D: plaintext
D: 01 00 00 00 00 00 00 00 |........
D: 00 00 00 00 00 00 00 00 |........
D: enc_data
D: 61 aa 08 e3 94 13 b5 4a |a......J
D: dc fd 7e 9a 82 a9 ec 45 |..~....E
D: res 61aa08e39413b54adcfd7e9a82a9ec45
D: handle 0x0000 offset 0 length 2
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 2
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 2
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: handle 0x0000 offset 0 length 5
D: Hash: 
D: 85 b9 e5 c1 96 69 dd 66 |.....i.f
D: f9 26 06 09 cf 65 1e 65 |.&...e.e
D: Database Hash matches
D: 
D: 
D: Exit: 0
D: Command Complete (0x2027) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x204e) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x202d) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: irk 61aa08e39413b54adcfd7e9a82a9ec45
D: r 4d3d75
D: key
D: 61 aa 08 e3 94 13 b5 4a |a......J
D: dc fd 7e 9a 82 a9 ec 45 |..~....E
D: plaintext
D: 4d 3d 75 00 00 00 00 00 |M=u.....
D: 00 00 00 00 00 00 00 00 |........
D: enc_data
D: 13 ed 67 1f 72 c3 46 43 |..g.r.FC
D: fb 76 8a 7c 19 5f ac 1e |.v.|._..
D: Created RPA 75:3D:4D:67:ED:13
D: 
D: 
D: Exit: 0
D: Command Complete (0x2005) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2006) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2008) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: 
D: 
D: Exit: 0
D: Command Complete (0x2009) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: disconnected -> adv-connectable
D: handle 0 ref 1 -> 2
D: 
D: 
D: Exit: 0
D: Command Complete (0x200a) status: 0x00, ncmd: 1, len 4
D: start
D: no connection wants to do stuff
D: handle 0 ref 2 -> 1
I:  Advertising...
D: 
D: LE Meta Event (0x0a), len (31)
D: handle 0 ref 1 -> 2
D: handle 0 ref 2 -> 1
D: handle 0 ref 1 -> 2
D: adv-connectable -> connected
D: [0x20002350] Scheduling auto-init procedures
D: conn 0x20002350 handle 0
D: conn 0x20002350 chan 0x20002418
D: ch 0x20002418 cid 0x0005
D: conn 0x20002350 handle 0
D: conn 0x20002350 chan 0x20002708
D: chan 0x20002708 cid 0x0006
D: conn 0x20002350 handle 0
D: att 0x20011338 chan 0x2000bd10 flags 0
D: conn 0x20002350 chan 0x2000bd18
D: chan 0x2000bd18 cid 0x0004
D: conn 0x20002350
D: 5C:13:CC:55:5E:AC (public)
D: Encoded path bt/ccc/5c13cc555eac0
D: key: bt/ccc/5c13cc555eac0
D: Decoded 5c13cc555eac0 as 5C:13:CC:55:5E:AC (public)
D: Read CCC: handle 0x0004 value 0x0002
D: Restoring CCC: handle 0x0004 value 0x0002
D: Restored CCC for id:0 addr:5C:13:CC:55:5E:AC (public)
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: ccc 0x20000694 value 0x0002
D: id: 0, addr: 5C:13:CC:55:5E:AC (public)
D: chan 0x2000bd18 status 0x2000bd28
I: ✅ CONNECTED to 5C:13:CC:55:5E:AC (public)
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: handle 0 ref 2 -> 3
D: [0x20002350] Running auto-initiated procedures
D: 
D: 
D: Exit: 0
D: Command Status (0x2016) status: 0x00
D: LE Meta Event (0x07), len (11)
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 3
D: start
D: no connection wants to do stuff
D: [0x20002350] Successfully ran auto-initiated procedures
D: handle 0 ref 3 -> 2
I: Stopped advertising. Configuring CS defaults...
D: 
D: 
D: Exit: 0
D: Command Complete (0x208d) status: 0x00, ncmd: 1, len 6
D: start
D: no connection wants to do stuff
I: CS default settings configured successfully
D: LE Meta Event (0x04), len (12)
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x0c), len (6)
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x05), len (13)
D: handle 0 ref 2 -> 3
D: type 32 5C:13:CC:55:5E:AC (public)
D: handle 0 ref 3 -> 2
D: 
D: 
D: Exit: 0
D: Command Complete (0x201a) status: 0x00, ncmd: 1, len 6
D: start
D: no connection wants to do stuff
D: Event (0x08) len 4
D: handle 0 ref 2 -> 3
D: chan 0x20002708 conn 0x20002350 handle 0 encrypt 0x01 hci status 0x00 
D: chan 0x2000bd18 conn 0x20002350 handle 0 sec_level 0x02 status 0x00 
D: conn 0x20002350
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 3
D: ccc 0x20000694 value 0x0002
D: id: 0, addr: 5C:13:CC:55:5E:AC (public)
D: 5C:13:CC:55:5E:AC (public)
D: handle 0 ref 3 -> 2
D: Data: handle (0x00), PB(2), BC(0), len(11)
D: handle 0 ref 2 -> 3
D: conn 0x20002350
D: handle 0 len 11 flags 02
D: First, len 11 final 7
D: Successfully parsed 11 byte L2CAP packet
D: Packet for CID 58 len 7
W: Ignoring data for unknown channel ID 0x003a
D: handle 0 ref 3 -> 2
D: Data: handle (0x00), PB(2), BC(0), len(7)
D: handle 0 ref 2 -> 3
D: conn 0x20002350
D: handle 0 len 7 flags 02
D: First, len 7 final 3
D: Successfully parsed 7 byte L2CAP packet
D: Packet for CID 4 len 3
D: chan 0x2000bd18 len 3
D: Received ATT chan 0x2000bd10 code 0x02 len 2
D: Client MTU 527
D: Server MTU 498
D: code 0x03
D: push: pdu 0x200112c0 len 3 cb 0 userdata 0
D: L2CAP channel 0x2000bd18 data ready added
D: DR
D: handle 0 ref 3 -> 4
D: Connection 0x20002350 added to conn_ready list
D: Negotiated MTU 498
D: handle 0 ref 4 -> 3
D: start
D: 0x20002350
D: handle 0 ref 3 -> 4
D: processing conn 0x20002350
D: sending from chan 0x2000bd18 (static) data 1
D: Adding L2CAP PDU header: buf 0x200112c0 chan 0x2000bd18 len 3 / 3
D: PDU payload
D: 03 f2 01                |...     
D: last frag of last seg, dequeuing 0x200112c0
D: done sending PDU
D: chan 0x2000bd18 done
D: 0x2000bd18
D: pop: cb 0 userdata 0
D: TX process: conn 0x20002350 buf 0x200112c0 (last)
D: conn 0x20002350 buf 0x200112c0 len 7 buf->len 7 cb 0 ud 0
D: 0x20008c04
D: make-view 0x200105f8 viewsize 7 meta 0x20008bf4
D: get-acl-frag: outside 0x200112c0 window 0x200105f8 size 7
D: send frag: buf 0x200105f8 len 7
D: conn 0x20002350 buf 0x200105f8 len 7 flags 0x02
D: 
D: 
D: destroy-view 0x200105f8 meta 0x20008bf4
D: 
D: Exit: 0
D: handle 0 ref 4 -> 3
D: 0x200112c0
D: opcode 0x3
D: UATT bearer, calling bt_att_sent: conn 0x20002350 chan 0x2000bd18
D: chan 0x2000bd10
D: start
D: 0x20002350
D: No more data for 0x20002350
D: processing conn 0x20002350
D: nothing to send on this conn
D: no channel conn 0x20002350
D: no buf returned
D: handle 0 ref 3 -> 2
D: start
D: no connection wants to do stuff
D: Event (0x13) len 5
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: Data: handle (0x00), PB(2), BC(0), len(9)
D: handle 0 ref 2 -> 3
D: conn 0x20002350
D: tx 0x20008c04 cb 0 user_data 0
D: 0x20008c04
D: raise TX IRQ
D: start
D: no connection wants to do stuff
D: handle 0 len 9 flags 02
D: First, len 9 final 5
D: Successfully parsed 9 byte L2CAP packet
D: Packet for CID 4 len 5
D: chan 0x2000bd18 len 5
D: Received ATT chan 0x2000bd10 code 0x12 len 4
D: handle 0x0004
D: handle 0x0004 offset 0
D: value 0x0002
D: peer 5C:13:CC:55:5E:AC (public) start 0x0000 end 0x0000
D: id: 0, addr: 5C:13:CC:55:5E:AC (public)
D: 5C:13:CC:55:5E:AC (public)
D: Encoded path bt/sc/5c13cc555eac0
D: stored SC for 5C:13:CC:55:5E:AC (public) (0x0000-0x0000)
D: handle 0x0000 value 2
D: code 0x13
D: push: pdu 0x200112c0 len 1 cb 0 userdata 0
D: L2CAP channel 0x2000bd18 data ready added
D: DR
D: handle 0 ref 3 -> 4
D: Connection 0x20002350 added to conn_ready list
D: handle 0 ref 4 -> 3
D: start
D: 0x20002350
D: handle 0 ref 3 -> 4
D: processing conn 0x20002350
D: sending from chan 0x2000bd18 (static) data 1
D: Adding L2CAP PDU header: buf 0x200112c0 chan 0x2000bd18 len 1 / 1
D: PDU payload
D: 13                      |.       
D: last frag of last seg, dequeuing 0x200112c0
D: done sending PDU
D: chan 0x2000bd18 done
D: 0x2000bd18
D: pop: cb 0 userdata 0
D: TX process: conn 0x20002350 buf 0x200112c0 (last)
D: conn 0x20002350 buf 0x200112c0 len 5 buf->len 5 cb 0 ud 0
D: 0x20008c10
D: make-view 0x200105f8 viewsize 5 meta 0x20008bf4
D: get-acl-frag: outside 0x200112c0 window 0x200105f8 size 5
D: send frag: buf 0x200105f8 len 5
D: conn 0x20002350 buf 0x200105f8 len 5 flags 0x02
D: 
D: 
D: destroy-view 0x200105f8 meta 0x20008bf4
D: 
D: Exit: 0
D: handle 0 ref 4 -> 3
D: 0x200112c0
D: opcode 0x13
D: UATT bearer, calling bt_att_sent: conn 0x20002350 chan 0x2000bd18
D: chan 0x2000bd10
D: start
D: 0x20002350
D: No more data for 0x20002350
D: processing conn 0x20002350
D: nothing to send on this conn
D: no channel conn 0x20002350
D: no buf returned
D: handle 0 ref 3 -> 2
D: start
D: no connection wants to do stuff
D: Event (0x13) len 5
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: conn 0x20002350
D: tx 0x20008c10 cb 0 user_data 0
D: 0x20008c10
D: raise TX IRQ
D: start
D: no connection wants to do stuff
D: Data: handle (0x00), PB(2), BC(0), len(11)
D: handle 0 ref 2 -> 3
D: conn 0x20002350
D: handle 0 len 11 flags 02
D: First, len 11 final 7
D: Successfully parsed 11 byte L2CAP packet
D: Packet for CID 4 len 7
D: chan 0x2000bd18 len 7
D: Received ATT chan 0x2000bd10 code 0x08 len 6
D: start_handle 0x0009 end_handle 0x000f type 2a00
D: handle 0x000b
D: handle 0x0000 offset 0 length 7
D: code 0x09
D: push: pdu 0x200112c0 len 11 cb 0 userdata 0
D: L2CAP channel 0x2000bd18 data ready added
D: DR
D: handle 0 ref 3 -> 4
D: Connection 0x20002350 added to conn_ready list
D: handle 0 ref 4 -> 3
D: start
D: 0x20002350
D: handle 0 ref 3 -> 4
D: processing conn 0x20002350
D: sending from chan 0x2000bd18 (static) data 1
D: Adding L2CAP PDU header: buf 0x200112c0 chan 0x2000bd18 len 11 / 11
D: PDU payload
D: 09 09 0b 00 41 70 70 6c |....Appl
D: 65 43 53                |eCS     
D: last frag of last seg, dequeuing 0x200112c0
D: done sending PDU
D: chan 0x2000bd18 done
D: 0x2000bd18
D: pop: cb 0 userdata 0
D: TX process: conn 0x20002350 buf 0x200112c0 (last)
D: conn 0x20002350 buf 0x200112c0 len 15 buf->len 15 cb 0 ud 0
D: 0x20008c1c
D: make-view 0x200105f8 viewsize 15 meta 0x20008bf4
D: get-acl-frag: outside 0x200112c0 window 0x200105f8 size 15
D: send frag: buf 0x200105f8 len 15
D: conn 0x20002350 buf 0x200105f8 len 15 flags 0x02
D: 
D: 
D: destroy-view 0x200105f8 meta 0x20008bf4
D: 
D: Exit: 0
D: handle 0 ref 4 -> 3
D: 0x200112c0
D: opcode 0x9
D: UATT bearer, calling bt_att_sent: conn 0x20002350 chan 0x2000bd18
D: chan 0x2000bd10
D: start
D: 0x20002350
D: No more data for 0x20002350
D: processing conn 0x20002350
D: nothing to send on this conn
D: no channel conn 0x20002350
D: no buf returned
D: handle 0 ref 3 -> 2
D: start
D: no connection wants to do stuff
D: Event (0x13) len 5
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: conn 0x20002350
D: tx 0x20008c1c cb 0 user_data 0
D: 0x20008c1c
D: raise TX IRQ
D: start
D: no connection wants to do stuff
D: LE Meta Event (0x38), len (38)
D: handle 0 ref 2 -> 3
I: CS capability exchange completed.
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x2e), len (4)
D: handle 0 ref 2 -> 3
I: CS security enabled.
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x2f), len (34)
D: handle 0 ref 2 -> 3
I: CS config creation complete. ID: 1, Inline PCT (cs_enhancements_1): 1
I:  ---> T_FCS_time_us: 100
I:  ---> T_IP1_time_us: 80
I:  ---> T_IP2_time_us: 30
I:  ---> T_PM_time_us: 20
I:  ---> Inline PCT (cs_enhancements_1): 1
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x30), len (22)
D: handle 0 ref 2 -> 3
I: CS procedures enabled - config ID: 1, TX power: 0 dBm
D: handle 0 ref 3 -> 2
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 2
D: handle 0 ref 2 -> 3
D: handle 0 ref 3 -> 4
I: ✅ Subevent result received! Procedure: 0, Steps: 75
D: handle 0 ref 4 -> 3
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 3
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 3
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 3
D: handle 0 ref 3 -> 4
D: handle 0 ref 4 -> 5
I: ✅ Subevent result received! Procedure: 1, Steps: 75
D: handle 0 ref 5 -> 4
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 4 -> 5
D: handle 0 ref 5 -> 4
D: handle 0 ref 4 -> 5
D: handle 0 ref 5 -> 4
D: handle 0 ref 4 -> 5
D: handle 0 ref 5 -> 4
D: handle 0 ref 4 -> 5
D: handle 0 ref 5 -> 6
I: ✅ Subevent result received! Procedure: 2, Steps: 75
D: handle 0 ref 6 -> 5
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 5 -> 6
D: handle 0 ref 6 -> 5
D: handle 0 ref 5 -> 6
D: handle 0 ref 6 -> 5
D: handle 0 ref 5 -> 6
D: handle 0 ref 6 -> 5
D: handle 0 ref 5 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 3, Steps: 75
D: handle 0 ref 7 -> 6
D: conn 0x20002350
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 4, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 5, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 6, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 7, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 8, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 9, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 10, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 11, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 12, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 13, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 14, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 15, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 16, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 17, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 18, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 19, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 20, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 21, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 22, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 23, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 24, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 25, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 26, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 27, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 28, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 29, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 30, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 31, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 32, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 33, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 34, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 35, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 36, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 37, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x31), len (250)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (249)
D: LE Meta Event (0x32), len (177)
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
D: handle 0 ref 7 -> 6
D: handle 0 ref 6 -> 7
I: ✅ Subevent result received! Procedure: 38, Steps: 75
D: handle 0 ref 7 -> 6
D: LE Meta Event (0x30), len (22)
D: handle 0 ref 6 -> 7
I: CS procedures disabled.
D: handle 0 ref 7 -> 6


---------- 2026-06-16 11:36:00 +0100: Logging Stopped ----------


Parents Reply
  • Seems like we don't have much to show for yet. We are working on getting support for this in the nRF Toolbox app (Apple link), but it is not ready. We are waiting for some testing, and unfortunately, I don't have a timeline for when this will be ready at this point in time.

    You did mention that you were using the ras_reflector sample. However, the "inline PCT" feature seems pretty central for the iOS support. Since you are at the 3.3.1 tag, perhaps you can test the ipt_reflector sample instead.

    Best regards,

    Edvin

Children
  • Thank you very much for looking into this. Yes it's new but also exciting for a lot of people -  fingers crossed it works very well with a dual antenna design like the new nRF54L15 Tag. 

    Regarding the ipt_reflector sample: I actually started there! However, iOS completely ignores the ipt_reflector device—it doesn't even show up in the sample app as a pairable/connectable device.

    I believe this is because ipt_reflector doesn't advertise or host the RAS (Ranging Service) GATT service. It seems Apple's OS strictly requires the RAS service to be present in the advertising packets/GATT server before it will even attempt to initiate a connection and start the CS procedures.

    To get around this, I took the Inline PCT configurations from the ipt_reflector sample (the CONFIG_BT_TRANSMIT_POWER_CONTROL, CONFIG_BT_CTLR_EXTENDED_FEAT_SET Kconfigs, and the bt_le_cs_set_default_settings call with max_tx_power = BT_HCI_OP_LE_CS_MAX_MAX_TX_POWER) and merged them directly into the ras_reflector sample.

    This hybrid approach is actually what allowed me to get the results I shared:

    1. iOS sees the RAS service and connects.
    2. The controller negotiates Inline PCT successfully (cs_enhancements_1: 1).
    3. The Apple PacketLogger HCI trace confirms valid Tone PCT[1] I/Q data is being received over the air.
    4. The T_FCS_time_us successfully negotiates to 100 µs.

    Since the RAS GATT service is present, the CS config is accepted, and the Inline PCT radio data is flowing perfectly over the air, I'm a bit stuck on why iOS  is silently discarding the distance calculation.

    I'll check in with Apple on it, if any news comes up on that side will share it here. Thanks again.

Related