Mbed OS Reference
Loading...
Searching...
No Matches
GattServer Class Reference

Construct and operates a GATT server. More...

#include <GattServer.h>

Data Structures

struct  EventHandler
 Definition of the general handler of GattServer related events. More...
 

Public Types

typedef FunctionPointerWithContext< unsigned > DataSentCallback_t
 Event handler invoked when the server has sent data to a client. More...
 
typedef CallChainOfFunctionPointersWithContext< unsigned > DataSentCallbackChain_t
 Callchain of DataSentCallback_t objects. More...
 
typedef FunctionPointerWithContext< const GattWriteCallbackParams * > DataWrittenCallback_t
 Event handler invoked when the client has written an attribute of the server. More...
 
typedef CallChainOfFunctionPointersWithContext< const GattWriteCallbackParams * > DataWrittenCallbackChain_t
 Callchain of DataWrittenCallback_t objects. More...
 
typedef FunctionPointerWithContext< const GattReadCallbackParams * > DataReadCallback_t
 Event handler invoked when the client has read an attribute of the server. More...
 
typedef CallChainOfFunctionPointersWithContext< const GattReadCallbackParams * > DataReadCallbackChain_t
 Callchain of DataReadCallback_t. More...
 
typedef FunctionPointerWithContext< const GattServer * > GattServerShutdownCallback_t
 Event handler invoked when the GattServer is reset. More...
 
typedef CallChainOfFunctionPointersWithContext< const GattServer * > GattServerShutdownCallbackChain_t
 Callchain of GattServerShutdownCallback_t. More...
 
typedef FunctionPointerWithContext< GattAttribute::Handle_tEventCallback_t
 Event handler that handles subscription to characteristic updates, unsubscription from characteristic updates and notification confirmation. More...
 

Public Member Functions

void setEventHandler (EventHandler *handler)
 Assign the event handler implementation that will be used by the module to signal events back to the application. More...
 
ble_error_t reset ()
 Shut down the GattServer instance. More...
 
ble_error_t addService (GattService &service)
 Add a service declaration to the local attribute server table. More...
 
ble_error_t read (GattAttribute::Handle_t attributeHandle, uint8_t buffer[], uint16_t *lengthP)
 Read the value of an attribute present in the local GATT server. More...
 
ble_error_t read (ble::connection_handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, uint8_t *buffer, uint16_t *lengthP)
 Read the value of an attribute present in the local GATT server. More...
 
ble_error_t write (GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly=false)
 Update the value of an attribute present in the local GATT server. More...
 
ble_error_t write (ble::connection_handle_t connectionHandle, GattAttribute::Handle_t attributeHandle, const uint8_t *value, uint16_t size, bool localOnly=false)
 Update the value of an attribute present in the local GATT server. More...
 
ble_error_t areUpdatesEnabled (const GattCharacteristic &characteristic, bool *enabledP)
 Determine if one of the connected clients has subscribed to notifications or indications of the characteristic in input. More...
 
ble_error_t areUpdatesEnabled (ble::connection_handle_t connectionHandle, const GattCharacteristic &characteristic, bool *enabledP)
 Determine if an identified client has subscribed to notifications or indications of a given characteristic. More...
 
bool isOnDataReadAvailable () const
 Indicate if the underlying stack emit events when an attribute is read by a client. More...
 
void onDataSent (const DataSentCallback_t &callback)
 Add an event handler that monitors emission of characteristic value updates. More...
 
template<typename T >
void onDataSent (T *objPtr, void(T::*memberPtr)(unsigned count))
 Add an event handler that monitors emission of characteristic value updates. More...
 
DataSentCallbackChain_tonDataSent ()
 Access the callchain of data sent event handlers. More...
 
void onDataWritten (const DataWrittenCallback_t &callback)
 Set an event handler that is called after a connected peer has written an attribute. More...
 
template<typename T >
void onDataWritten (T *objPtr, void(T::*memberPtr)(const GattWriteCallbackParams *context))
 Set an event handler that is called after a connected peer has written an attribute. More...
 
DataWrittenCallbackChain_tonDataWritten ()
 Access the callchain of data written event handlers. More...
 
ble_error_t onDataRead (const DataReadCallback_t &callback)
 Set an event handler that monitors attribute reads from connected clients. More...
 
template<typename T >
ble_error_t onDataRead (T *objPtr, void(T::*memberPtr)(const GattReadCallbackParams *context))
 Set an event handler that monitors attribute reads from connected clients. More...
 
DataReadCallbackChain_tonDataRead ()
 Access the callchain of data read event handlers. More...
 
void onShutdown (const GattServerShutdownCallback_t &callback)
 Set an event handler that monitors shutdown or reset of the GattServer. More...
 
template<typename T >
void onShutdown (T *objPtr, void(T::*memberPtr)(const GattServer *))
 Set an event handler that monitors shutdown or reset of the GattServer. More...
 
GattServerShutdownCallbackChain_tonShutdown ()
 Access the callchain of shutdown event handlers. More...
 
void onUpdatesEnabled (EventCallback_t callback)
 Set up an event handler that monitors subscription to characteristic updates. More...
 
void onUpdatesDisabled (EventCallback_t callback)
 Set up an event handler that monitors unsubscription from characteristic updates. More...
 
void onConfirmationReceived (EventCallback_t callback)
 Set up an event handler that monitors notification acknowledgment. More...
 

Detailed Description

Construct and operates a GATT server.

A Gatt server is a collection of GattService; these services contain characteristics that a peer connected to the device may read or write. These characteristics may also emit updates to subscribed clients when their values change.

Server Layout

Application code can add a GattService object to the server with the help of the function addService(). That function registers all the GattCharacteristic enclosed in the service, as well as all the characteristics descriptors (see GattAttribute) these characteristics contain. Service registration assigns a unique handle to the various attributes being part of the service; this handle should be used for subsequent read or write of these components.

There are no primitives defined to remove a single service; however, a call to the function reset() removes all services previously registered in the GattServer.

Characteristic and attributes access

Values of the characteristic and the characteristic descriptor present in the GattServer must be accessed through the handle assigned to them when the service has been registered; the GattServer class offers several flavors of read() and write() functions that retrieve or mutate an attribute value.

Application code can query if a client has subscribed to a given characteristic's value update by invoking the function areUpdatesEnabled().

Events

The GattServer allows application code to register several event handlers that can be used to monitor client and server activities:

  • onDataSent(): Register an event handler that is called when a characteristic value update has been sent to a client.
  • onDataWriten(): Register an event handler that is called when a client has written an attribute of the server.
  • onDataRead(): Register an event handler that is called when a client has read an attribute of the server.
  • onUpdatesEnabled: Register an event handler that is called when a client subscribes to updates of a characteristic.
  • onUpdatesDisabled: Register an event handler that is called when a client unsubscribes from updates of a characteristic.
  • onConfimationReceived: Register an event handler that is called when a client acknowledges a characteristic value notification.
Note
The term characteristic value update is used to represent Characteristic Value Notification and Characteristic Value Indication when the nature of the server initiated is not relevant.

Definition at line 102 of file GattServer.h.

Member Typedef Documentation

◆ DataSentCallback_t

Event handler invoked when the server has sent data to a client.

See also
onDataSent().

Definition at line 218 of file GattServer.h.

◆ DataSentCallbackChain_t

Callchain of DataSentCallback_t objects.

See also
onDataSent().

Definition at line 226 of file GattServer.h.

◆ DataWrittenCallback_t

Event handler invoked when the client has written an attribute of the server.

See also
onDataWritten().

Definition at line 235 of file GattServer.h.

◆ DataWrittenCallbackChain_t

Callchain of DataWrittenCallback_t objects.

See also
onDataWritten().

Definition at line 243 of file GattServer.h.

◆ DataReadCallback_t

Event handler invoked when the client has read an attribute of the server.

See also
onDataRead().

Definition at line 251 of file GattServer.h.

◆ DataReadCallbackChain_t

Callchain of DataReadCallback_t.

See also
onDataRead().

Definition at line 259 of file GattServer.h.

◆ GattServerShutdownCallback_t

Event handler invoked when the GattServer is reset.

See also
onShutdown() reset()

Definition at line 267 of file GattServer.h.

◆ GattServerShutdownCallbackChain_t

Callchain of GattServerShutdownCallback_t.

See also
onShutdown() reset()

Definition at line 275 of file GattServer.h.

◆ EventCallback_t

Event handler that handles subscription to characteristic updates, unsubscription from characteristic updates and notification confirmation.

See also
onUpdatesEnabled() onUpdateDisabled()

Definition at line 283 of file GattServer.h.

Member Function Documentation

◆ setEventHandler()

void setEventHandler ( EventHandler handler)

Assign the event handler implementation that will be used by the module to signal events back to the application.

Parameters
handlerApplication implementation of an EventHandler.
Note
Multiple discrete EventHandler instances may be used by adding them to a ChainableGattServerEventHandler and then setting the chain as the primary GattServer EventHandler using this function.
See also
ChainableGattServerEventHandler

◆ reset()

ble_error_t reset ( )

Shut down the GattServer instance.

This function notifies all event handlers listening for shutdown events that the GattServer is about to be shut down; then it clears all GattServer state.

Note
This function is meant to be overridden in the platform-specific subclass. Overrides must call the parent function before any cleanup.
Returns
BLE_ERROR_NONE on success.
See also
EventHandler::onShutdown()

◆ addService()

ble_error_t addService ( GattService service)

Add a service declaration to the local attribute server table.

This functions inserts a service declaration in the attribute table followed by the characteristic declarations (including characteristic descriptors) present in service.

The process assigns a unique attribute handle to all the elements added into the attribute table. This handle is an ID that must be used for subsequent interactions with the elements.

Note
There is no mirror function that removes a single service. Application code can remove all the registered services by calling reset().
Attention
GattServer allocates its own memory for all the attributes. The GattServer will set the handles on the service passed in and the characteristics it contains. You may record the handles you want to interact with in the future. After that the service and characteristics you passed in as the parameter may be freed. To write to the GattServer instances of the characteristics you have to use the saved handles.
Parameters
[in]serviceThe service to be added; attribute handle of services, characteristic and characteristic descriptors are updated by the process.
Returns
BLE_ERROR_NONE if the service was successfully added.

◆ read() [1/2]

ble_error_t read ( GattAttribute::Handle_t  attributeHandle,
uint8_t  buffer[],
uint16_t *  lengthP 
)

Read the value of an attribute present in the local GATT server.

Parameters
[in]attributeHandleHandle of the attribute to read.
[out]bufferA buffer to hold the value being read.
[in,out]lengthPLength of the buffer being supplied. If the attribute value is longer than the size of the supplied buffer, this variable holds upon return the total attribute value length (excluding offset). The application may use this information to allocate a suitable buffer size.
Returns
BLE_ERROR_NONE if a value was read successfully into the buffer.
Attention
read(ble::connection_handle_t, GattAttribute::Handle_t, uint8_t *, uint16_t *) must be used to read Client Characteristic Configuration Descriptor (CCCD) because the value of this type of attribute depends on the connection.

◆ read() [2/2]

ble_error_t read ( ble::connection_handle_t  connectionHandle,
GattAttribute::Handle_t  attributeHandle,
uint8_t *  buffer,
uint16_t *  lengthP 
)

Read the value of an attribute present in the local GATT server.

The connection handle allows application code to read the value of a Client Characteristic Configuration Descriptor for a given connection.

Parameters
[in]connectionHandleConnection handle.
[in]attributeHandleAttribute handle for the value attribute of the characteristic.
[out]bufferA buffer to hold the value being read.
[in,out]lengthPLength of the buffer being supplied. If the attribute value is longer than the size of the supplied buffer, this variable holds upon return the total attribute value length (excluding offset). The application may use this information to allocate a suitable buffer size.
Returns
BLE_ERROR_NONE if a value was read successfully into the buffer.

◆ write() [1/2]

ble_error_t write ( GattAttribute::Handle_t  attributeHandle,
const uint8_t *  value,
uint16_t  size,
bool  localOnly = false 
)

Update the value of an attribute present in the local GATT server.

Parameters
[in]attributeHandleHandle of the attribute to write.
[in]valueA pointer to a buffer holding the new value.
[in]sizeSize in bytes of the new value (in bytes).
[in]localOnlyIf this flag is false and the attribute handle written is a characteristic value, then the server sends an update containing the new value to all clients that have subscribed to the characteristic's notifications or indications. Otherwise, the update does not generate a single server initiated event.
Returns
BLE_ERROR_NONE if the attribute value has been successfully updated.
See also
EventHandler::onDataSent(), this will only be triggered if there are Client subscribed and the localOnly parameter is set to false.

◆ write() [2/2]

ble_error_t write ( ble::connection_handle_t  connectionHandle,
GattAttribute::Handle_t  attributeHandle,
const uint8_t *  value,
uint16_t  size,
bool  localOnly = false 
)

Update the value of an attribute present in the local GATT server.

The connection handle parameter allows application code to direct notification or indication resulting from the update to a specific client.

Parameters
[in]connectionHandleConnection handle.
[in]attributeHandleHandle for the value attribute of the characteristic.
[in]valueA pointer to a buffer holding the new value.
[in]sizeSize of the new value (in bytes).
[in]localOnlyIf this flag is false and the attribute handle written is a characteristic value, then the server sends an update containing the new value to the client identified by the parameter connectionHandle if it is subscribed to the characteristic's notifications or indications. Otherwise, the update does not generate a single server initiated event.
Returns
BLE_ERROR_NONE if the attribute value has been successfully updated.
See also
EventHandler::onDataSent(), this will only be triggered if there are Client subscribed and the localOnly parameter is set to false.

◆ areUpdatesEnabled() [1/2]

ble_error_t areUpdatesEnabled ( const GattCharacteristic characteristic,
bool *  enabledP 
)

Determine if one of the connected clients has subscribed to notifications or indications of the characteristic in input.

Parameters
[in]characteristicThe characteristic.
[out]enabledPUpon return, *enabledP is true if updates are enabled for a connected client; otherwise, *enabledP is false.
Returns
BLE_ERROR_NONE if the connection and handle are found. False otherwise.
See also
EventHandler::onDataSent()

◆ areUpdatesEnabled() [2/2]

ble_error_t areUpdatesEnabled ( ble::connection_handle_t  connectionHandle,
const GattCharacteristic characteristic,
bool *  enabledP 
)

Determine if an identified client has subscribed to notifications or indications of a given characteristic.

Parameters
[in]connectionHandleThe connection handle.
[in]characteristicThe characteristic.
[out]enabledPUpon return, *enabledP is true if the client identified by connectionHandle has subscribed to notifications or indications of characteristic; otherwise, *enabledP is false.
Returns
BLE_ERROR_NONE if the connection and handle are found. False otherwise.
See also
EventHandler::onDataSent()

◆ isOnDataReadAvailable()

bool isOnDataReadAvailable ( ) const

Indicate if the underlying stack emit events when an attribute is read by a client.

Attention
This function should be overridden to return true if applicable.
Returns
true if onDataRead is supported; false otherwise.

◆ onDataSent() [1/3]

void onDataSent ( const DataSentCallback_t callback)

Add an event handler that monitors emission of characteristic value updates.

Parameters
[in]callbackEvent handler being registered.
Note
It is possible to chain together multiple onDataSent callbacks (potentially from different modules of an application).

◆ onDataSent() [2/3]

void onDataSent ( T *  objPtr,
void(T::*)(unsigned count)  memberPtr 
)

Add an event handler that monitors emission of characteristic value updates.

Parameters
[in]objPtrPointer to the instance that is used to invoke the event handler.
[in]memberPtrEvent handler being registered. It is a member function.

Definition at line 526 of file GattServer.h.

◆ onDataSent() [3/3]

DataSentCallbackChain_t & onDataSent ( )

Access the callchain of data sent event handlers.

Returns
A reference to the DATA_SENT event callback chain.

◆ onDataWritten() [1/3]

void onDataWritten ( const DataWrittenCallback_t callback)

Set an event handler that is called after a connected peer has written an attribute.

Parameters
[in]callbackThe event handler being registered.
Attention
It is possible to set multiple event handlers. Registered handlers may be removed with onDataWritten().detach(callback).

◆ onDataWritten() [2/3]

void onDataWritten ( T *  objPtr,
void(T::*)(const GattWriteCallbackParams *context)  memberPtr 
)

Set an event handler that is called after a connected peer has written an attribute.

Parameters
[in]objPtrPointer to the instance that is used to invoke the event handler (memberPtr).
[in]memberPtrEvent handler being registered. It is a member function.

Definition at line 565 of file GattServer.h.

◆ onDataWritten() [3/3]

DataWrittenCallbackChain_t & onDataWritten ( )

Access the callchain of data written event handlers.

Returns
A reference to the data written event callbacks chain.
Note
It is possible to register callbacks using onDataWritten().add(callback).
It is possible to unregister callbacks using onDataWritten().detach(callback).

◆ onDataRead() [1/3]

ble_error_t onDataRead ( const DataReadCallback_t callback)

Set an event handler that monitors attribute reads from connected clients.

Parameters
[in]callbackEvent handler being registered.
Returns
BLE_ERROR_NOT_IMPLEMENTED if this functionality isn't available; else BLE_ERROR_NONE.
Note
This functionality may not be available on all underlying stacks. Application code may work around that limitation by monitoring read requests instead of read events.
See also
GattCharacteristic::setReadAuthorizationCallback()
isOnDataReadAvailable().
Attention
It is possible to set multiple event handlers. Registered handlers may be removed with onDataRead().detach(callback).

◆ onDataRead() [2/3]

ble_error_t onDataRead ( T *  objPtr,
void(T::*)(const GattReadCallbackParams *context)  memberPtr 
)

Set an event handler that monitors attribute reads from connected clients.

Parameters
[in]objPtrPointer to the instance that is used to invoke the event handler (memberPtr).
[in]memberPtrEvent handler being registered. It is a member function.

Definition at line 621 of file GattServer.h.

◆ onDataRead() [3/3]

DataReadCallbackChain_t & onDataRead ( )

Access the callchain of data read event handlers.

Returns
A reference to the data read event callbacks chain.
Note
It is possible to register callbacks using onDataRead().add(callback).
It is possible to unregister callbacks using onDataRead().detach(callback).

◆ onShutdown() [1/3]

void onShutdown ( const GattServerShutdownCallback_t callback)

Set an event handler that monitors shutdown or reset of the GattServer.

The event handler is invoked when the GattServer instance is about to be shut down. This can result in a call to reset() or BLE::reset().

Parameters
[in]callbackEvent handler being registered.
Note
It is possible to set up multiple shutdown event handlers.
It is possible to unregister a callback using onShutdown().detach(callback)

◆ onShutdown() [2/3]

void onShutdown ( T *  objPtr,
void(T::*)(const GattServer *)  memberPtr 
)

Set an event handler that monitors shutdown or reset of the GattServer.

The event handler is invoked when the GattServer instance is about to be shut down. This can result of a call to reset() or BLE::reset().

Parameters
[in]objPtrPointer to the instance that is used to invoke the event handler (memberPtr).
[in]memberPtrEvent handler being registered. It is a member function.

Definition at line 675 of file GattServer.h.

◆ onShutdown() [3/3]

Access the callchain of shutdown event handlers.

Returns
A reference to the shutdown event callbacks chain.
Note
It is possible to register callbacks using onShutdown().add(callback).
It is possible to unregister callbacks using onShutdown().detach(callback).

◆ onUpdatesEnabled()

void onUpdatesEnabled ( EventCallback_t  callback)

Set up an event handler that monitors subscription to characteristic updates.

Parameters
[in]callbackEvent handler being registered.

◆ onUpdatesDisabled()

void onUpdatesDisabled ( EventCallback_t  callback)

Set up an event handler that monitors unsubscription from characteristic updates.

Parameters
[in]callbackEvent handler being registered.

◆ onConfirmationReceived()

void onConfirmationReceived ( EventCallback_t  callback)

Set up an event handler that monitors notification acknowledgment.

The event handler is called when a client sends a confirmation that it has correctly received a notification from the server.

Parameters
[in]callbackEvent handler being registered.