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);//注册服务回调函数
}
私有服务回调传送进来的消息