| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| #ifndef H_BLE_GATT_ |
| #define H_BLE_GATT_ |
| |
| /** |
| * @brief Bluetooth Generic Attribute Profile (GATT) |
| * @defgroup bt_gatt Bluetooth Generic Attribute Profile (GATT) |
| * @ingroup bt_host |
| * @{ |
| */ |
| |
| #include <inttypes.h> |
| #include "host/ble_att.h" |
| #include "host/ble_uuid.h" |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| struct ble_hs_conn; |
| struct ble_att_error_rsp; |
| struct ble_hs_cfg; |
| |
| #define BLE_GATT_REGISTER_OP_SVC 1 |
| #define BLE_GATT_REGISTER_OP_CHR 2 |
| #define BLE_GATT_REGISTER_OP_DSC 3 |
| |
| #define BLE_GATT_SVC_UUID16 0x1801 |
| #define BLE_GATT_DSC_CLT_CFG_UUID16 0x2902 |
| |
| #define BLE_GATT_CHR_PROP_BROADCAST 0x01 |
| #define BLE_GATT_CHR_PROP_READ 0x02 |
| #define BLE_GATT_CHR_PROP_WRITE_NO_RSP 0x04 |
| #define BLE_GATT_CHR_PROP_WRITE 0x08 |
| #define BLE_GATT_CHR_PROP_NOTIFY 0x10 |
| #define BLE_GATT_CHR_PROP_INDICATE 0x20 |
| #define BLE_GATT_CHR_PROP_AUTH_SIGN_WRITE 0x40 |
| #define BLE_GATT_CHR_PROP_EXTENDED 0x80 |
| |
| #define BLE_GATT_ACCESS_OP_READ_CHR 0 |
| #define BLE_GATT_ACCESS_OP_WRITE_CHR 1 |
| #define BLE_GATT_ACCESS_OP_READ_DSC 2 |
| #define BLE_GATT_ACCESS_OP_WRITE_DSC 3 |
| |
| #define BLE_GATT_CHR_F_BROADCAST 0x0001 |
| #define BLE_GATT_CHR_F_READ 0x0002 |
| #define BLE_GATT_CHR_F_WRITE_NO_RSP 0x0004 |
| #define BLE_GATT_CHR_F_WRITE 0x0008 |
| #define BLE_GATT_CHR_F_NOTIFY 0x0010 |
| #define BLE_GATT_CHR_F_INDICATE 0x0020 |
| #define BLE_GATT_CHR_F_AUTH_SIGN_WRITE 0x0040 |
| #define BLE_GATT_CHR_F_RELIABLE_WRITE 0x0080 |
| #define BLE_GATT_CHR_F_AUX_WRITE 0x0100 |
| #define BLE_GATT_CHR_F_READ_ENC 0x0200 |
| #define BLE_GATT_CHR_F_READ_AUTHEN 0x0400 |
| #define BLE_GATT_CHR_F_READ_AUTHOR 0x0800 |
| #define BLE_GATT_CHR_F_WRITE_ENC 0x1000 |
| #define BLE_GATT_CHR_F_WRITE_AUTHEN 0x2000 |
| #define BLE_GATT_CHR_F_WRITE_AUTHOR 0x4000 |
| |
| #define BLE_GATT_SVC_TYPE_END 0 |
| #define BLE_GATT_SVC_TYPE_PRIMARY 1 |
| #define BLE_GATT_SVC_TYPE_SECONDARY 2 |
| |
| /*** @client. */ |
| struct ble_gatt_error { |
| uint16_t status; |
| uint16_t att_handle; |
| }; |
| |
| struct ble_gatt_svc { |
| uint16_t start_handle; |
| uint16_t end_handle; |
| ble_uuid_any_t uuid; |
| }; |
| |
| struct ble_gatt_attr { |
| uint16_t handle; |
| uint16_t offset; |
| struct os_mbuf *om; |
| }; |
| |
| struct ble_gatt_chr { |
| uint16_t def_handle; |
| uint16_t val_handle; |
| uint8_t properties; |
| ble_uuid_any_t uuid; |
| }; |
| |
| struct ble_gatt_dsc { |
| uint16_t handle; |
| ble_uuid_any_t uuid; |
| }; |
| |
| 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); |
| |
| /** |
| * 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_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 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_reliable_attr_fn(uint16_t conn_handle, |
| const struct ble_gatt_error *error, |
| struct ble_gatt_attr *attrs, |
| uint8_t num_attrs, void *arg); |
| |
| 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); |
| |
| /** |
| * Initiates GATT procedure: Exchange MTU. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_exchange_mtu(uint16_t conn_handle, |
| ble_gatt_mtu_fn *cb, void *cb_arg); |
| |
| /** |
| * Initiates GATT procedure: Discover All Primary Services. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param 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 Primary Service by Service UUID. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param service_uuid128 The 128-bit UUID of the service to discover. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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: Find Included Services. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param start_handle The handle to begin the search at (generally |
| * the service definition handle). |
| * @param end_handle The handle to end the search at (generally the |
| * last handle in the service). |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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: Discover All Characteristics of a Service. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param start_handle The handle to begin the search at (generally |
| * the service definition handle). |
| * @param end_handle The handle to end the search at (generally the |
| * last handle in the service). |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 Characteristics by UUID. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param start_handle The handle to begin the search at (generally |
| * the service definition handle). |
| * @param end_handle The handle to end the search at (generally the |
| * last handle in the service). |
| * @param chr_uuid128 The 128-bit UUID of the characteristic to |
| * discover. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 All Characteristic Descriptors. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param chr_val_handle The handle of the characteristic value |
| * attribute. |
| * @param chr_end_handle The last handle in the characteristic |
| * definition. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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: Read Characteristic Value. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to read. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_read(uint16_t conn_handle, uint16_t attr_handle, |
| ble_gatt_attr_fn *cb, void *cb_arg); |
| |
| /** |
| * Initiates GATT procedure: Read Using Characteristic UUID. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param start_handle The first handle to search (generally the |
| * handle of the service definition). |
| * @param end_handle The last handle to search (generally the |
| * last handle in the service definition). |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 Long Characteristic Values. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param handle The handle of the characteristic value to read. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 Multiple Characteristic Values. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param handles An array of 16-bit attribute handles to read. |
| * @param num_handles The number of entries in the "handles" array. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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: Write Without Response. This function consumes |
| * the supplied mbuf regardless of the outcome. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to write |
| * to. |
| * @param txom The value to write to the characteristic. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to write |
| * to. |
| * @param value The value to write to the characteristic. |
| * @param value_len The number of bytes to write. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 Characteristic Value. This function |
| * consumes the supplied mbuf regardless of the outcome. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to write |
| * to. |
| * @param txom The value to write to the characteristic. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 (flat buffer version). |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to write |
| * to. |
| * @param value The value to write to the characteristic. |
| * @param value_len The number of bytes to write. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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 Long Characteristic Values. This function |
| * consumes the supplied mbuf regardless of the outcome. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param attr_handle The handle of the characteristic value to write |
| * to. |
| * @param txom The value to write to the characteristic. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param cb_arg The optional argument to pass to the callback |
| * function. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| 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: Reliable Writes. This function consumes the |
| * supplied mbufs regardless of the outcome. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param 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. |
| * @param num_attrs The number of characteristics to write; equal |
| * to the number of elements in the 'attrs' |
| * array. |
| * @param cb The function to call to report procedure status |
| * updates; null for no callback. |
| * @param 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); |
| |
| /** |
| * Sends a "free-form" characteristic notification. This function consumes the |
| * supplied mbuf regardless of the outcome. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param chr_val_handle The attribute handle to indicate in the |
| * outgoing notification. |
| * @param txom The value to write to the characteristic. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_notify_custom(uint16_t conn_handle, uint16_t att_handle, |
| struct os_mbuf *om); |
| |
| /** |
| * Sends a characteristic notification. The content of the message is read |
| * from the specified characteristic. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param chr_val_handle The value attribute handle of the |
| * characteristic to include in the outgoing |
| * notification. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_notify(uint16_t conn_handle, uint16_t chr_val_handle); |
| |
| /** |
| * Sends a characteristic indication. The content of the message is read from |
| * the specified characteristic. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param chr_val_handle The value attribute handle of the |
| * characteristic to include in the outgoing |
| * indication. |
| * @param txom The data to include in the indication. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_indicate_custom(uint16_t conn_handle, uint16_t chr_val_handle, |
| struct os_mbuf *txom); |
| |
| /** |
| * Sends a characteristic indication. The content of the message is read from |
| * the specified characteristic. |
| * |
| * @param conn_handle The connection over which to execute the |
| * procedure. |
| * @param chr_val_handle The value attribute handle of the |
| * characteristic to include in the outgoing |
| * indication. |
| * |
| * @return 0 on success; nonzero on failure. |
| */ |
| int ble_gattc_indicate(uint16_t conn_handle, uint16_t chr_val_handle); |
| |
| int ble_gattc_init(void); |
| |
| /*** @server. */ |
| |
| struct ble_gatt_access_ctxt; |
| 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; |
| |
| struct ble_gatt_chr_def { |
| /** |
| * Pointer to characteristic UUID; use BLE_UUIDxx_DECLARE macros to declare |
| * proper UUID; NULL if there are no more characteristics in the service. |
| */ |
| const ble_uuid_t *uuid; |
| |
| /** |
| * Callback that gets executed when this characteristic is read or |
| * written. |
| */ |
| ble_gatt_access_fn *access_cb; |
| |
| /** Optional argument for callback. */ |
| void *arg; |
| |
| /** |
| * 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. |
| */ |
| struct ble_gatt_dsc_def *descriptors; |
| |
| /** Specifies the set of permitted operations for this characteristic. */ |
| ble_gatt_chr_flags flags; |
| |
| /** Specifies minimum required key size to access this characteristic. */ |
| uint8_t min_key_size; |
| |
| /** |
| * At registration time, this is filled in with the characteristic's value |
| * attribute handle. |
| */ |
| uint16_t *val_handle; |
| }; |
| |
| struct ble_gatt_svc_def { |
| /** |
| * 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. |
| */ |
| uint8_t type; |
| |
| /** |
| * Pointer to service UUID; use BLE_UUIDxx_DECLARE macros to declare |
| * proper UUID; NULL if there are no more characteristics in the service. |
| */ |
| const ble_uuid_t *uuid; |
| |
| /** |
| * 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_svc_def **includes; |
| |
| /** |
| * Array of characteristic definitions corresponding to characteristics |
| * belonging to this service. |
| */ |
| const struct ble_gatt_chr_def *characteristics; |
| }; |
| |
| struct ble_gatt_dsc_def { |
| /** |
| * Pointer to descriptor UUID; use BLE_UUIDxx_DECLARE macros to declare |
| * proper UUID; NULL if there are no more characteristics in the service. |
| */ |
| const ble_uuid_t *uuid; |
| |
| /** Specifies the set of permitted operations for this descriptor. */ |
| uint8_t att_flags; |
| |
| /** Specifies minimum required key size to access this descriptor. */ |
| uint8_t min_key_size; |
| |
| /** Callback that gets executed when the descriptor is read or written. */ |
| ble_gatt_access_fn *access_cb; |
| |
| /** Optional argument for callback. */ |
| void *arg; |
| }; |
| |
| /** |
| * 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. |
| */ |
| struct ble_gatt_access_ctxt { |
| /** |
| * 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 |
| */ |
| uint8_t op; |
| |
| /** |
| * 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. |
| */ |
| struct os_mbuf *om; |
| |
| /** |
| * 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. |
| */ |
| union { |
| /** |
| * The characteristic definition corresponding to the characteristic |
| * being accessed. This is what the app registered at startup. |
| */ |
| const struct ble_gatt_chr_def *chr; |
| |
| /** |
| * The descriptor definition corresponding to the descriptor being |
| * accessed. This is what the app registered at startup. |
| */ |
| const struct ble_gatt_dsc_def *dsc; |
| }; |
| }; |
| |
| /** |
| * Context passed to the registration callback; represents the GATT service, |
| * characteristic, or descriptor being registered. |
| */ |
| struct ble_gatt_register_ctxt { |
| /** |
| * 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 |
| */ |
| uint8_t op; |
| |
| /** |
| * The value of the op field determines which field in this union is valid. |
| */ |
| union { |
| /** Service; valid if op == BLE_GATT_REGISTER_OP_SVC. */ |
| struct { |
| /** The ATT handle of the service definition attribute. */ |
| uint16_t handle; |
| |
| /** |
| * The service definition representing the service being |
| * registered. |
| */ |
| const struct ble_gatt_svc_def *svc_def; |
| } svc; |
| |
| /** Characteristic; valid if op == BLE_GATT_REGISTER_OP_CHR. */ |
| struct { |
| /** The ATT handle of the characteristic definition attribute. */ |
| uint16_t def_handle; |
| |
| /** The ATT handle of the characteristic value attribute. */ |
| uint16_t val_handle; |
| |
| /** |
| * The characteristic definition representing the characteristic |
| * being registered. |
| */ |
| const struct ble_gatt_chr_def *chr_def; |
| |
| /** |
| * The service definition corresponding to the characteristic's |
| * parent service. |
| */ |
| const struct ble_gatt_svc_def *svc_def; |
| } chr; |
| |
| /** Descriptor; valid if op == BLE_GATT_REGISTER_OP_DSC. */ |
| struct { |
| /** The ATT handle of the descriptor definition attribute. */ |
| uint16_t handle; |
| |
| /** |
| * The descriptor definition corresponding to the descriptor being |
| * registered. |
| */ |
| const struct ble_gatt_dsc_def *dsc_def; |
| |
| /** |
| * The characteristic definition corresponding to the descriptor's |
| * parent characteristic. |
| */ |
| const struct ble_gatt_chr_def *chr_def; |
| |
| /** |
| * The service definition corresponding to the descriptor's |
| * grandparent service |
| */ |
| const struct ble_gatt_svc_def *svc_def; |
| } dsc; |
| }; |
| }; |
| |
| typedef void ble_gatt_register_fn(struct ble_gatt_register_ctxt *ctxt, |
| void *arg); |
| |
| /** |
| * Queues a set of service definitions for registration. All services queued |
| * in this manner get registered when ble_gatts_start() is called. |
| * |
| * @param svcs An array of service definitions to queue for |
| * registration. This array must be |
| * terminated with an entry whose 'type' |
| * equals 0. |
| * |
| * @return 0 on success; |
| * BLE_HS_ENOMEM on heap exhaustion. |
| */ |
| int ble_gatts_add_svcs(const struct ble_gatt_svc_def *svcs); |
| |
| /** |
| * 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(). |
| * |
| * @param handle Handle of service |
| * @param visible non-zero if service should be visible |
| * |
| * @return 0 on success; |
| * BLE_HS_ENOENT if service wasn't found. |
| */ |
| int ble_gatts_svc_set_visibility(uint16_t handle, int visible); |
| |
| /** |
| * 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. |
| * |
| * @param defs The service array containing the resource |
| * definitions to be counted. |
| * |
| * @return 0 on success; |
| * BLE_HS_EINVAL if the svcs array contains an |
| * invalid resource definition. |
| */ |
| int ble_gatts_count_cfg(const struct ble_gatt_svc_def *defs); |
| |
| /** |
| * Send notification (or indication) to any connected devices that have |
| * subscribed for notification (or indication) for specified characteristic. |
| * |
| * @param chr_def_handle Characteristic definition handle |
| */ |
| void ble_gatts_chr_updated(uint16_t chr_def_handle); |
| |
| /** |
| * Retrieves the attribute handle associated with a local GATT service. |
| * |
| * @param uuid The UUID of the service to look up. |
| * @param out_handle On success, populated with the handle of the |
| * service attribute. Pass null if you don't |
| * need this value. |
| * |
| * @return 0 on success; |
| * BLE_HS_ENOENT if the specified service could |
| * not be found. |
| */ |
| int ble_gatts_find_svc(const ble_uuid_t *uuid, uint16_t *out_handle); |
| |
| /** |
| * Retrieves the pair of attribute handles associated with a local GATT |
| * characteristic. |
| * |
| * @param svc_uuid The UUID of the parent service. |
| * @param chr_uuid The UUID of the characteristic to look up. |
| * @param out_def_handle On success, populated with the handle |
| * of the characteristic definition attribute. |
| * Pass null if you don't need this value. |
| * @param out_val_handle On success, populated with the handle |
| * of the characteristic value attribute. |
| * Pass null if you don't need this value. |
| * |
| * @return 0 on success; |
| * BLE_HS_ENOENT if the specified service or |
| * characteristic could not be found. |
| */ |
| 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 attribute handle associated with a local GATT descriptor. |
| * |
| * @param svc_uuid The UUID of the grandparent service. |
| * @param chr_uuid The UUID of the parent characteristic. |
| * @param dsc_uuid The UUID of the descriptor ro look up. |
| * @param out_handle On success, populated with the handle |
| * of the descripytor attribute. Pass null if |
| * you don't need this value. |
| * |
| * @return 0 on success; |
| * BLE_HS_ENOENT if the specified service, |
| * characteristic, or descriptor could not be |
| * found. |
| */ |
| 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); |
| |
| typedef void (*ble_gatt_svc_foreach_fn)(const struct ble_gatt_svc_def *svc, |
| uint16_t handle, |
| uint16_t end_group_handle); |
| |
| /** |
| * Prints dump of local GATT database. This is useful to log local state of |
| * database in human readable form. |
| */ |
| void ble_gatts_show_local(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_reset(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. |
| */ |
| int ble_gatts_start(void); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| /** |
| * @} |
| */ |
| |
| #endif |