STM32WBA Bluetooth® LE – Data throughput measurement

1. Data throughput profile

Data throughput applications are proprietary applications used to measure the throughput between devices according to different parameters, 1M or 2M PHY, different connection intervals. Data throughput applications are named BLE_DataThroughput_Client and BLE_DataThroughput_Server.

The data throughput server is the device exposing three characteristics to be controlled by the remote client​:

  • Characteristics DATA_TRANSFER_TX (Notification) to notify data from server to client​.
  • Characteristics DATA_TRANSFER_RX (Write) to send data from client to server​.
  • Characteristics DATA_TRANSFER_TX_RX_INFO (Notification) to notify throughput measurement of data received.

The Central & GATT client collector can be three different applications​:

  • Data throughput client to measure performances between 2 STM32WBA devices​.
  • Smartphone ST Bluetooth® LE Toolbox to perform smartphone benchmarking​.
  • Web Bluetooth® interface to use the laptop.

The data throughput project provided within the STM32CubeWBA MCU Package[1] is described below.

Bluetooth® LE Data throughput project & STM32WBA
STM32WBA Data Throughput Profile


1.1. Structure of the data throughput service

The table below describes the structure of the data throughput service:

Bluetooth® LE data throughput service specification
Service Characteristic Mode UUID Size
Data throughput service 0000FE80-cc7a-482a-984a-7f2ed5b3e58f
Data Transfer TX Notify 0000FE81-8e22-4541-9d4c-21edae82ed19 255
Data Transfer RX Write W/O response 0000FE82-8e22-4541-9d4c-21edae82ed19 255
Data Transfer TX RX INFO Notify 0000FE83-8e22-4541-9d4c-21edae82ed19 255

Once connected, the devices are able to send continuously data by pressing B1.

  • On server side:
Pressing B1 starts notification continuously (blue led ON)​.
  • On client side:
Pressing B1 starts data transfer continuously(write) (blue led ON)​.
Payload size: 244 bytes.
PHY : 1M or 2M (can be changed while transferring data).
Connection interval: 26.25 ms / 11.25 ms / Smartphone-Web Bluetooth® parameters.
Sequence Number & CRC numbers added to each packet sent (verified at remote side)​.
Example 1 of flow diagram between a data throughput server (STM32WBA) & a client collector
STM32WBA DT Flow Diagram


Example 2 of flow diagram between a data throughput server (STM32WBA) & a client collector
STM32WBA DT Flow Diagram


1.2. Advertising data

At start up, the Data Throughput Server application starts advertising, with an interval of approximately 80-100ms.
Data advertised are composed as follows:

Data throughput server advertising packet
Description Length AD Type Value
Device Name 6 0x09 DT_XX (XX: last byte of BD address)
Service UUID 3 0x03 0xFE80 (DTS)
Manufacturer Data 15 0xFF See table below
Flags 2 0x01 0x06
(GeneralDiscoverable, BrEdrNotSupported)


Manufacturer data are encoded following STMicroelectronics BlueST SDK v2 as described below:

STMicroelectronics manufacturer advertising data
Byte Index 0 1 2-3 4 5 6 7 8 9 10-15
Function Length Manufacturer ID Company BlueST SDK Version Board ID Firmware ID Option 1 Option 2 Option 3 Device Address
Value 0x0F 0xFF 0x0030 STMicro 0x02 0x8B Nucleo-WBA 0x00 0x00 0x00 0x00 0x08E12Axxxx


1.3. On-board buttons configuration

Button configuration for Bluetooth® Low Energy data throughput application on Nucleo-WBA52CG boards
Application Condition B1 Click B1 Long Press B2 Click B2 Long Press B3 Click B3 Long Press
DT Server Idle

Connected

-

Starts/Stops notification

/ Clear Sec db

L2CAP CONNN REQ

/ -

Toggle PHY (1M/2M)

/
DT Client Idle

Connected

Starts scan then connects

Starts/Stops write data

/ Clear Sec db

Pairing request

/ -

Toggle PHY (1M/2M)

/

2. Requirements

2.1. Software and system requirements

The following list contains the required software as well as the required minimum IDE version:

  • IAR Embedded Workbench for ARM (EWARM) toolchain V9.20.1, plus a patch available in WBA Firmware Package: STM32Cube_FW_WBA_Vx.x.x/Utilities/PC_Software/EWARMv8_STM32WBAx_V1.2.zip
  • RealView Microcontroller Development Kit (MDK-ARM) toolchain V5.37, plus a patch available in WBA Firmware package: STM32Cube_FW_WBA_Vx.x.x/Utilities/PC_Software/Keil.STM32WBAx_DFP.1.0.0.zip
  • STM32CubeIDE toolchain V1.12.0 [2].

The following programmer software is required to flash the board with an already generated binary:

  • STM32CubeProgrammer[3]

2.2. Hardware requirements

NUCLEO-WBA52CG [4] is necessary to install the application.

Hardware platform illustration
Nucleo-WBA5


2.3. Collector applications compatibility

The STM32CubeWBA Data Throughput Sensor project is compatible with the following collector:

3. STM32WBA data throughput server example description

3.1. Project directory

The BLE_DataThroughput_Server application is available by downloading STM32CubeWBA MCU Package[1].

Refer to How to Build a Bluetooth® LE project wiki page for project directory information.

3.2. Project description

3.2.1. Structure

The image below describes the software project structure and its most important parts:

Data Throughput Server project structure
Connectivity WBA DT server struct.png
Connectivity yellow box.png
Main applicative part files
Connectivity dark blue box.png
Services management
Connectivity green box.png
Bluetooth® LE libraries
Connectivity pink box.png
Link Layer System integration files

WARNING: Do not modify the files in Middlewares folder


3.2.2. Application initialization

The different steps of the application initialization are described below:

Data throughput server project initialization
Connectivity WBA DT server init.png
puce1.png
  • Initializes the system (HAL, clocks, peripherals)
  • Infinite loop for run mode
puce2.png
  • Initializes the BSP, Power Mode, trace, memory manager, NVM
  • Waits for initialization done
puce3.png
  • Initializes the Bluetooth® LE Host Stack
puce4.png
  • Initializes the Bluetooth® LE GATT level
  • Initializes the Bluetooth® LE GAP level
puce5.png
  • Resets the number of registered handler
puce6.png
  • Initializes the context
  • Manages the heart rate service notification
puce7.png
  • Register Service Handler
  • Updates services and characteristics

3.2.3. GAP and GATT initialization and interaction

Data throughput server software module interaction
Connectivity WBA DT server inter.png
puce3.png

and puce4.png The Bluetooth LE Data Throughput Server Application initialization is done within app_ble.c

  • Start the Bluetooth® Low Energy stack:
    • Initialize the device as peripheral.
    • Configure and start advertising: ADV parameters, local name, UUID - APP_BLE_init()
  • Call the services controller initialization SVCCTL_Init() - svc_ctl.c
  • Manage the GAP event - SVCCTL_App_Notification()
    • EVT_LE_CONN_COMPLETE - provides information of the connection interval, slave latency, supervision timeout
    • EVT_LE_CONN_UPDATE_COMPLETE - provides the new information of the connection
    • EVT_DISCONN_COMPLETE - informs the application about the link disconnection and the reason
    • EVT_ENCRYPT_CHANGE - informs the application weather the link is encrypted
puce5.png

The Services management is done by the service controller, svc_ctl.c

  • Initialize the number of registered handler - SVCCTL_SvcInit()
  • Manage events - SVCCTL_UserEvtRx()- from the Bluetooth® Low Energy Host Stack and redirect them to the gap event handler - SVCCTL_App_Notification
puce6.png

The application level of the Data Throughput Sensor is done with dt_serv_app.c:

  • Initialization of the services:
    • Data throughput service - DT_SERV_Init() - dt_serv.c
  • Initialization of the context of the application
    • Register Data Throughput Event Handle to Service Controller - SVCCTL_RegisterSvcHandler(DT_SERV_EventHandler);
    • Initialize Service UUID – add Data Throughput service as Primary services
puce7.png

The Data Throughput Service dt_serv.c manages the specification of the service:

  • Service Init - DT_SERV_Init()
    • Register Data Throughput Event Handle to Service Controller - SVCCTL_RegisterSvcHandler(DT_SERV_EventHandler);
    • Initialize Service UUID – add Data Throughput service as Primary service
      • Initialize Transmitted Data characteristic
      • Initialize Received Data characteristic
      • Initialize Received Data value characteristic transmitted to the client
  • Update Data Throughput DT_SERV_THROUGH measurement characteristic - DT_SERV_UpdateValue()
  • Update Data Throughput DT_SERV_TX characteristic Value - DT_SERV_UpdateValue()
  • Manage the GATT event from Bluetooth® Low Energy Stack - DT_SERV_EventHandler()
    • ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE
      • Reception of a Write Command: DT_SERV_RX Characteristic Value
    • ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE
      • Reception of an attribute modification - DT_SERV_TX Value : ENABLE or DISABLE Notification
      • Reception of an attribute modification - DT_SERV_THROUGH Value : ENABLE or DISABLE Notification
        • Notify application of the Transmitted Data - DT_SERV_Notification(DT_SERV_TX_CHAR)
        • Notify application of the Received Data - DT_SERV_Notification(DT_SERV_THROUGH_CHAR)

3.3. How to use the Bluetooth® Low Energy Data Throughput Server Application

Once the Bluetooth® LE Data Throughput Server application is installed on the STM32WBA platform, launch ST Bluetooth® LE toolbox smartphone application. Then, scan and connect the device called DT_XX (where XX is replaced by the last byte of the BD address) to the application.
Once the Bluetooth® LE connection is established and the notifications enabled by the smartphone:

  • Pressing B1 while connected allows to start/stop sending of data through notification
  • Pressing B2 while not connected allows to clear the security database
  • Pressing B2 while connected allows to update the connection interval

With the WBA5x.Nucleo board, it is also possible to change RF PHY modulation

  • Pressing B3 while connected allows to switch between 2 Mbits and 1 Mbits PHY

3.4. UART debug trace

Thanks to the debug log via UART interface , it is possible to trace the application project.

To enable the traces within the project, enable them within app_conf.h as described below:

/**
 * Enable or Disable traces in application
 */
#define CFG_DEBUG_APP_TRACE         (1)
Data Throughput Sensor - Initialization phase Data Throughput Sensor - Connected Phase
==>> Start Ble_Hci_Gap_Gatt_Init function
  Success: hci_reset command
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_PUBADDR_OFFSET
  Public Bluetooth Address: 00:80:e1:2a:7e:9d
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_IR_OFFSET
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_ER_OFFSET
  Success: aci_hal_set_tx_power_level command
  Success: aci_gatt_init command
  Success: aci_gap_init command
  Success: aci_gatt_update_char_value - Device Name
  Success: aci_gatt_update_char_value - Appearance
  Success: hci_le_set_default_phy command
  Success: aci_gap_set_io_capability command
  Success: aci_gap_set_authentication_requirement command
  Success: aci_gap_configure_whitelist command
==>> End Ble_Hci_Gap_Gatt_Init function

Services and Characteristics creation
  Success: aci_gatt_add_service command: DT_SERV 

  Success: aci_gatt_add_char command   : TX_CHAR
  Success: aci_gatt_add_char command   : RX_CHAR
  Success: aci_gatt_add_char command   : THROUGH_CHAR
End of Services and Characteristics creation

==>> aci_gap_set_discoverable - Success
==>> Success: Start Fast Advertising
>>== HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE - 
    Connection handle: 0x0001
     - Connection established with @:00:80:e1:2a:7e:6e
     - Connection Interval:   7.50 ms
     - Connection latency:    0
     - Supervision Timeout: 5000 ms
  Success: change MTU 
  Success: set data length command  

>>== Connection Handle = 1 
>>== MTU_size = 255 


==>> Tx_char_handle Notification enabled
==>> Through_char_handle attribute modified
==>> Through_char_handle attribute enabled
>>== HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE
     - Connection Interval:   50.00 ms
     - Connection latency:    0
     - Supervision Timeout:   10000 ms
Data Throughput Sensor - Receive data Data Throughput Client - push B1 Writes data
 DataThroughput = 33840  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 33840  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 34080  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
  DataThroughput = 12240  bytes/s lost = 0 
  Success: aci_gatt_update_char_value THROUGH_CHAR command
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x0013
Info white.png Information

It happens that aci_gatt_update_char_value command returns error code 0x64, which corresponds to BLE_STATUS_INSUFFICIENT_RESOURCES.
In this case, the application stops the flow. It restarts the flow again when event ACI_GATT_TX_POOL_AVAILABLE_VSEVT_CODE is received.

4. STM32WBA data throughput client example description

4.1. Project directory

The BLE_DataThroughput_Client application is available by downloading STM32CubeWBA MCU Package[1]

Refer to How to Build a BLE Project wiki page for project directory information.

4.2. Project description

4.2.1. Structure

Software project structure with the most important parts:

Data throughput client project structure
Connectivity WBA DT client structure.png
Connectivity yellow box.png
Main applicative part files
Connectivity dark blue box.png
Services management
Connectivity green box.png
Bluetooth® LE libraries
Connectivity pink box.png
Link Layer System integration files

WARNING: Do not modify the files in Middlewares folder


4.2.2. Application initialization

The different steps of the application initialization are described below:

Data throughput client project initialization
Connectivity WBA DT client init.png
puce1.png
  • Initialize the system (HAL, clocks, peripherals)
  • Infinite loop for run mode
puce2.png
  • Initialize the BSP, Power Mode, trace, memory manager, NVM
  • Wait for initialization done
puce3.png
  • Initialize the Bluetooth® LE Host Stack
puce4.png
  • Initialize the Bluetooth® LE GATT level
  • Initialize the Bluetooth® LE GAP level
puce5.png
  • Reset the number of registered handler
puce6.png
  • Initialize Gatt Client Application

4.2.3. GAP and GATT initialization and interaction

Data throughput client software module interaction
Connectivity WBA DT client inter.png
puce3.png

and puce4.png The Bluetooth LE Data Throughput Client application initialization is done within app_ble.c

  • Start the Bluetooth® Low Energy stack:
    • Initialize the device as central.
    • Configure and start scanning.
  • Call the services controller initialization SVCCTL_Init() - svc_ctl.c
  • Manage the GAP event - SVCCTL_App_Notification()
    • EVT_LE_CONN_COMPLETE - provides information of the connection interval, slave latency, supervision timeout
    • EVT_LE_CONN_UPDATE_COMPLETE - provides the new information of the connection
    • EVT_DISCONN_COMPLETE - informs the application about the link disconnection and the reason
    • EVT_ENCRYPT_CHANGE - informs the application weather the link is encrypted
  • Connecting to the device with MANUFACTURER SPECIFIC DATA equals to CFG_DEV_ID_DT_SERVER
puce5.png

The Services management is done by the service controller, svc_ctl.c

  • Initialize the number of registered handler - SVCCTL_SvcInit()
  • Manage events - SVCCTL_UserEvtRx()- from the Bluetooth® Low Energy Host Stack and redirect them to the gap event handler - SVCCTL_App_Notification
puce6.png

The application level of Data Throughput Client is done with gatt_client_app.c:

  • Register Data Throughput Client Event Handle to Service Controller - SVCCTL_RegisterCltHandler(Event_Handler)
  • Initialization of the context of the application
    • Discovers service: GATT_CLIENT_APP_Procedure_Gatt(PROC_GATT_DISC_ALL_PRIMARY_SERVICES)
    • Discovers characteristics: GATT_CLIENT_APP_Procedure_Gatt(PROC_GATT_DISC_ALL_CHARS)
    • Discovers client descriptor characteristics: GATT_CLIENT_APP_Procedure_Gatt(PROC_GATT_DISC_ALL_DESCS)
    • Enables notifications: GATT_CLIENT_APP_Procedure_Gatt(PROC_GATT_ENABLE_ALL_NOTIFICATIONS)
  • Manage the GATT event from Bluetooth® Low Energy Stack - Event_Handler()
    • ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE
      • Reception of an attribute modification - DT_SERV_TX Value : Notification of data sent by the server
      • Reception of an attribute modification - DT_SERV_THROUGH Value : Throughput value calculated corresponding of DT_SERV_RX_VALUE sent back to the client

4.3. How to use

Install the Bluetooth®LE Data Throughput Client application on one STM32WBA platform.
Install the Bluetooth®LE Data Throughput Server application on other STM32WBA platform.

  • Pressing B1 while not connected scans and connects to the data throughput server device, enables all notifications.
  • Pressing B1 while connected allows to start/stop sending data through write w/o response

The Bluetooth® LE Data Throughput Client application supports the pairing procedure.

  • Pressing B2 while not connected allows to clear the security database.
  • Pressing B2 while connected allows to request pairing.

With the WBA5x.Nucleo board, it is also possible to change RF PHY modulation

  • Pressing B3 while connected allows to switch between 2 Mbits and 1 Mbits PHY

4.4. UART debug trace

Data Throughput Client - Initialization phase Push B1 then Connected Phase
==>> Start Ble_Hci_Gap_Gatt_Init function
  Success: hci_reset command
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_PUBADDR_OFFSET
  Public Bluetooth Address: 00:80:e1:2a:7e:6e
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_IR_OFFSET
  Success: aci_hal_write_config_data command - 
  CONFIG_DATA_ER_OFFSET
  Success: aci_hal_set_tx_power_level command
  Success: aci_gatt_init command
  Success: aci_gap_init command
  Success: aci_gatt_update_char_value - Appearance
  Success: aci_gap_set_io_capability command
  Success: aci_gap_set_authentication_requirement command
  Success: aci_gap_configure_whitelist command
==>> End Ble_Hci_Gap_Gatt_Init function
-- DT CLIENT INITIALIZED

** START GENERAL DISCOVERY (SCAN) **  

--- ST MANUFACTURER data BlueSTv2
-- DT server not detected
--- ST MANUFACTURER data BlueSTv2
-- DT server detected, db addr 0x00:80:E1:2A:7E:9D
>>== ACI_GAP_PROC_COMPLETE_VSEVT_CODE
-- GAP_GENERAL_DISCOVERY_PROC completed
Create connection to P2Pserver index 0
  wait for event HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE
>>== ACI_GAP_PROC_COMPLETE_VSEVT_CODE
>>== HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE - 
     Connection handle: 0x0001
     - Connection established with @:00:80:e1:2a:7e:9d
     - Connection Interval:   7.50 ms
     - Connection latency:    0
     - Supervision Timeout: 5000 ms
GATT services discovery
  MTU exchanged size = 255
  Success: set data length command  

ACI_ATT_READ_BY_GROUP_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0001
  1/2 short UUID=0x1801, handle [0x0001 - 0x0004], 
  GENERIC_ATTRIBUTE_SERVICE_UUID found
  2/2 short UUID=0x1800, handle [0x0005 - 0x000B], 
  GAP_SERVICE_UUID found
ACI_ATT_READ_BY_GROUP_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0001
  1/1 short UUID=0xFE80, handle [0x000C - 0x0014], 
  GENERIC_ATTRIBUTE_SERVICE_UUID found
PROC_GATT_DISC_ALL_PRIMARY_SERVICES 
  services discovered successfully

DISCOVER_ALL_CHARS ConnHdl=0x0001 
  ALLServiceHandle[0x0001 - 0x0014]
ACI_ATT_READ_BY_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0001
  ConnHdl=0x0001, number of value pair = 4
    1/4 short UUID=0x2A05, Properties=0x0020, 
    CharHandle [0x0002 - 0x0003], 
     GATT SERVICE_CHANGED_CHARACTERISTIC_UUID charac found
    2/4 short UUID=0x2A00, Properties=0x000A, 
    CharHandle [0x0006 - 0x0007], 
     GAP DEVICE_NAME charac found
    3/4 short UUID=0x2A01, Properties=0x0002, 
    CharHandle [0x0008 - 0x0009], 
     GAP APPEARANCE charac found
    4/4 short UUID=0x2A04, Properties=0x0002, 
    CharHandle [0x000A - 0x000B]
ACI_ATT_READ_BY_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0001
  ConnHdl=0x0001, number of value pair = 3
    1/3 short UUID=0xFE81, Properties=0x0010, 
    CharHandle [0x000D - 0x000E], 
    GATT TX_CHARACTERISTIC_UUID charac found
    2/3 short UUID=0xFE82, Properties=0x0006, 
    CharHandle [0x0010 - 0x0011], 
    GATT RX_CHARACTERISTIC_UUID charac found
    3/3 short UUID=0xFE83, Properties=0x0010, 
    CharHandle [0x0012 - 0x0013], 
    GATT THROUGHPUT_CHARACTERISTIC_UUID charac found
All characteristics discovered successfully

DISCOVER_ALL_CHAR_DESCS [0x0001 - 0x0014]
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
  CharStartHandle=0x0002
  UUID=0x2A05, handle=0x0003, found 
  GATT SERVICE_CHANGED_CHARACTERISTIC_UUID
Descriptor UUID=0x2902, handle=0x0002-0x0003-0x0004, 
 Service Changed found

PRIMARY_SERVICE_UUID=0x2800 handle=0x0005
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
  CharStartHandle=0x0006
  UUID=0x2A00, handle=0x0007, found GAP DEVICE_NAME_UUID
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
  CharStartHandle=0x0008
  UUID=0x2A01, handle=0x0009, found GAP APPEARANCE_UUID
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
  CharStartHandle=0x000A
  UUID=0x2A04, handle=0x000B
PRIMARY_SERVICE_UUID=0x2800 handle=0x000C
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
  CharStartHandle=0x000D
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
  UUID=0xFE81, handle=0x000E
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
Descriptor UUID=0x2902, handle=0x000D-0x000E-0x000F, 
 DTTX Client descriptor found

reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
 CharStartHandle=0x0010
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
  UUID=0xFE82, handle=0x0011
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 
 CharStartHandle=0x0012
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
  UUID=0xFE83, handle=0x0013
ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0001
Descriptor UUID=0x2902, handle=0x0012-0x0013-0x0014, 
 DTThroughput Client descriptor found
All characteristic descriptors discovered successfully

 ServiceChangedCharDescHdl =0x0004
 DTTXDescHdl =0x000F
 DTThroughputDescHdl =0x0014
All notifications enabled successfully



** CONNECTION UPDATE **  

>>== HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE
     - Connection Interval:   50.00 ms
     - Connection latency:    0
     - Supervision Timeout:   10000 ms
Data Throughput Sensor - push B1 Notifies data Data Throughput Client - Receives data
 Success: aci_gatt_update_char_value THROUGH_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
  Success: aci_gatt_update_char_value TX_CHAR command
DataThroughput = 33840 bytes/s lost = 256 
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
ACI_GATT_NOTIFICATION_VSEVT_CODE - ConnHdl=0x0001, 
 Attribute_Handle=0x000E
  DataThroughput = 33840 bytes/s lost = 0 

5. References