BLE.docx
- 文档编号:3353299
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:13
- 大小:108.69KB
BLE.docx
《BLE.docx》由会员分享,可在线阅读,更多相关《BLE.docx(13页珍藏版)》请在冰豆网上搜索。
BLE
蓝牙模块主要分为三个部分:
BLE协议栈初始化、建立连接、蓝牙数据处理。
BLE协议栈初始化主要包括初始化硬件功能、设置连接间隔参数、添加service、开启广播等;建立连接是蓝牙设备与上位机的之间的连接事件的信息交互处理工程,主要包括连接、配对、绑定、加密等过程;蓝牙数据处理包括蓝牙设备发送熟读与接收收据两部分。
BLE协议栈初始化后开启快广播,蓝牙设备在快广播30s内没有被连接会自动转为慢广播,流程如下图:
详细步骤如下:
1)使能SoftDevice,SoftDevice是实现BLE蓝牙协议栈的一个解决方案,这里面集成了所有实现BLE功能的函数接口,要先对SoftDevice进行初始化才能实现BLE功能,在此调用dmble_core_enable_softdevice(),dmble_core_enable_softdevice()中的SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM,NULL)、CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT)分别用于初始化时钟、内存等信息。
softdevice_ble_evt_handler_set(sys_sd_ble_evt_dispatch)注册时间派发程序
功能描述
用于初始化时钟、内存等信息,函数中SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM,NULL)、CHECK_RAM_START_ADDR(CENTRAL_LINK_COUNT,PERIPHERAL_LINK_COUNT)函数分别用于初始化时钟、内存等信息。
函数原型
intdmble_core_enable_softdevice(void)
参数及类型
参数说明
参数列表
Void
返回值
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
设备名长度
返回值
int
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_ADDRInvalidpointersupplied.
:
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)
参数及类型
参数说明
参数列表
void
返回值
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存储文件相应的地址
返回值
int
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
返回值
int
NRF_SUCCESSSuccessfullyaddedaservicedeclaration.
NRF_ERROR_INVALID_ADDRInvalidpointersupplied.
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
分配的句柄结构指针
返回值
int
NRF_SUCCESSSuccessfullyaddedacharacteristic.
NRF_ERROR_INVALID_ADDRInvalidpointersupplied.
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
广播方式:
快广播、慢广播、不广播
返回值
int
设置参数成功返回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
扫描回复数据长度
返回值
int
NRF_SUCCESSAdvertisingdatasuccessfullyupdatedorcleared.
NRF_ERROR_INVALID_PARAMInvalidparameter(s)supplied,bothp_dataandp_sr_datacannotbeNULL.
NRF_ERROR_INVALID_ADDRInvalidpointersupplied.
功能描述
设置广播间隔、超时时间、广播类型等参数并启动广播
函数原型
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
p_adv_params->interval:
广播间隔,快广播间隔是25ms,慢广播是2s
p_adv_params->timeout:
超时时间,快广播间隔是30s,慢广播是180s
返回值
int
NRF_SUCCESSTheBLEstackhasstartedadvertising.
NRF_ERROR_INVALID_ADDRInvalidpointersupplied.
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,
返回值
void
蓝牙数据处理包括两个部分,数据发送与数据接收。
我们在蓝牙栈初始化的时候添加了一个服务,该服务有两个特征值:
一个特征值属性为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_evt_t*p_ble_evt
处理的事件有:
BLE_GATTS_EVT_WRITE
BLE_GATTC_EVT_HVX
返回值
void
功能描述
将数据处理后存入中
函数原型
voidpm_recv_dmble_pkt(uint8_t*buf,uint16_tlen)
参数及类型
参数说明
参数列表
uint8_t*buf
APP端发送过来的数据指针
uint16_tlen
APP端发送过来的数据长度
返回值
void
功能描述
将需要发送的数据存入中
函数原型
voiddmble_ancs_frame_from_ios(constuint8_t*p_data,uint16_tlength,uint8_ttype)
参数及类型
参数说明
参数列表
constuint8_t*p_data
向APP端发送的数据指针
uint16_tlength
向APP端发送过来的数据长度
uint8_ttype
服务类型
返回值
void
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BLE