.. _完整GATT服务(GATT_complete)介绍:

完整GATT服务(GATT_complete)介绍
=======================================

简介
########################

    1. 本章主要介绍基于完整GATT服务的主从收发接口(GATT_completion),该服务有以下特点:
        - 基于标准的GATT协议,具有完整的GATT profile
        - 从机支持HOGP协议,可连接手机或者其他主机设备
        - 支持私有协议,支持修改广播包内容以及参数
        - 支持多通道收发数据,通道由profile决定
        - **不支持主从切换**

    2. 该主从收发接口受上层应用 **vble_comlpete** 管理,应用示例可参考:
        - 遥控器HID从机应用;
        - 遥控器Dongle主机应用;

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

从机相关参数配置
#######################
    
    从机运行需要在bt_ble.h文件中使能宏定义TRANS_DATA_HID_EN,涉及的文件如下:
        - apps/app/bsp/common/bt_commonn/hid/examples/keyboard/app_hid_comm.c
        - apps/app/bsp/common/bt_commonn/hid/modules/bt/ble_hogp.c
        - apps/app/bsp/common/bt_common/hid/modules/bt/ble_hogp_profile.h

        .. image:: bt_ble_hid_en_macro.png
            :alt: "基于完整GATT服务的从机使能“
            :align: center
        .. centered:: 基于完整GATT服务的从机使能

    配置文件为ble_hogp.c,其中参数:
        * ATT_LOCAL_MTU_SIZE:ATT发送包长
        * ADV_INTERVAL_MIN:未连接广播周期(unit:0.625ms)
        * hogp_connection_update_enable:从机使能参数请求更新控制
        * Peripheral_Preferred_Connection_Parameters:连接参数表,可选择修改:
            - conn_interval:连接间隔(unit:1.25ms)
            - latency:连接延迟(unit:interval)
            - timeout:连接超时时间(unit:10ms)

        .. image:: hogp_conn_parm.png
            :alt: "图1.1 hogp连接参数介绍“
            :align: center
        .. centered:: 图1.1 hogp连接参数介绍

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

从机profile相关配置
#######################
    profile配置参考make_gatt_services工具相关文档说明。但是要注意以下问题:
    
    .. note:: AW30N SDK的配置文件以及函数路径和读写回调函数位置与工具文档描述有差异;
        
        工具文档中描述的profile文件为ble_trans_profile.h,SDK配置profile的文件路径为apps/app/bsp/common/bt_common/hid/modules/bt/ble_hogp_profile.h
        att_read_callback函数和att_write_callback函数位于apps/app/bsp/common/bt_commonn/hid/modules/bt/ble_hogp.c


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

广播包修改
######################################
    ble的广播包分为adv包和rsp包。这其内容可在以下位置修改:
    
    .. image:: advertise_packet.png
            :alt: "广播包生成函数“
            :align: center
    .. centered:: 广播包生成函数


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. _定向广播:

定向广播
######################################
    ble_hid从机配置有配对绑定时,可发起定向广播,其中定向广播支持类型包括:::
        ADV_DIRECT_IND: 1.28s超时,interval固定2ms
        ADV_DIRECT_IND_LOW: interval 和 channel 跟普通广播设置一样
    
    在开启定向广播时,用户可在定向广播回调中执行自定义操作

    .. image:: directional_adv.png
            :alt: "定向广播回调“
            :align: center
    .. centered:: 定向广播回调


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

主机相关参数配置
#######################

    主机运行需要在bt_ble.h文件中使能宏定义TRANS_DATA_SPPLE_EN,涉及的文件如下:
        - apps/app/bsp/common/bt_commonn/spp_and_le/examples/dongle/ble_dg_central.c
        - apps/app/bsp/common/bt_commonn/spp_and_le/examples/dongle/app_dongle_comm.c
        - apps/app/bsp/common/bt_common/spp_and_le/modules/user_cfg.c

        .. image:: bt_ble_dongle_en_macro.png
            :alt: "基于完整GATT服务的主机使能“
            :align: center
        .. centered:: 基于完整GATT服务的主机使能

    配置文件为ble_dg_central.c,其中参数:
        * ATT_LOCAL_MTU_SIZE:ATT发送包长
        * SET_SCAN_INTERVAL:搜索周期大小(unit:0.625ms)
        * SET_SCAN_WINDOW:搜索窗口大小(unit:0.625ms)
        * SET_CONN_INTERVAL:连接周期大小(unit:1.25ms)
        * SET_CONN_LATENCY:连接延迟
        * SET_CONN_TIMEOUT:连接超时时间(unit:10ms)
        * dg_test_remoter_name:搜索的设备名(如下截图配对的从机名)

        .. image:: ble_dg_central.png
            :alt: "主机连接参数配置 “
            :align: center
        .. centered:: 主机连接参数配置

        .. image:: slave_name.png
            :alt: "配对从机名配置 “
            :align: center
        .. centered:: 配对从机名配置

    在user_cfg.c文件中可以配置BLE主机蓝牙名:

        .. image:: spp_user_cfg.png
            :alt: "主机蓝牙名配置 “
            :align: center
        .. centered:: 主机蓝牙名配置

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

公共接口
#######################

函数void ble_clock_init(void)
****************************************************************
    .. note:: 该函数实现初始化蓝牙时钟,使用蓝牙功能前必须要调用!

        1. 返回值:无;

函数int get_buffer_vaild_len(void \*priv)
****************************************************
    .. note:: 该函数实现查询蓝牙当前可写入缓存的发送数据长度

        1. priv:传0即可;
        2. 返回值:当前可发送的数据长度;

.. _从机相关接口:

从机相关接口
#######################

函数void ble_slave_init(void)
****************************************************************
    .. note:: 该函数实现蓝牙从机profile服务、广播和协议栈的初始化;

        1. 返回值:无;

函数int ble_slave_data_send(u16 att_handle, u8 \*data, u16 len)
*****************************************************************
    .. note:: 该函数实现从机选择att_handle发送数据给远端,att_handle由profile定义;

        1. att_handle:发送的att通道;
        2. data:发送的数据buff;
        3. len:发送的数据长度;
        4. 返回值:0:成功 非0:失败;

函数int hogp_att_write_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t transaction_mode, uint16_t offset, uint8_t \*buffer, uint16_t buffer_size)
******************************************************************************************************************************************************************************
    .. note:: 该函数实现主机操作ATT write时的协议栈回调处理;主机发送给从机的数据,由此函数接收

        1. att_handle:主机write用到的att通道;
        2. buffer:数据接收buff;
        3. buffer_size:数据接收长度;
        4. 返回值:0:成功 非0:失败;

        .. image:: hogp_att_write_callback.png
            :alt: "图1.2 从机接收主机数据回调函数“
            :align: center
        .. centered:: 图1.2 从机接收主机数据回调函数

函数ble_cmd_ret_e ble_op_conn_param_request(con_handle, con_param)
************************************************************************
    . note:: 该函数实现从机请求更新连接参数,该函数在ble_slave.c已封到应用层,用户可参考该方法进行使用。其中参数: ::

        1. con_handle:hid从机应用下的con_handle, 传hogp_con_handle;
        2. con_parm:连接参数;
        3. 返回值:0 失败  1更新成功


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. _主机相关接口:

主机相关接口
#######################

函数void ble_master_init(void)
****************************************************************
    .. note:: 该函数实现蓝牙主机搜索功能配置和协议栈的初始化;

        1. 返回值:无;

函数int ble_master_data_send(u16 att_handle, u8 \*data, u16 len)
*****************************************************************
    .. note:: 该函数实现主机选择att_handle发送数据给远端,att_handle由profile定义

        1. att_handle:发送的att通道;
        2. data:发送的数据buff;
        3. len:发送的数据长度;
        4. 返回值:0:成功 非0:失败;

函数int dg_central_event_packet_handler(int event, u8 \*packet, u16 size, u8 \*ext_param)
*******************************************************************************************
    .. note:: 该函数为主机接收从机数据回调处理

        1. report_data->value_handle:从机发送用到的att通道;
        2. report_data->blob:接收数据buff;
        3. report_data->blob_length:接收数据长度;
        4. 返回值:0:成功 非0:失败;

        .. image:: dg_event_handle.png
            :alt: "图2.2 主机接收从机数据回调函数“
            :align: center
        .. centered:: 图2.2 主机接收从机数据回调函数

函数ble_cmd_ret_e ble_op_conn_param_update(con_handle, con_param)
**********************************************************************
    . note:: 该函数实现主机更新连接参数,该函数在ble_master.c已封到应用层,用户可参考该方法进行使用。其中参数: ::

        1. con_handle:spp_and_le应用下的con_handle, 传gatt_server_conn_handle,可使用ble_comm_dev_get_handle()获取;
        2. con_parm:连接参数;
        3. 返回值:0 失败  1更新成功