aboutsummaryrefslogtreecommitdiff
path: root/inc/bluetooth/profile/profile_client.h
diff options
context:
space:
mode:
Diffstat (limited to 'inc/bluetooth/profile/profile_client.h')
-rw-r--r--inc/bluetooth/profile/profile_client.h611
1 files changed, 611 insertions, 0 deletions
diff --git a/inc/bluetooth/profile/profile_client.h b/inc/bluetooth/profile/profile_client.h
new file mode 100644
index 0000000..ce0ab96
--- /dev/null
+++ b/inc/bluetooth/profile/profile_client.h
@@ -0,0 +1,611 @@
+/**
+*****************************************************************************************
+* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
+*****************************************************************************************
+ * @file profile_client.h
+ * @brief Head file for profile client structure.
+ * @details Common data struct definition.
+ * @author ethan_su
+ * @date 2016-02-18
+ * @version v1.0
+ * *************************************************************************************
+ */
+
+/* Define to prevent recursive inclusion */
+#ifndef PROFILE_CLIENT_H
+#define PROFILE_CLIENT_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/*============================================================================*
+ * Header Files
+ *============================================================================*/
+#include "upperstack_config.h"
+#if F_BT_LE_GATT_CLIENT_SUPPORT
+#include "gatt.h"
+#include <bt_types.h>
+#include "gap_le.h"
+
+
+/** @defgroup GATT_CLIENT_API GATT Client API
+ * @brief GATT client API
+ * @{
+ */
+
+/*============================================================================*
+ * Macros
+ *============================================================================*/
+/** @defgroup GATT_Client_Exported_Macros GATT Client Exported Macros
+ * @{
+ */
+#define CLIENT_PROFILE_GENERAL_ID 0xff //!< General Client ID used by application, when directly calls the APIs of profile client layer. Distinguish with other specific client module.
+
+/** End of GATT_Client_Exported_Macros
+* @}
+*/
+/*============================================================================*
+ * Types
+ *============================================================================*/
+/** @defgroup GATT_Client_Exported_Types GATT Client Exported Types
+ * @{
+ */
+
+typedef uint8_t T_CLIENT_ID; //!< Client ID
+
+/* callback related data to inform application. */
+
+
+/** @brief Discovery state during discovery procedure.*/
+typedef enum
+{
+ DISC_STATE_IDLE,
+ DISC_STATE_SRV,
+ DISC_STATE_SRV_DONE,
+ DISC_STATE_RELATION,
+ DISC_STATE_RELATION_DONE,
+ DISC_STATE_CHAR,
+ DISC_STATE_CHAR_DONE,
+ DISC_STATE_CHAR_UUID16_DONE,
+ DISC_STATE_CHAR_UUID128_DONE,
+ DISC_STATE_CHAR_DESCRIPTOR,
+ DISC_STATE_CHAR_DESCRIPTOR_DONE,
+ DISC_STATE_FAILED
+} T_DISCOVERY_STATE;
+
+/** @brief Discovery result type*/
+typedef enum
+{
+ DISC_RESULT_ALL_SRV_UUID16,
+ DISC_RESULT_ALL_SRV_UUID128,
+ DISC_RESULT_SRV_DATA,
+ DISC_RESULT_CHAR_UUID16,
+ DISC_RESULT_CHAR_UUID128,
+ DISC_RESULT_CHAR_DESC_UUID16,
+ DISC_RESULT_CHAR_DESC_UUID128,
+ DISC_RESULT_RELATION_UUID16,
+ DISC_RESULT_RELATION_UUID128,
+ DISC_RESULT_BY_UUID16_CHAR,
+ DISC_RESULT_BY_UUID128_CHAR,
+} T_DISCOVERY_RESULT_TYPE;
+
+/** @brief GATT write type*/
+typedef enum
+{
+ GATT_WRITE_TYPE_REQ = 0x01, /**< ATT "Write Request" */
+ GATT_WRITE_TYPE_CMD = 0x02, /**< ATT "Write Command" */
+ GATT_WRITE_TYPE_SIGNED_CMD = 0x04 /**< ATT "Signed Write Command" */
+} T_GATT_WRITE_TYPE;
+
+typedef struct
+{
+ uint16_t att_handle; /**< The handle for the service declaration */
+ uint16_t end_group_handle; /**< The handle of the last attribute
+ within the service definition */
+ uint16_t uuid16; /**< 16 bit UUID */
+} T_GATT_SERVICE_ELEM16;
+
+typedef struct
+{
+ uint16_t att_handle; /**< The handle for the service declaration */
+ uint16_t end_group_handle;
+ /**< The handle of the last attribute within the service definition */
+ uint8_t uuid128[16]; /**< 128 bit UUID */
+} T_GATT_SERVICE_ELEM128;
+
+
+typedef struct
+{
+ uint16_t att_handle; /**< The handle for the service declaration */
+ uint16_t end_group_handle;
+ /**< The handle of the last attribute within the service definition */
+} T_GATT_SERVICE_BY_UUID_ELEM;
+
+/** @brief Characteristic declaration for 16 bit UUID.*/
+typedef struct
+{
+ uint16_t decl_handle; /**< Attribute handle */
+ uint16_t properties; /**< Characteristic Properties, high nibble is reserved */
+ uint16_t value_handle; /**< Characteristic Value Handle */
+ uint16_t uuid16; /**< 16-bit Bluetooth UUID for Characteristic Value */
+} T_GATT_CHARACT_ELEM16;
+
+/** @brief Characteristic declaration for 128 bit UUID.*/
+typedef struct
+{
+ uint16_t decl_handle; /**< Attribute handle */
+ uint16_t properties; /**< Characteristic Properties, high nibble is reserved */
+ uint16_t value_handle; /**< Characteristic Value Handle */
+ uint8_t uuid128[16]; /**< 128-bit UUID for Characteristic Value */
+} T_GATT_CHARACT_ELEM128;
+
+/** @brief Characteristic descriptor for 16 bit UUID.*/
+typedef struct
+{
+ uint16_t handle; /**< Attribute handle */
+ uint16_t uuid16; /**< 16 bit UUID */
+} T_GATT_CHARACT_DESC_ELEM16;
+
+/** @brief Characteristic descriptor for 128 bit UUID.*/
+typedef struct
+{
+ uint16_t handle; /**< Attribute handle */
+ uint8_t uuid128[16]; /**< 128 bit UUID */
+} T_GATT_CHARACT_DESC_ELEM128;
+
+/** @brief Relationship discovery for 16 bit UUID.*/
+typedef struct
+{
+ uint16_t decl_handle;
+ uint16_t att_handle;
+ uint16_t end_group_handle;
+ uint16_t uuid16;
+} T_GATT_RELATION_ELEM16;
+
+/** @brief Relationship discovery for 128 bit UUID.*/
+typedef struct
+{
+ uint16_t decl_handle;
+ uint16_t att_handle;
+ uint16_t end_group_handle;
+ uint8_t uuid128[16];
+} T_GATT_RELATION_ELEM128;
+
+/** @brief Discovery result data*/
+typedef union
+{
+ T_GATT_SERVICE_ELEM16 *p_srv_uuid16_disc_data;
+ T_GATT_SERVICE_ELEM128 *p_srv_uuid128_disc_data;
+ T_GATT_SERVICE_BY_UUID_ELEM *p_srv_disc_data;
+ T_GATT_CHARACT_ELEM16 *p_char_uuid16_disc_data;
+ T_GATT_CHARACT_ELEM128 *p_char_uuid128_disc_data;
+ T_GATT_CHARACT_DESC_ELEM16 *p_char_desc_uuid16_disc_data;
+ T_GATT_CHARACT_DESC_ELEM128 *p_char_desc_uuid128_disc_data;
+ T_GATT_RELATION_ELEM16 *p_relation_uuid16_disc_data;
+ T_GATT_RELATION_ELEM128 *p_relation_uuid128_disc_data;
+} T_DISCOVERY_RESULT_DATA;
+
+/** @defgroup General_cb_data General Client Callback Data
+ * @{
+ */
+/** @brief The callback data of CLIENT_APP_CB_TYPE_DISC_STATE.
+ *
+ * Discovery procedure related data to inform application
+ */
+typedef struct
+{
+ T_DISCOVERY_STATE disc_state;
+} T_DISC_STATE_CB_DATA;
+
+/** @brief The callback data of CLIENT_APP_CB_TYPE_DISC_RESULT.
+ *
+ * Discovery result data will be sent to upper through the callback
+ */
+typedef struct
+{
+ T_DISCOVERY_RESULT_TYPE result_type;
+ T_DISCOVERY_RESULT_DATA result_data;
+} T_DISC_RESULT_CB_DATA;
+
+
+/** @brief The callback type of T_CLIENT_APP_CB_DATA.
+ *
+ * Message data type, when data sent to app directly
+ */
+typedef enum
+{
+ CLIENT_APP_CB_TYPE_DISC_STATE,
+ CLIENT_APP_CB_TYPE_DISC_RESULT
+} T_CLIENT_CB_TYPE;
+
+/** @brief The callback data of T_CLIENT_APP_CB_DATA.
+ *
+ * Client received data from server, when no specific client registered, will be sent to app directly
+ */
+typedef union
+{
+ T_DISC_STATE_CB_DATA disc_state_data;
+ T_DISC_RESULT_CB_DATA disc_result_data;
+} T_CLIENT_CB_DATA;
+
+/** @brief The General Client Callback Data Struct.
+ *
+ * Callback data sent to application directly from client, include type and content
+ */
+typedef struct
+{
+ T_CLIENT_CB_TYPE cb_type;
+ T_CLIENT_CB_DATA cb_content;
+} T_CLIENT_APP_CB_DATA;
+/** End of General_cb_data
+ * @}
+ */
+
+
+/** @defgroup pfnSpecificClientAppCB_t1 General Client Callback Function Point Definition
+ * @{ function ponter used in each specific profile, to send events to application
+ */
+typedef T_APP_RESULT(*P_FUN_GENERAL_APP_CB)(T_CLIENT_ID client_id, uint8_t conn_id, void *p_data);
+/** End of pfnSpecificClientAppCB_t1
+ * @}
+ */
+
+
+/** @defgroup Specific_cb Specific Client Callback Function Point Definition
+ * @{ Function ponter used in each specific client module, to send events to specific client module.
+ */
+typedef void (*P_FUN_DISCOVER_STATE_CB)(uint8_t conn_id, T_DISCOVERY_STATE discovery_state);
+typedef void (*P_FUN_DISCOVER_RESULT_CB)(uint8_t conn_id, T_DISCOVERY_RESULT_TYPE result_type,
+ T_DISCOVERY_RESULT_DATA result_data);
+typedef void (*P_FUN_READ_RESULT_CB)(uint8_t conn_id, uint16_t cause, uint16_t handle,
+ uint16_t value_size, uint8_t *p_value);
+typedef void (*P_FUN_WRITE_RESULT_CB)(uint8_t conn_id, T_GATT_WRITE_TYPE type, uint16_t handle,
+ uint16_t cause, uint8_t credits);
+typedef T_APP_RESULT(*P_FUN_NOTIFY_IND_RESULT_CB)(uint8_t conn_id, bool notify, uint16_t handle,
+ uint16_t value_size, uint8_t *p_value);
+typedef void (*P_FUN_DISCONNECT_CB)(uint8_t conn_id);
+/** End of Specific_cb
+ * @}
+ */
+
+/** @defgroup T_FUN_CLIENT_CBS Specific Client Callback Functions Struct
+ * @{
+ */
+typedef struct
+{
+ P_FUN_DISCOVER_STATE_CB discover_state_cb; //!< Discovery state callback function pointer
+ P_FUN_DISCOVER_RESULT_CB discover_result_cb; //!< Discovery reault callback function pointer
+ P_FUN_READ_RESULT_CB read_result_cb; //!< Read response callback function pointer
+ P_FUN_WRITE_RESULT_CB write_result_cb; //!< Write result callback function pointer
+ P_FUN_NOTIFY_IND_RESULT_CB notify_ind_result_cb;//!< Notify Indication callback function pointer
+ P_FUN_DISCONNECT_CB disconnect_cb; //!< Disconnection callback function pointer
+} T_FUN_CLIENT_CBS;
+/** End of T_FUN_CLIENT_CBS * @} */
+
+/** End of GATT_Client_Exported_Types
+* @}
+*/
+/*============================================================================*
+ * Functions
+ *============================================================================*/
+/** @defgroup GATT_Client_Exported_Functions GATT Client Exported Functions
+ * @{
+ */
+/**
+ * @brief Initialize parameters of GATT client.
+ *
+ * @param[in] client_num Set the number of clients that needs to register.
+ * @retval None
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void app_le_profile_init(void)
+ {
+ client_init(1);
+ simple_ble_client_id = simp_ble_add_client(app_client_callback);
+ client_register_general_client_cb(app_client_callback);
+ }
+ * \endcode
+ */
+void client_init(uint8_t client_num);
+
+/**
+ * @brief Used by application, register general client callback.
+ * @param[in] p_fun_cb Function offered by application.
+ * @retval None
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ void app_le_profile_init(void)
+ {
+ client_init(1);
+ simple_ble_client_id = simp_ble_add_client(app_client_callback);
+ client_register_general_client_cb(app_client_callback);
+ }
+ * \endcode
+ */
+void client_register_general_client_cb(P_FUN_GENERAL_APP_CB p_fun_cb);
+
+/**
+ * @brief Used by specific client, register callback.
+ * @param[in,out] p_out_client_id Client ID generated for registered specific client module.
+ * @param[in] client_cbs Callback functions implemented in specific client module.
+ * @retval true Register successful.
+ * @retval false Register failed.
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+
+ T_CLIENT_ID simp_ble_add_client(P_FUN_GENERAL_APP_CB app_cb, uint8_t link_num)
+ {
+ uint16_t size;
+ if (link_num > SIMP_MAX_LINKS)
+ {
+ APP_PRINT_ERROR1("simp_ble_add_client: invalid link_num %d", link_num);
+ return 0xff;
+ }
+ if (false == client_register_spec_client_cb(&simp_client, &simp_ble_client_cbs))
+ {
+ simp_client = CLIENT_PROFILE_GENERAL_ID;
+ APP_PRINT_ERROR0("simp_ble_add_client failed");
+ return simp_client;
+ }
+ APP_PRINT_INFO1("simp_ble_add_client: simp_client %d", simp_client);
+
+ simp_client_cb = app_cb;
+ simp_link_num = link_num;
+ size = simp_link_num * sizeof(T_SIMP_LINK);
+ simp_table = os_mem_zalloc(RAM_TYPE_DATA_ON, size);
+
+ return simp_client;
+ }
+ * \endcode
+ */
+bool client_register_spec_client_cb(T_CLIENT_ID *p_out_client_id,
+ const T_FUN_CLIENT_CBS *client_cbs);
+
+/**
+ * @brief Send discovery all primary services request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_all_primary_srv_discovery(uint8_t conn_id, T_CLIENT_ID client_id);
+
+/**
+ * @brief Send discovery services by 16 bit UUID request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] uuid16 16 bit UUID.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_by_uuid_srv_discovery(uint8_t conn_id, T_CLIENT_ID client_id, uint16_t uuid16);
+
+/**
+ * @brief Send discovery services by 128 bit UUID request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] p_uuid128 128 bit UUID.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_by_uuid128_srv_discovery(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint8_t *p_uuid128);
+
+/**
+ * @brief Send discovery relationship services request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_relationship_discovery(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint16_t start_handle, uint16_t end_handle);
+
+/**
+ * @brief Send discovery characteristics request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_all_char_discovery(uint8_t conn_id, T_CLIENT_ID client_id, uint16_t start_handle,
+ uint16_t end_handle);
+
+/**
+ * @brief Send discovery characteristics request by caracteristic uuid.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @param[in] uuid16 16bit characteristic uuid to be searched.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_by_uuid_char_discovery(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint16_t start_handle,
+ uint16_t end_handle, uint16_t uuid16);
+/**
+ * @brief Send discovery characteristics request by caracteristic uuid.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @param[in] p_uuid128 128bit characteristic uuid to be searched.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_by_uuid128_char_discovery(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint16_t start_handle,
+ uint16_t end_handle, uint8_t *p_uuid128);
+/**
+ * @brief Send discovery characteristics descriptor request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @retval GAP_CAUSE_SUCCESS Discovery request success.
+ * @retval other Discovery request failed.
+ */
+T_GAP_CAUSE client_all_char_descriptor_discovery(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint16_t start_handle, uint16_t end_handle);
+
+/**
+ * @brief Read characteristic by handle request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] handle Request handle.
+ * @retval GAP_CAUSE_SUCCESS Read request success.
+ * @retval other Read request failed.
+ */
+T_GAP_CAUSE client_attr_read(uint8_t conn_id, T_CLIENT_ID client_id, uint16_t handle);
+
+/**
+ * @brief Read characteristic by 16 bit UUID request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] start_handle Start handle of range to be searched.
+ * @param[in] end_handle End handle of range to be searched.
+ * @param[in] uuid16 Request 16 bit UUID.
+ * @param[in] p_uuid128 Request 128 bit UUID.
+ * @retval GAP_CAUSE_SUCCESS Read request success.
+ * @retval other Read request failed.
+ */
+T_GAP_CAUSE client_attr_read_using_uuid(uint8_t conn_id, T_CLIENT_ID client_id,
+ uint16_t start_handle,
+ uint16_t end_handle, uint16_t uuid16, uint8_t *p_uuid128);
+/**
+ * @brief Write characteristic request.
+ * @param[in] conn_id Connection ID
+ * @param[in] client_id Client ID of specific client module.
+ * @param[in] write_type Type of write.
+ * @param[in] handle Attribute handle.
+ * @param[in] length Length of data to be written.
+ If write_type is GATT_WRITE_TYPE_REQ, range of length is from 0 to 512.
+ If write_type is GATT_WRITE_TYPE_CMD, range of length is from 0 to (mtu_size - 3).
+ If write_type is GATT_WRITE_TYPE_SIGNED_CMD, range of length is from 0 to (mtu_size - 15).
+ uint16_t mtu_size is acquired by le_get_conn_param(GAP_PARAM_CONN_MTU_SIZE, &mtu_size, conn_id).
+ * @param[in] p_data Point to the data to be written.
+ * @retval GAP_CAUSE_SUCCESS: Write request success.
+ * @retval other: Write request failed.
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ //if write_type is GATT_WRITE_TYPE_SIGNED_CMD, GAP_MSG_LE_GATT_SIGNED_STATUS_INFO will be notified to app
+ T_APP_RESULT app_gap_callback(uint8_t cb_type, void *p_cb_data)
+ {
+ T_APP_RESULT result = APP_RESULT_SUCCESS;
+ T_LE_CB_DATA cb_data;
+ memcpy(&cb_data, p_cb_data, sizeof(T_LE_CB_DATA));
+ APP_PRINT_TRACE1("app_gap_callback: cb_type = %d", cb_type);
+ switch (cb_type)
+ {
+ ...
+ case GAP_MSG_LE_GATT_SIGNED_STATUS_INFO:
+ APP_PRINT_INFO5("GAP_MSG_LE_GATT_SIGNED_STATUS_INFO:conn_id %d, cause 0x%x, update_local %d, local_sign_count %d,remote_sign_count %d",
+ cb_data.p_le_gatt_signed_status_info->conn_id,
+ cb_data.p_le_gatt_signed_status_info->cause,
+ cb_data.p_le_gatt_signed_status_info->update_local,
+ cb_data.p_le_gatt_signed_status_info->local_sign_count,
+ cb_data.p_le_gatt_signed_status_info->remote_sign_count);
+ break;
+ ...
+ }
+ }
+ * \endcode
+ */
+T_GAP_CAUSE client_attr_write(uint8_t conn_id, T_CLIENT_ID client_id,
+ T_GATT_WRITE_TYPE write_type,
+ uint16_t handle, uint16_t length, uint8_t *p_data);
+
+/**
+ * @brief Confirm from application when receive indication from server.
+ * @param[in] conn_id Connection ID indicate which link is.
+ * @retval true: Confirm OK.
+ * @retval false: Confirm failed.
+ */
+T_GAP_CAUSE client_attr_ind_confirm(uint8_t conn_id);
+
+/**
+ * @brief Get the header point of the notification data buffer.
+ * This function is used to get the header buffer point of the notification command data.
+ * This function only can be called in notify_ind_result_cb.
+ *
+ * @param[in] conn_id Connection id indicate which link is.
+ * @param[in,out] pp_buffer Pointer to the address of the buffer.
+ * @param[in,out] p_offset Pointer to the offset of the data.
+ * @return Buffer get result
+ * @retval true Success.
+ * @retval false Failed.
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ uint8_t *p_data_buf;
+ uint16_t data_offset;
+ static T_APP_RESULT simp_ble_client_notif_ind_result_cb(uint8_t conn_id, bool notify,
+ uint16_t handle,
+ uint16_t value_size, uint8_t *p_value)
+ {
+ ......
+ client_get_notify_data_buffer(conn_id, &p_data_buf, &data_offset);
+ return APP_RESULT_NOT_RELEASE;
+ }
+ void release(void)
+ {
+ if(p_data_buf != NULL)
+ {
+ gap_buffer_free(p_data_buf);
+ p_data_buf = NULL;
+ }
+ }
+ * \endcode
+ */
+bool client_get_notify_data_buffer(uint8_t conn_id, uint8_t **pp_buffer, uint16_t *p_offset);
+
+/**
+ * @brief Send the exchange MTU request.
+ * This function is used to send the exchange MTU request.
+ *
+ * @param[in] conn_id Connection id indicate which link is.
+ * @retval GAP_CAUSE_SUCCESS: Write request success.
+ * @retval other: Write request failed.
+ *
+ * <b>Example usage</b>
+ * \code{.c}
+ uint8_t *p_data_buf;
+ uint16_t data_offset;
+ static T_USER_CMD_PARSE_RESULT cmd_send_mtu_req(T_USER_CMD_PARSED_VALUE *p_parse_value)
+ {
+ T_GAP_CAUSE cause;
+ uint8_t conn_id = p_parse_value->dw_param[0];
+
+ cause = client_send_exchange_mtu_req(conn_id);
+ return (T_USER_CMD_PARSE_RESULT)cause;
+ }
+ * \endcode
+ */
+T_GAP_CAUSE client_send_exchange_mtu_req(uint8_t conn_id);
+
+/** End of GATT_Client_Exported_Functions
+* @}
+*/
+
+/** End of GATT_CLIENT_API
+* @}
+*/
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* PROFILE_CLIENT_H */
+