BLEWord下载.docx
《BLEWord下载.docx》由会员分享,可在线阅读,更多相关《BLEWord下载.docx(13页珍藏版)》请在冰豆网上搜索。
int
错误返回err_code,成功返回NRF_SUCCESS
将ble_evt_hanler函数注册成时间派发函数
uint32_tsoftdevice_ble_evt_handler_set(ble_evt_handler_tble_evt_handler)
ble_evt_handler_t
时间派发函数
uint32_t
NRF_SUCCESS
2)GAP初始化就是设置必要的GAP参数,具体有设备名称、连接时间、超时时间等。
设置GAP参数,通过调用sd_ble_gap_device_name_set(&
sec_mode,(constuint8_t*)(gap_name)设置设备名字,调用sd_ble_gap_ppcp_set(&
gap_conn_params)设置连接时间等参数
voidgap_params_init(void)
void
void
SetGAPdevicename
sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_tconst*p_write_perm,uint8_tconst*p_dev_name,uint16_tlen));
ble_gap_conn_params_t*p_conn_params
设置设备名的写权限
uint8_tconst*p_dev_name
设备名指针
uint16_tlen
设备名长度
NRF_SUCCESSGAPdevicenameandpermissionssetsuccessfully.
NRF_ERROR_INVALID_ADDRInvalidpointersupplied.
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied.
NRF_ERROR_DATA_SIZEInvaliddatasize(s)supplied.
设置连接参数
sd_ble_gap_ppcp_set(ble_gap_conn_params_tconst*p_conn_params));
ble_gap_conn_params_tconst*p_conn_params
struct{
uint16_tmin_conn_interval;
:
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied.
3)添加服务也就是设置服务UUID,以及添加接收特征和发送特征,使得服务能够接收和发送信息。
设置GAP参数,通过调用sd_ble_uuid_vs_add(&
ble_ancs_base_uuid128,&
type)添加服务,sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,&
ble_uuid,
&
mp_dmble->
dms_service_handle)添加通讯服务,ble_dms_init()设置特征值
voidservice_add(void)
用于注册16bit服务到BLE协议栈列表中
sd_ble_uuid_vs_add(ble_uuid128_tconst*p_vs_uuid,uint8_t*p_uuid_type));
ble_uuid128_tconst*p_vs_uuid
16位的UUID
uint8_t*p_uuid_type
UUID存储文件相应的地址
NRF_SUCCESSSuccessfullyaddedtheVendorSpecificUUID.
NRF_ERROR_INVALID_ADDRIfp_vs_uuidorp_uuid_typeisNULLorinvalid.
NRF_ERROR_NO_MEMIftherearenomorefreeslotsforVSUUIDs.
用于注册16bit服务到gatt属性列表中
sd_ble_gatts_service_add(uint8_ttype,ble_uuid_tconst*p_uuid,uint16_t*p_handle));
uint8_ttype
gattservice类型:
invalid、private、secondary
ble_uuid_tconst*p_uuid
16bytesUUID
uint16_t*p_handle
分配给该服务的句柄handle
NRF_SUCCESSSuccessfullyaddedaservicedeclaration.
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied,VendorSpecificUUIDsneedtobepresentinthetable.
NRF_ERROR_FORBIDDENForbiddenvaluesupplied,certainUUIDsarereservedforthestack.
NRF_ERROR_NO_MEMNotenoughmemorytocompleteoperation.
添加一个关键字申明,并将关键字描述申明添加到属性表中
sd_ble_gatts_characteristic_add(uint16_tservice_handle,ble_gatts_char_md_tconst*p_char_md,ble_gatts_attr_tconst*p_attr_char_value,ble_gatts_char_handles_t*p_handles));
uint16_tservice_handle
服务的关键字句柄
ble_gatts_char_md_tconst*p_char_md
关键字设置信息,包含关键字读写属性
ble_gatts_attr_tconst*p_attr_char_value
属性结构指针,包含关键字的UUID、属性值长度(20Bytes)/偏移量/最大长度,数据指针
ble_gatts_char_handles_t*p_handles
分配的句柄结构指针
NRF_SUCCESSSuccessfullyaddedacharacteristic.
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied,servicehandle,VendorSpecificUUIDs,lengths,andpermissionsneedtoadheretotheconstraints.
NRF_ERROR_INVALID_STATEInvalidstatetoperformoperation,aservicecontextisrequired.
operation.
4)设置广播间隔、广播模式、广播超时时间、广播字段信息后开始广播。
在初始化广播参数时设置为快速广播和超时30s。
调用d_ble_gap_adv_data_set(advdata,21,NULL,0)设置广播字段,调用sd_ble_gap_adv_start(&
m_adv_params)设置广播参数并开启广播
intdmble_core_adv(adv_state_tadv_state)
adv_state_tadv_state
广播方式:
快广播、慢广播、不广播
设置参数成功返回0,否则返回-1;
开启广播成功返回0,否则返回-1;
设置广播自定义字段数据
sd_ble_gap_adv_data_set(uint8_tconst*p_data,uint8_tdlen,uint8_tconst*p_sr_data,uint8_tsrdlen));
uint8_tconst*p_data
广播字段数据指针,包括厂商信息,标志位与UUID
uint8_tdlen
广播字段数据长度
uint8_tconst*p_sr_data
扫描回复数据指针
uint8_tsrdlen
扫描回复数据长度
NRF_SUCCESSAdvertisingdatasuccessfullyupdatedorcleared.
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied,bothp_dataandp_sr_datacannotbeNULL.
设置广播间隔、超时时间、广播类型等参数并启动广播
sd_ble_gap_adv_start(ble_gap_adv_params_tconst*p_adv_params));
ble_gap_adv_params_tconst*p_adv_params
p_adv_params->
type:
广播类型有Connectableundirected、Connectabledirected、Scannableundirected、Nonconnectableundirected
interval:
广播间隔,快广播间隔是25ms,慢广播是2s
timeout:
超时时间,快广播间隔是30s,慢广播是180s
NRF_SUCCESSTheBLEstackhasstartedadvertising.
NRF_ERROR_INVALID_STATEInvalidstatetoperformoperation
5)判断30s快速广播是否有连接事件,如果有那么就建立连接,如果超时则SoftDevice会抛出一个BLE_GAP_TIMEOUT_SRC_ADVERTISING事件,这个事件的派发到staticvoidon_ble_evt(ble_evt_t*p_ble_evt)函数中处理,广播超时后设置进入慢速广播。
voidon_ble_evt(ble_evt_t*p_ble_evt)
{
switch(p_ble_evt->
caseBLE_GAP_EVT_TIMEOUT:
if(p_ble_evt->
BLE_GAP_TIMEOUT_SRC_ADVERTISING)
{
dmble_core_adv(BLE_SLOW_ADVERTISING);
}
}
在了解蓝牙与APP建立连接配对前,首先需要理解芯片集成的BLE协议栈是基于时间驱动。
也就是说协议栈与app之间的数据信息交互都是基于事件。
当芯片底层上抛一个时间,这个事件上抛的过程是协议栈触发软中断。
事件最终会调用ble_evt_dispatch函数进行处理,这个函数会再将时间分配给各个服务以及模块的事件处理函数处理。
蓝牙设备与APP连接的过程就是数据信息交互的过程,蓝牙协议栈将APP发过来的数据处理成一个个单独的事件,具体流程如下图:
事件派发函数ble_evt_dispatch(ble_evt_t*p_ble_evt)最终包含三个处理函数dm_ble_evt_handler(p_ble_evt);
dmble_on_ble_evt(p_ble_evt);
on_ble_evt(p_ble_evt)。
其中dm_ble_evt_handler(p_ble_evt)管理蓝牙GAP事件,GAP事件包含连接过程中的所有事件。
管理蓝牙GAP事件,GAP事件包含连接过程中的所有事件
voiddm_ble_evt_handler(ble_evt_t*p_ble_evt)
ble_evt_t*p_ble_evt
处理的事件有:
BLE_GAP_EVT_CONNECTED
BLE_GAP_EVT_DISCONNECTED,
BLE_GAP_EVT_CONN_PARAM_UPDATE,
BLE_GAP_EVT_SEC_PARAMS_REQUEST,
BLE_GAP_EVT_SEC_INFO_REQUEST,
BLE_GAP_EVT_PASSKEY_DISPLAY,
BLE_GAP_EVT_AUTH_KEY_REQUEST,
BLE_GAP_EVT_AUTH_STATUS,
BLE_GAP_EVT_CONN_SEC_UPDATE,
BLE_GAP_EVT_TIMEOUT,
BLE_GAP_EVT_RSSI_CHANGED,
BLE_GAP_EVT_ADV_REPORT,
BLE_GAP_EVT_SEC_REQUEST,
BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST,
BLE_GAP_EVT_SCAN_REQ_REPORT,
蓝牙数据处理包括两个部分,数据发送与数据接收。
我们在蓝牙栈初始化的时候添加了一个服务,该服务有两个特征值:
一个特征值属性为write,另一个特征值属性为notify&
write。
特征值属性为write就可以接受从APP端发来的数据,特征值属性为notify就可发送数据到APP端。
通过特征值发送来的数据都是在state_running_on_ble_evt(ble_evt_t*p_ble_evt)中处理。
处理数据的接收与发送,当event_id是BLE_GATTS_EVT_WRITE,调用pm_recv_dmble_pkt接受APP端来的数据;
当event_id是BLE_GATTC_EVT_HVX调用dmble_ancs_frame_from_ios(evt_hvx->
data,evt_hvx->
len,DMBLE_IOS_RECV_DATA_TYPE_ANCS_NS)向APP端发送数据
voidstate_running_on_ble_evt(ble_evt_t*p_ble_evt)
BLE_GATTS_EVT_WRITE
BLE_GATTC_EVT_HVX
将数据处理后存入中
voidpm_recv_dmble_pkt(uint8_t*buf,uint16_tlen)
uint8_t*buf
APP端发送过来的数据指针
APP端发送过来的数据长度
将需要发送的数据存入中
voiddmble_ancs_frame_from_ios(constuint8_t*p_data,uint16_tlength,uint8_ttype)
constuint8_t*p_data
向APP端发送的数据指针
uint16_tlength
向APP端发送过来的数据长度
服务类型