GAP的功能:
1、Advertising(广播)
设置/获取广播参数,启动/停止广播
2、Scan(扫描)
设置/获取扫描阐述,启动/停止扫描。
3、Connection(链接)
设置链接参数,创建链接,终止已建立的连接,更新连接参数
4、配对
设置配对参数,启动配对,使用passkey entry方式时输入/显示Passkey,删除绑定设备秘钥。
5、秘钥管理
根据设备地址和地址类型key entry,保存/加载绑定信息的秘钥,解析random address。
6、其他
1)设置GAP公共参数,例如device appearance和device name
2)获取支持的最大BLE链路数目
3)修改while list
4)生成/设置本地设备random address
5)配置本地设备identity address
6)等等
工程开发过程:
1、在GAP设置BLE设备相关的信息
2、注册服务,设置服务属性9(读、写等)
3、在注册好的回调函数接收消息,接收消息后解析数据包,把数据包发送到系统进行处理。

信道:
BLE有40个信道,37个是数据信道,3个广播信道。40个信道最低的中心频率为2402MHz,最高的为2480MHz。第一个信道的频率为2402,以后每一个信道加20MHz。
广播类型:
typedef enum
{
GAP_ADTYPE_ADV_IND,
可连接无定向广播,
GAP_ADTYPE_ADV_HDC_DIRECT_IND,
GAP_ADTYPE_ADV_SCAN_IND,
可扫描无定向广播
GAP_ADTYPE_ADV_NONCONN_IND,
不可连接无定向广播
GAP_ADTYPE_ADV_LDC_DIRECT_IND,
} T_GAP_ADTYPE;
定向和无定向是针对广播对象而言,如果针对特定对象的广播(在广播包中包含目标对象的地址)就是定向广播,反之就是无定向。可连接和不可链接是指是否接受连接请求,如果是不可连接的广播类型,他将不回应连接请求。可扫描类型是指回应扫描请求。

//广播配置、扫描连接设置、邦定设置
static const uint8_t scan_rsp_data[] =
{
    0x03,                             /* length */
    GAP_ADTYPE_APPEARANCE,            /* type="Appearance" */
    LO_WORD(GAP_GATT_APPEARANCE_UNKNOWN),
    HI_WORD(GAP_GATT_APPEARANCE_UNKNOWN),
};

/** @brief  GAP - Advertisement data (max size = 31 bytes, best kept short to conserve power) */
static const uint8_t adv_data[] =
{
    /* Flags */
    0x02,             /* length */
    GAP_ADTYPE_FLAGS, /* type="Flags" */
    GAP_ADTYPE_FLAGS_LIMITED | GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED,
    /* Service */
    0x03,             /* length */
    GAP_ADTYPE_16BIT_COMPLETE,
    LO_WORD(GATT_UUID_SIMPLE_PROFILE),
    HI_WORD(GATT_UUID_SIMPLE_PROFILE),
    /* Local name */
    0x0F,             /* length */
    GAP_ADTYPE_LOCAL_NAME_COMPLETE,
    'A', 'L','E','_', 'P', 'E', 'R', 'I', 'P', 'H', 'E', 'R', 'A', 'L',//设备名字
};

/*============================================================================*
 *                              Functions
 *============================================================================*/
/**
  * @brief  Initialize peripheral and gap bond manager related parameters
  * @return void
  */
void app_le_gap_init(void)
{
    /* Device name and device appearance */
    uint8_t  device_name[GAP_DEVICE_NAME_LEN] = "ALE_PERIPHERAL";
    uint16_t appearance = GAP_GATT_APPEARANCE_UNKNOWN;
    uint8_t  slave_init_mtu_req = false;


    /* Advertising parameters */
    uint8_t  adv_evt_type = GAP_ADTYPE_ADV_IND;//广播类型
    uint8_t  adv_direct_type = GAP_REMOTE_ADDR_LE_PUBLIC;
    uint8_t  adv_direct_addr[GAP_BD_ADDR_LEN] = {0};
    uint8_t  adv_chann_map = GAP_ADVCHAN_ALL;
    uint8_t  adv_filter_policy = GAP_ADV_FILTER_ANY;
    uint16_t adv_int_min = DEFAULT_ADVERTISING_INTERVAL_MIN;//最大最小值设置成一样,则广播间隔就是该值  
    uint16_t adv_int_max = DEFAULT_ADVERTISING_INTERVAL_MAX;

    /* GAP Bond Manager parameters */
    uint8_t  auth_pair_mode = GAP_PAIRING_MODE_PAIRABLE;
    uint16_t auth_flags = GAP_AUTHEN_BIT_BONDING_FLAG;
    uint8_t  auth_io_cap = GAP_IO_CAP_NO_INPUT_NO_OUTPUT;//邦定方式,无条件邦定
    uint8_t  auth_oob = false;
    uint8_t  auth_use_fix_passkey = true;
    uint32_t auth_fix_passkey = 1234;
#if F_BT_ANCS_CLIENT_SUPPORT
    uint8_t  auth_sec_req_enable = true;
#else
    uint8_t  auth_sec_req_enable = false;
#endif
    uint16_t auth_sec_req_flags = GAP_AUTHEN_BIT_BONDING_FLAG;

    /* Set device name and device appearance */
    le_set_gap_param(GAP_PARAM_DEVICE_NAME, GAP_DEVICE_NAME_LEN, device_name);//设备名字
    le_set_gap_param(GAP_PARAM_APPEARANCE, sizeof(appearance), &appearance);//设备属性
    le_set_gap_param(GAP_PARAM_SLAVE_INIT_GATT_MTU_REQ, sizeof(slave_init_mtu_req),
                     &slave_init_mtu_req);//从设备,

    /* Set advertising parameters */
    le_adv_set_param(GAP_PARAM_ADV_EVENT_TYPE, sizeof(adv_evt_type), &adv_evt_type);
    le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR_TYPE, sizeof(adv_direct_type), &adv_direct_type);
    le_adv_set_param(GAP_PARAM_ADV_DIRECT_ADDR, sizeof(adv_direct_addr), adv_direct_addr);
    le_adv_set_param(GAP_PARAM_ADV_CHANNEL_MAP, sizeof(adv_chann_map), &adv_chann_map);
    le_adv_set_param(GAP_PARAM_ADV_FILTER_POLICY, sizeof(adv_filter_policy), &adv_filter_policy);
    le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MIN, sizeof(adv_int_min), &adv_int_min);
    le_adv_set_param(GAP_PARAM_ADV_INTERVAL_MAX, sizeof(adv_int_max), &adv_int_max);
    le_adv_set_param(GAP_PARAM_ADV_DATA, sizeof(adv_data), (void *)adv_data);
    le_adv_set_param(GAP_PARAM_SCAN_RSP_DATA, sizeof(scan_rsp_data), (void *)scan_rsp_data);

    /* Setup the GAP Bond Manager */
    gap_set_param(GAP_PARAM_BOND_PAIRING_MODE, sizeof(auth_pair_mode), &auth_pair_mode);
    gap_set_param(GAP_PARAM_BOND_AUTHEN_REQUIREMENTS_FLAGS, sizeof(auth_flags), &auth_flags);
    gap_set_param(GAP_PARAM_BOND_IO_CAPABILITIES, sizeof(auth_io_cap), &auth_io_cap);
    gap_set_param(GAP_PARAM_BOND_OOB_ENABLED, sizeof(auth_oob), &auth_oob);
    le_bond_set_param(GAP_PARAM_BOND_FIXED_PASSKEY, sizeof(auth_fix_passkey), &auth_fix_passkey);
    le_bond_set_param(GAP_PARAM_BOND_FIXED_PASSKEY_ENABLE, sizeof(auth_use_fix_passkey),
                      &auth_use_fix_passkey);
    le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_ENABLE, sizeof(auth_sec_req_enable), &auth_sec_req_enable);
    le_bond_set_param(GAP_PARAM_BOND_SEC_REQ_REQUIREMENT, sizeof(auth_sec_req_flags),
                      &auth_sec_req_flags);
 
    /* register gap message callback */
    le_register_app_cb(app_gap_callback);//注册回调函数
}

profile:
注册服务。

void app_le_profile_init(void)
{
    server_init(2);
    simp_srv_id = simp_ble_service_add_service(app_profile_callback);//主功能服务,这函数里设置服务功能
    bas_srv_id  = bas_add_service(app_profile_callback);//电池管理服务
    server_register_app_cb(app_profile_callback);//注册服务回调函数
}

私有服务回调传送进来的消息