1. Peer-to-peer router profile
The Peer-to-peer router application (P2P) is intended to demonstrate the multilink capabilities of the STM32WBA Bluetooth® LE solution. It acts as:
- GAP Central & GATT server (router service) device to be connected and controlled by a smartphone or a web page interface
- GAP Peripheral & GATT client device to control up to seven end-devices (P2P server)
The router service is a generic attribute profile (GATT) based low-energy profile defined by STMicroelectronics with proprietary UUIDs (128 bits) including three characteristics.
This wiki page describes the Peer-to-peer router project provided within the STM32CubeWBA MCU package[1].
Application overview |
---|
The table below describes the structure of the router service:
Bluetooth® LE router service specification | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
The router service is composed of three characteristics:
- Write forward characteristic:
- to be used by the smartphone or Bluetooth® web application to control one of the end-devices through the P2P router device.
Router service - Write forward characteristic | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
- Notify forward characteristic:
- to be used by the P2P router application to relay notification from end-devices (button pushed) in order to inform smartphone or Bluetooth® web application
Router service - Notify forward characteristic | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
- Device info characteristic:
- notifies end-device information (such as BD address or Name) to smartphone or Bluetooth® web application
Router Service - Notify forward characteristic | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Example of flow diagram between STM32WBA microcontrollers and ST BLE toolbox smartphone application |
---|
1.1. Advertising data
At startup, the P2P router application starts advertising with an interval of approximatively 80 to 100 ms.
The advertised data are composed as follows:
Advertising packet | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Manufacturer data are encoded following STMicroelectronics BlueST SDK v2 as described below:
Advertising manufacturer data STMicroelectronics BlueST SDK v2 | |||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
1.2. On-board button configuration
Button configuration for Bluetooth® Low Energy P2P router application on NUCLEO-WBA55CG board | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
2. Requirements
2.1. Software and Hardware requirements
For software and hardware requirements refer to STM32WBA Build BLE Project wiki page.
2.2. Compatible remote interfaces
The STM32CubeWBA P2P router project is compatible with the following remote interfaces:
- ST BLE ToolBox running on a smartphone or a tablet.
- Web Bluetooth® interface running into a web browser.
3. STM32WBA P2P router description
3.1. Project directory
The "BLE_p2pRouter" application is available by downloading the STM32CubeWBA MCU package[2].
Refer to the How to Build a Bluetooth® LE project wiki page for information on the project directory.
3.2. Project description
3.2.1. Software project structure
Below the software project structure with its main parts:
P2P router project structure |
---|
WARNING: Do not modify the files in Middlewares folder |
3.2.2. Application initialization
The different steps of the application initialization are described below:
Heart Rate project initialization |
---|
3.2.3. GAP and GATT initialization and interaction
Software module interaction |
---|
and : the Bluetooth® LE P2P router application initialization is done within app_ble.c:
- Initialization of the Bluetooth® Low Energy stack: initialization of the device as peripheral and central, and configuration and start of the advertising - APP_BLE_init()
- Call of the service controller initialization - SVCCTL_Init() located in svc_ctl.c
- Management of the GAP event - SVCCTL_App_Notification()
- HCI_LE_CONNECTION_COMPLETE provides information on the connection interval, slave latency, and supervision timeout
- HCI_LE_CONNECTION_UPDATE_COMPLETE provides information on the new connection
- HCI_DISCONNECTION_COMPLETE informs the application about the link disconnection and the reason
The service management is done by the service controller svc_ctl.c:
- Initialization of the number of registered handler - SVCCTL_Init()
- Management of the events from the Bluetooth® Low Energy host stack by calling SVCCTL_UserEvtRx(), and redirection to the gap event handler using SVCCTL_App_Notification
The application level of the P2P router is handled by p2pr_app.c:
- Initialization of the P2P router service - P2PR_Init() located in p2pr.c
- Initialization of the context of the application applicative part:
- Creation of some tasks
- Setup data tables holding links status
- Reception of notifications from the P2P router service by calling P2PR_Notification()
The P2P router service p2pr.c manages the specification of the service:
- Service applicative part initialization - P2PR_Init()
- Handling of the register P2P router event to service controller - SVCCTL_RegisterSvcHandler(P2PR_EventHandler)
- Initialization of the service and addition of P2P router service as primary service
- Initialization of the write forward (WRITEFWD) characteristic
- Initialization of the notif forward (NOTIFFWD) characteristic
- Initialization of the device info (DEVINFO) characteristic
- Management of the GATT event from Bluetooth® Low Energy stack - P2PR_EventHandler()
- ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE
- Reception of an attribute modification packet
- Update of the notification state for the characteristics that support it
- Transfer of the packet to the applicative part by calling the P2PR_Notification() function
- Reception of an attribute modification packet
- ACI_GATT_ATTRIBUTE_MODIFIED_VSEVT_CODE
Client links are managed into the gatt_client_app.c file:
- Initialization of the number of registered handler - SVCCTL_Init()
- Management of events from the Bluetooth® Low Energy host stack by calling SVCCTL_UserEvtRx(), and redirection to the GATT client event handler using the Event_Handler
3.3. How to use the Bluetooth® Low Energy P2P router application
Once the BLE P2P router application is installed on the STM32WBA platform, launch the ST BLE ToolBox smartphone or the Bluetooth® web application.
Then, scan and connect to device called p2pR_XX (where XX is replaced by the last byte of the BD address)
On release v1.0.0, the total link count is limited to 8.
Once the Bluetooth® LE connection is established, and notifications are enabled by the smartphone:
- Pressing button 1 allows an new end-device to be added the P2P router network. This is done by executing the following steps:
- Scan is started (blue LED turned on), reports are analyzed looking for a running P2P Server application
- Scan is stopped once a valid end-device is found or scan timeout happens (blue LED turned off).
- A valid end-device is detected thanks to FW_ID present in the advertising manufacturer data.
- A connection is initiated and once it is done:
- The MTU configuration is exchanged - aci_gatt_exchange_config().
- The service discovery starts - aci_gatt_disc_all_primary_services().
- Characteristics are discovered - aci_gatt_disc_all_char_of_service().
- Descriptors are discovered - aci_gatt_disc_all_char_desc().
- Notifications of enabled for the characteristics that support them.
The P2P router application maintain tables containing information on the connected end-device, referenced by a device index.
This device index ranges from 0 to 13. See details below:
Table name a_P2PR_device_... |
status[ ] | connHdl[ ] | bd_addr[ ] | char_write_level[ ] | char_notif_level[ ] | name[ ] | name_len[ ] |
---|---|---|---|---|---|---|---|
description | 0x00: None 0x01: Found 0x02: Connecting 0x03: Discovering 0x04: Connected 0x05: Link lost |
Connection handle |
Bluetooth® Device Address |
Level of write characteristic |
Level of notification characteristic |
Advertising name as a string |
Advertising name string length |
Updates of this table are sent to the remote interface by sending notifications on device info characteristic (format described in chapter 1).
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_ble.c as described below:
/**
* When set to 1, the traces are enabled in the BLE services
*/
#define CFG_DEBUG_BLE_TRACE 1
/**
* Enable or disable traces in the application
*/
#define CFG_DEBUG_APP_TRACE 1
Initialization and remote interface connection 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:05 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: p2pR Success: aci_gatt_add_char command : WRITEFWD Success: aci_gatt_add_char command : NOTIFFWD Success: aci_gatt_add_char command : DEVINFO End of Services and Characteristics creation Success: aci_hal_set_radio_activity_mask command ==>> aci_gap_set_discoverable - Success ==>> Success: Start advertising >>== HCI_LE_CONNECTION_COMPLETE_SUBEVT_CODE - Connection handle: 0x0001 - Connection established with @:4f:5d:ff:57:3b:1e - Connection Interval: 30.00 ms - Connection latency: 0 - Supervision Timeout: 5000 ms >>== HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE - Connection Interval: 7.50 ms - Connection latency: 0 - Supervision Timeout: 5000 ms >>== HCI_LE_CONNECTION_UPDATE_COMPLETE_SUBEVT_CODE - Connection Interval: 30.00 ms - Connection latency: 0 - Supervision Timeout: 5000 ms |
Scan and connection to an end-device |
==>> aci_gap_start_general_discovery_proc - Success p2pServer name: p2pSext_F5, db addr: 0x00:80:E1:2A:7B:F5 -> stored into p2pRouter table at index 0 Success: aci_gatt_update_char_value DEVINFO command ==>> aci_gap_terminate_gap_proc - Success >>== ACI_GAP_PROC_COMPLETE_VSEVT_CODE -- GAP_GENERAL_DISCOVERY_PROC completed Create connection to p2pServer stored in table at 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: 0x0002 - Connection established with @:00:80:e1:2a:7b:f5 - Connection Interval: 50.00 ms - Connection latency: 0 - Supervision Timeout: 5000 ms Success: MTU exchange MTU exchanged size = 247 MTU exchanged size = 247 Discover services, characteristics and descriptors for table index 0 GATT services discovery ACI_ATT_READ_BY_GROUP_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0002 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=0x0002 1/1 short UUID=0xFE40, handle [0x000C - 0x0011], P2P_SERVICE_UUID found PROC_GATT_DISC_ALL_PRIMARY_SERVICES services discovered Successfully DISCOVER_ALL_CHARS ConnHdl=0x0002 ALLServiceHandle[0x0001 - 0x0011] ACI_ATT_READ_BY_TYPE_RESP_VSEVT_CODE - ConnHdl=0x0002 ConnHdl=0x0002, 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=0x0002 ConnHdl=0x0002, number of value pair = 2 1/2 short UUID=0xFE41, Properties=0x0006, CharHandle [0x000D - 0x000E], ST_P2P_WRITE_CHAR_UUID charac found 2/2 short UUID=0xFE42, Properties=0x0010, CharHandle [0x000F - 0x0010], ST_P2P_NOTIFY_CHAR_UUID charac found All characteristics discovered Successfully DISCOVER_ALL_CHAR_DESCS [0x0001 - 0x0011] ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0002 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=0x0002 UUID=0xFE41, handle=0x000E, found ST_P2P_WRITE_CHAR_UUID ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0002 reset - UUID & handle - CHARACTERISTIC_UUID=0x2803 CharStartHandle=0x000F ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0002 UUID=0xFE42, handle=0x0010, found ST_P2P_NOTIFY_CHAR_UUID ACI_ATT_FIND_INFO_RESP_VSEVT_CODE - ConnHdl=0x0002 Descriptor UUID=0x2902, handle=0x000F-0x0010-0x0011P2PNotification found : Desc UUID=0x2902 handle=0x000F-0x0010-0x0011 All characteristic descriptors discovered Successfully ServiceChangedCharDescHdl =0x0004 P2PNotificationDescHdl =0x0011 All notifications enabled Successfully Success: aci_gatt_update_char_value DEVINFO command |
4. References