NimBLE Host GATT Server Reference

Introduction

The Generic Attribute Profile (GATT) manages all activities involving services, characteristics, and descriptors. The server half of the GATT API handles registration and responding to GATT clients.

API

typedef int ble_gatt_mtu_fn(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t mtu, void *arg)
typedef int ble_gatt_disc_svc_fn(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_svc *service, void *arg)
typedef int ble_gatt_attr_fn(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attr, void *arg)

The host will free the attribute mbuf automatically after the callback is executed.

The application can take ownership of the mbuf and prevent it from being freed by assigning NULL to attr->om.

typedef int ble_gatt_reliable_attr_fn(uint16_t conn_handle, const struct ble_gatt_error *error, struct ble_gatt_attr *attrs, uint8_t num_attrs, void *arg)

The host will free the attribute mbufs automatically after the callback is executed.

The application can take ownership of the mbufs and prevent them from being freed by assigning NULL to each attribute’s om field.

typedef int ble_gatt_chr_fn(uint16_t conn_handle, const struct ble_gatt_error *error, const struct ble_gatt_chr *chr, void *arg)
typedef int ble_gatt_dsc_fn(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t chr_def_handle, const struct ble_gatt_dsc *dsc, void *arg)
typedef int ble_gatt_access_fn(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg)
typedef uint16_t ble_gatt_chr_flags
typedef void ble_gatt_register_fn(struct ble_gatt_register_ctxt *ctxt, void *arg)
typedef void (*ble_gatt_svc_foreach_fn)(const struct ble_gatt_svc_def *svc, uint16_t handle, uint16_t end_group_handle, void *arg)
int ble_gattc_exchange_mtu(uint16_t conn_handle, ble_gatt_mtu_fn *cb, void *cb_arg)

Initiates GATT procedure: Exchange MTU.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_disc_all_svcs(uint16_t conn_handle, ble_gatt_disc_svc_fn *cb, void *cb_arg)

Initiates GATT procedure: Discover All Primary Services.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_disc_svc_by_uuid(uint16_t conn_handle, const ble_uuid_t *uuid, ble_gatt_disc_svc_fn *cb, void *cb_arg)

Initiates GATT procedure: Discover Primary Service by Service UUID.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • service_uuid128: The 128-bit UUID of the service to discover.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_find_inc_svcs(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, ble_gatt_disc_svc_fn *cb, void *cb_arg)

Initiates GATT procedure: Find Included Services.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • start_handle: The handle to begin the search at (generally the service definition handle).

  • end_handle: The handle to end the search at (generally the last handle in the service).

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_disc_all_chrs(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, ble_gatt_chr_fn *cb, void *cb_arg)

Initiates GATT procedure: Discover All Characteristics of a Service.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • start_handle: The handle to begin the search at (generally the service definition handle).

  • end_handle: The handle to end the search at (generally the last handle in the service).

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_disc_chrs_by_uuid(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, const ble_uuid_t *uuid, ble_gatt_chr_fn *cb, void *cb_arg)

Initiates GATT procedure: Discover Characteristics by UUID.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • start_handle: The handle to begin the search at (generally the service definition handle).

  • end_handle: The handle to end the search at (generally the last handle in the service).

  • chr_uuid128: The 128-bit UUID of the characteristic to discover.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_disc_all_dscs(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, ble_gatt_dsc_fn *cb, void *cb_arg)

Initiates GATT procedure: Discover All Characteristic Descriptors.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • chr_val_handle: The handle of the characteristic value attribute.

  • chr_end_handle: The last handle in the characteristic definition.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_read(uint16_t conn_handle, uint16_t attr_handle, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Read Characteristic Value.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to read.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_read_by_uuid(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle, const ble_uuid_t *uuid, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Read Using Characteristic UUID.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • start_handle: The first handle to search (generally the handle of the service definition).

  • end_handle: The last handle to search (generally the last handle in the service definition).

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_read_long(uint16_t conn_handle, uint16_t handle, uint16_t offset, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Read Long Characteristic Values.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • handle: The handle of the characteristic value to read.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_read_mult(uint16_t conn_handle, const uint16_t *handles, uint8_t num_handles, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Read Multiple Characteristic Values.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • handles: An array of 16-bit attribute handles to read.

  • num_handles: The number of entries in the “handles” array.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_write_no_rsp(uint16_t conn_handle, uint16_t attr_handle, struct os_mbuf *om)

Initiates GATT procedure: Write Without Response.

This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to write to.

  • txom: The value to write to the characteristic.

int ble_gattc_write_no_rsp_flat(uint16_t conn_handle, uint16_t attr_handle, const void *data, uint16_t data_len)

Initiates GATT procedure: Write Without Response.

This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to write to.

  • value: The value to write to the characteristic.

  • value_len: The number of bytes to write.

int ble_gattc_write(uint16_t conn_handle, uint16_t attr_handle, struct os_mbuf *om, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Write Characteristic Value.

This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to write to.

  • txom: The value to write to the characteristic.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_write_flat(uint16_t conn_handle, uint16_t attr_handle, const void *data, uint16_t data_len, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Write Characteristic Value (flat buffer version).

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to write to.

  • value: The value to write to the characteristic.

  • value_len: The number of bytes to write.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_write_long(uint16_t conn_handle, uint16_t attr_handle, uint16_t offset, struct os_mbuf *om, ble_gatt_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Write Long Characteristic Values.

This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attr_handle: The handle of the characteristic value to write to.

  • txom: The value to write to the characteristic.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_write_reliable(uint16_t conn_handle, struct ble_gatt_attr *attrs, int num_attrs, ble_gatt_reliable_attr_fn *cb, void *cb_arg)

Initiates GATT procedure: Reliable Writes.

This function consumes the supplied mbufs regardless of the outcome.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • attrs: An array of attribute descriptors; specifies which characteristics to write to and what data to write to them. The mbuf pointer in each attribute is set to NULL by this function.

  • num_attrs: The number of characteristics to write; equal to the number of elements in the ‘attrs’ array.

  • cb: The function to call to report procedure status updates; null for no callback.

  • cb_arg: The optional argument to pass to the callback function.

int ble_gattc_notify_custom(uint16_t conn_handle, uint16_t att_handle, struct os_mbuf *om)

Sends a “free-form” characteristic notification.

This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • chr_val_handle: The attribute handle to indicate in the outgoing notification.

  • txom: The value to write to the characteristic.

int ble_gattc_notify(uint16_t conn_handle, uint16_t chr_val_handle)

Sends a characteristic notification.

The content of the message is read from the specified characteristic.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • chr_val_handle: The value attribute handle of the characteristic to include in the outgoing notification.

int ble_gattc_indicate_custom(uint16_t conn_handle, uint16_t chr_val_handle, struct os_mbuf *txom)

Sends a “free-form” characteristic indication.

The provided mbuf contains the indication payload. This function consumes the supplied mbuf regardless of the outcome.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • chr_val_handle: The value attribute handle of the characteristic to include in the outgoing indication.

  • txom: The data to include in the indication.

int ble_gattc_indicate(uint16_t conn_handle, uint16_t chr_val_handle)

Sends a characteristic indication.

The content of the message is read from the specified characteristic.

Return

0 on success; nonzero on failure.

Parameters
  • conn_handle: The connection over which to execute the procedure.

  • chr_val_handle: The value attribute handle of the characteristic to include in the outgoing indication.

int ble_gattc_init(void)
int ble_gatts_add_svcs(const struct ble_gatt_svc_def *svcs)

Queues a set of service definitions for registration.

All services queued in this manner get registered when ble_gatts_start() is called.

Return

0 on success; BLE_HS_ENOMEM on heap exhaustion.

Parameters
  • svcs: An array of service definitions to queue for registration. This array must be terminated with an entry whose ‘type’ equals 0.

int ble_gatts_svc_set_visibility(uint16_t handle, int visible)

Set visibility of local GATT service.

Invisible services are not removed from database but are not discoverable by peer devices. Service Changed should be handled by application when needed by calling ble_svc_gatt_changed().

Return

0 on success; BLE_HS_ENOENT if service wasn’t found.

Parameters
  • handle: Handle of service

  • visible: non-zero if service should be visible

int ble_gatts_count_cfg(const struct ble_gatt_svc_def *defs)

Adjusts a host configuration object’s settings to accommodate the specified service definition array.

This function adds the counts to the appropriate fields in the supplied configuration object without clearing them first, so it can be called repeatedly with different inputs to calculate totals. Be sure to zero the GATT server settings prior to the first call to this function.

Return

0 on success; BLE_HS_EINVAL if the svcs array contains an invalid resource definition.

Parameters
  • defs: The service array containing the resource definitions to be counted.

void ble_gatts_chr_updated(uint16_t chr_def_handle)

Send notification (or indication) to any connected devices that have subscribed for notification (or indication) for specified characteristic.

Parameters
  • chr_def_handle: Characteristic definition handle

int ble_gatts_find_svc(const ble_uuid_t *uuid, uint16_t *out_handle)

Retrieves the attribute handle associated with a local GATT service.

Return

0 on success; BLE_HS_ENOENT if the specified service could not be found.

Parameters
  • uuid: The UUID of the service to look up.

  • out_handle: On success, populated with the handle of the service attribute. Pass null if you don’t need this value.

int ble_gatts_find_chr(const ble_uuid_t *svc_uuid, const ble_uuid_t *chr_uuid, uint16_t *out_def_handle, uint16_t *out_val_handle)

Retrieves the pair of attribute handles associated with a local GATT characteristic.

Return

0 on success; BLE_HS_ENOENT if the specified service or characteristic could not be found.

Parameters
  • svc_uuid: The UUID of the parent service.

  • chr_uuid: The UUID of the characteristic to look up.

  • out_def_handle: On success, populated with the handle of the characteristic definition attribute. Pass null if you don’t need this value.

  • out_val_handle: On success, populated with the handle of the characteristic value attribute. Pass null if you don’t need this value.

int ble_gatts_find_dsc(const ble_uuid_t *svc_uuid, const ble_uuid_t *chr_uuid, const ble_uuid_t *dsc_uuid, uint16_t *out_dsc_handle)

Retrieves the attribute handle associated with a local GATT descriptor.

Return

0 on success; BLE_HS_ENOENT if the specified service, characteristic, or descriptor could not be found.

Parameters
  • svc_uuid: The UUID of the grandparent service.

  • chr_uuid: The UUID of the parent characteristic.

  • dsc_uuid: The UUID of the descriptor ro look up.

  • out_handle: On success, populated with the handle of the descriptor attribute. Pass null if you don’t need this value.

void ble_gatts_show_local(void)

Prints dump of local GATT database.

This is useful to log local state of database in human readable form.

int ble_gatts_reset(void)

Resets the GATT server to its initial state.

On success, this function removes all supported services, characteristics, and descriptors. This function requires that: o No peers are connected, and o No GAP operations are active (advertise, discover, or connect).

Return

0 on success; BLE_HS_EBUSY if the GATT server could not be reset due to existing connections or active GAP procedures.

int ble_gatts_start(void)

Makes all registered services available to peers.

This function gets called automatically by the NimBLE host on startup; manual calls are only necessary for replacing the set of supported services with a new one. This function requires that: o No peers are connected, and o No GAP operations are active (advertise, discover, or connect).

Return

0 on success; A BLE host core return code on unexpected error.

BLE_GATT_REGISTER_OP_SVC
BLE_GATT_REGISTER_OP_CHR
BLE_GATT_REGISTER_OP_DSC
BLE_GATT_SVC_UUID16
BLE_GATT_DSC_CLT_CFG_UUID16
BLE_GATT_CHR_PROP_BROADCAST
BLE_GATT_CHR_PROP_READ
BLE_GATT_CHR_PROP_WRITE_NO_RSP
BLE_GATT_CHR_PROP_WRITE
BLE_GATT_CHR_PROP_NOTIFY
BLE_GATT_CHR_PROP_INDICATE
BLE_GATT_CHR_PROP_AUTH_SIGN_WRITE
BLE_GATT_CHR_PROP_EXTENDED
BLE_GATT_ACCESS_OP_READ_CHR
BLE_GATT_ACCESS_OP_WRITE_CHR
BLE_GATT_ACCESS_OP_READ_DSC
BLE_GATT_ACCESS_OP_WRITE_DSC
BLE_GATT_CHR_F_BROADCAST
BLE_GATT_CHR_F_READ
BLE_GATT_CHR_F_WRITE_NO_RSP
BLE_GATT_CHR_F_WRITE
BLE_GATT_CHR_F_NOTIFY
BLE_GATT_CHR_F_INDICATE
BLE_GATT_CHR_F_AUTH_SIGN_WRITE
BLE_GATT_CHR_F_RELIABLE_WRITE
BLE_GATT_CHR_F_AUX_WRITE
BLE_GATT_CHR_F_READ_ENC
BLE_GATT_CHR_F_READ_AUTHEN
BLE_GATT_CHR_F_READ_AUTHOR
BLE_GATT_CHR_F_WRITE_ENC
BLE_GATT_CHR_F_WRITE_AUTHEN
BLE_GATT_CHR_F_WRITE_AUTHOR
BLE_GATT_SVC_TYPE_END
BLE_GATT_SVC_TYPE_PRIMARY
BLE_GATT_SVC_TYPE_SECONDARY
struct ble_gatt_error
#include <ble_gatt.h>
struct ble_gatt_svc
#include <ble_gatt.h>
struct ble_gatt_attr
#include <ble_gatt.h>
struct ble_gatt_chr
#include <ble_gatt.h>
struct ble_gatt_dsc
#include <ble_gatt.h>
struct ble_gatt_chr_def
#include <ble_gatt.h>

Public Members

const ble_uuid_t *uuid

Pointer to characteristic UUID; use BLE_UUIDxx_DECLARE macros to declare proper UUID; NULL if there are no more characteristics in the service.

ble_gatt_access_fn *access_cb

Callback that gets executed when this characteristic is read or written.

void *arg

Optional argument for callback.

struct ble_gatt_dsc_def *descriptors

Array of this characteristic’s descriptors.

NULL if no descriptors. Do not include CCCD; it gets added automatically if this characteristic’s notify or indicate flag is set.

ble_gatt_chr_flags flags

Specifies the set of permitted operations for this characteristic.

uint8_t min_key_size

Specifies minimum required key size to access this characteristic.

uint16_t *val_handle

At registration time, this is filled in with the characteristic’s value attribute handle.

struct ble_gatt_svc_def
#include <ble_gatt.h>

Public Members

uint8_t type

One of the following: o BLE_GATT_SVC_TYPE_PRIMARY - primary service o BLE_GATT_SVC_TYPE_SECONDARY - secondary service o 0 - No more services in this array.

const ble_uuid_t *uuid

Pointer to service UUID; use BLE_UUIDxx_DECLARE macros to declare proper UUID; NULL if there are no more characteristics in the service.

const struct ble_gatt_svc_def **includes

Array of pointers to other service definitions.

These services are reported as “included services” during service discovery. Terminate the array with NULL.

const struct ble_gatt_chr_def *characteristics

Array of characteristic definitions corresponding to characteristics belonging to this service.

struct ble_gatt_dsc_def
#include <ble_gatt.h>

Public Members

const ble_uuid_t *uuid

Pointer to descriptor UUID; use BLE_UUIDxx_DECLARE macros to declare proper UUID; NULL if there are no more characteristics in the service.

uint8_t att_flags

Specifies the set of permitted operations for this descriptor.

uint8_t min_key_size

Specifies minimum required key size to access this descriptor.

ble_gatt_access_fn *access_cb

Callback that gets executed when the descriptor is read or written.

void *arg

Optional argument for callback.

struct ble_gatt_access_ctxt
#include <ble_gatt.h>

Context for an access to a GATT characteristic or descriptor.

When a client reads or writes a locally registered characteristic or descriptor, an instance of this struct gets passed to the application callback.

Public Members

uint8_t op

Indicates the gatt operation being performed.

This is equal to one of the following values: o BLE_GATT_ACCESS_OP_READ_CHR o BLE_GATT_ACCESS_OP_WRITE_CHR o BLE_GATT_ACCESS_OP_READ_DSC o BLE_GATT_ACCESS_OP_WRITE_DSC

struct os_mbuf *om

A container for the GATT access data.

o For reads: The application populates this with the value of the characteristic or descriptor being read. o For writes: This is already populated with the value being written by the peer. If the application wishes to retain this mbuf for later use, the access callback must set this pointer to NULL to prevent the stack from freeing it.

union ble_gatt_access_ctxt.[anonymous] [anonymous]

The GATT operation being performed dictates which field in this union is valid.

If a characteristic is being accessed, the chr field is valid. Otherwise a descriptor is being accessed, in which case the dsc field is valid.

struct ble_gatt_register_ctxt
#include <ble_gatt.h>

Context passed to the registration callback; represents the GATT service, characteristic, or descriptor being registered.

Public Members

uint8_t op

Indicates the gatt registration operation just performed.

This is equal to one of the following values: o BLE_GATT_REGISTER_OP_SVC o BLE_GATT_REGISTER_OP_CHR o BLE_GATT_REGISTER_OP_DSC

union ble_gatt_register_ctxt.[anonymous] [anonymous]

The value of the op field determines which field in this union is valid.