BLE notification not appearing for FTMS BLE

Trying to implement FTMS BLE communication, I have come to a dead end.

Not sure whether there are particularities about FTMS or if it due to some special case my indoor trainer uses (like the 0xFFF0 service seen below).

So far, I have implemented an app that communicates with another piece of BLE equipment. Notifications appear as expected.

But, when trying to communicate with my trainer, only reads and writes succeed (actually even the CCCD writes end up in the corresponding handler, so I think they work too.

What I did to try to sort this out was to try the same thing with the NordicRF (nRF Connect) app, which basically shows the exact same behaviour.

As a last resort I also tried to connect using the trainer supplied "iConsole" app (which is garbage), while paying attention to the nRF app.

Behold! Notifications do appear (log appended at the end).

So, obviously there is a way of getting this to work.

Anybody have an idea what to try?

Note that I have also tried a bunch of other apps on Google Play. Most of which connect to the trainer but none get any data (probably no notifications)

iConsole, zwift companion and RGT seem to know how to do this but I don't know how to intercept the traffic.

Could it be that the MTU is too small to carry the notification data? Something should still appear, right?

Thanks for any help

/Ola

nRF Connect, 2022-01-09
iConsole+0203 (CB:CC:E1:B0:A2:8C)
D    22:11:51.034    [Broadcast] Action received: android.bluetooth.device.action.ACL_CONNECTED
V    22:11:51.850    Connecting to CB:CC:E1:B0:A2:8C...
D    22:11:51.850    gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, opportunistic = true, preferred PHY = LE 1M) (hidden)
D    22:11:51.913    [Callback] Connection state changed with status: 0 and new state: CONNECTED (2)
I    22:11:51.913    Connected to CB:CC:E1:B0:A2:8C
V    22:11:51.927    Discovering services...
D    22:11:51.927    gatt.discoverServices()
D    22:11:51.960    [Callback] Services discovered with status: 0
I    22:11:51.960    Services discovered
V    22:11:51.988    Generic Access (0x1800)
- Device Name [R W] (0x2A00)
- Appearance [R] (0x2A01)
- Peripheral Preferred Connection Parameters [R] (0x2A04)
- Central Address Resolution [R] (0x2AA6)
Generic Attribute (0x1801)
- Service Changed [I] (0x2A05)
   Client Characteristic Configuration (0x2902)
Unknown Service (0000fff0-0000-1000-8000-00805f9b34fb)
- Unknown Characteristic [W WNR] (0000fff2-0000-1000-8000-00805f9b34fb)
- Unknown Characteristic [N] (0000fff1-0000-1000-8000-00805f9b34fb)
   Client Characteristic Configuration (0x2902)
Fitness Machine (0x1826)
- Fitness Machine Feature [R] (0x2ACC)
- Supported Speed Range [R] (0x2AD4)
- Supported Inclination Range [R] (0x2AD5)
- Supported Resistance Level Range [R] (0x2AD6)
- Supported Heart Rate Range [R] (0x2AD7)
- Supported Power Range [R] (0x2AD8)
- Indoor Bike Data [N W] (0x2AD2)
   Client Characteristic Configuration (0x2902)
- Training Status [N R W] (0x2AD3)
   Client Characteristic Configuration (0x2902)
- Fitness Machine Control Point [N W] (0x2AD9)
   Client Characteristic Configuration (0x2902)
- Fitness Machine Status [N W] (0x2ADA)
   Client Characteristic Configuration (0x2902)
Device Information (0x180A)
- Manufacturer Name String [R] (0x2A29)
- Model Number String [R] (0x2A24)
- Hardware Revision String [R] (0x2A27)
- Firmware Revision String [R] (0x2A26)
Secure DFU Service (0xFE59)
- Buttonless DFU [I W] (8ec90003-f315-4f60-9fb8-838830daea50)
   Client Characteristic Configuration (0x2902)
D    22:11:51.989    gatt.setCharacteristicNotification(00002a05-0000-1000-800000805f9b34fb, true)
D    22:11:51.991    gatt.setCharacteristicNotification(0000fff1-0000-1000-8000-00805f9b34fb, true)
D    22:11:51.992    gatt.setCharacteristicNotification(00002ad2-0000-1000-8000-00805f9b34fb, true)
D    22:11:51.993    gatt.setCharacteristicNotification(00002ad3-0000-1000-8000-00805f9b34fb, true)
D    22:11:51.993    gatt.setCharacteristicNotification(00002ad9-0000-1000-8000-00805f9b34fb, true)
D    22:11:51.995    gatt.setCharacteristicNotification(00002ada-0000-1000-8000-00805f9b34fb, true)
I    22:11:52.825    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:11:52.825    "(0x) F0-B0-01-01-A2" received
I    22:11:53.303    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:11:53.303    "(0x) F0-B1-01-01-21-C4" received
I    22:11:54.233    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:11:54.233    "(0x) F0-B0-01-01-A2" received
I    22:11:54.713    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:11:54.713    "(0x) F0-B1-01-01-21-C4" received
I    22:11:55.734    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:11:55.734    "(0x) F0-B0-01-01-A2" received
I    22:11:56.304    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:11:56.304    "(0x) F0-B1-01-01-21-C4" received
I    22:11:57.323    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:11:57.323    "(0x) F0-B0-01-01-A2" received
I    22:11:57.713    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:11:57.713    "(0x) F0-B1-01-01-21-C4" received
I    22:11:58.825    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:11:58.825    "(0x) F0-B0-01-01-A2" received
I    22:11:59.212    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:11:59.212    "(0x) F0-B1-01-01-21-C4" received
I    22:12:00.322    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:12:00.322    "(0x) F0-B0-01-01-A2" received
I    22:12:00.802    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21-C4
A    22:12:00.802    "(0x) F0-B1-01-01-21-C4" received
I    22:12:01.703    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B0-01-01-A2
A    22:12:01.703    "(0x) F0-B0-01-01-A2" received
I    22:12:02.302    Notification received from 0000fff1-0000-1000-8000-00805f9b34fb, value: (0x) F0-B1-01-01-21

  • That is exactly what I am hoping someone in this forum might know...

    I am not seeing anything specifik in the nRF log from when it does send notifications for the iConsole app, but maybe the log doesn't show everything?

    Yesterday I tried some settings on the following Control Point Characteristic but it didn't cause any notifications alas:
    Fitness Machine Control Point Procedure Requirements

    "A Client shall use the GATT Write Characteristic Value sub-procedure to initiate a procedure"
    0x00  Request Control  Initiates the procedure to request the control of a fitness machine.

    The response to this control point is Op Code 0x80 followed by the appropriate Parameter Value

  • I am thinking that there is no point in doing this on the actual Fenix until I can do it from nRF (which makes testing a bit faster...)

  • Finally solved it myself.

    As suspected, a write was needed to the "Control Point" characteristic. Setting this to a single byte 7 got the notifications running. Hopefully this can help someone else.

    Only thing left now is to put this in the Fenix but that should be a breeze now.

    Thanks, Jim, for your help.