Multi-Master Topology#
Introduction#
Since Bluetooth 4.1, a slave device can connect to multiple masters. Silicon Labs Bluetooth stack supports connection to multiple masters simultaneously, with a maximum number of 8 masters. This document shows how to handle multiple connections in your Bluetooth application.
Establishing Multiple Connections#
Connections are initiated by master devices. For example, when a smartphone connects to your device, the smartphone will be the master and your device will be the slave.
To make connections possible, the slave device has to advertise itself with a connectable advertisement. A connectable advertisement can be started with the following command:
gecko_cmd_le_gap_start_advertising(le_gap_general_discoverable,
le_gap_undirected_connectable);
See the detailed description here: gecko_cmd_le_gap_start_advertising().
After the advertising is started, a master device can discover the slave, and it can send a connection request to it. When a connection request is received, the advertising is immediately stopped by the Bluetooth stack to avoid unintended multiple connections, and the connection is opened. This is signaled by a gecko_evt_le_connection_opened event. In case you want to enable connections for multiple masters, you have to re-start advertising upon receiving this event, with the very same command as before.
It is worth keeping count of the live connections, and not re-starting advertising after the limit of maximum number of connections is reached.
Saving Connection Handles#
When a connection is opened, the stack returns a connection handle. Later, this handle can be used to differentiate between simultaneous connections. All connection-related commands require a connection handle and all connection-related events provide a connection handle. As a result, save the connection handles for future use, e.g., in a global variable.
struct {
bd_addr device_address;
uint8_t address_type;
uint8_t connection_handle;
} connections[8];
uint8_t live_connections = 0;
//...
case gecko_evt_le_connection_opened_id:
connections[live_connections].device_address = evt->data.evt_le_connection_opened.address;
connections[live_connections].address_type = evt->data.evt_le_connection_opened.address_type;
connections[live_connections].connection_handle = evt->data.evt_le_connection_opened.connection;
live_connections++;
break;
Example#
This guide has a related code example, here: Multi-Slave Multi-Master Dual Topology Example