1. 设置Central Role 参数
GAPCENTRALROLE_IRK
GAPCENTRALROLE_SRK
GAPCENTRALROLE_SIGNCOUNTER
GAPCENTRALROLE_BD_ADDR
<-只读参数:Device address read from controller. This can be set with the HCI_EXT_SetBDADDRCmd().
GAPCENTRALROLE_MAX_SCAN_RES
<-最多扫描回应数量,可以理解:有N个广播事件,那Central最多可以回复多少个
uint8 scanRes = DEFAULT_MAX_SCAN_RES;
GAPCentralRole_SetParameter ( GAPCENTRALROLE_MAX_SCAN_RES, sizeof( uint8 ), &scanRes );
===================================================================
2. 设置GAP,链路相关参数
GAP_SetParamValue( TGAP_GEN_DISC_SCAN, DEFAULT_SCAN_DURATION );
<-通用模式下,扫描时间(ms)
——————————————————————————————————————————————
GAP_SetParamValue( TGAP_LIM_DISC_SCAN, DEFAULT_SCAN_DURATION );
<-有限模式下,扫描时间(ms)
——————————————————————————————————————————————
GGS_SetParameter( GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, (uint8 *) simpleBLEDeviceName );
<-设置ATT NAME,该名字需要建立连接后,才能访问
=======================================================================
3. 设置Bond 参数,建立连接参数,握手过程参数
uint32 passkey = DEFAULT_PASSCODE;
<-匹配密码
——————————————————————————————————————————————
uint8 pairMode = DEFAULT_PAIRING_MODE;
<-主机配对模式
->GAPBOND_PAIRING_MODE_NO_PAIRING
不允许配对
->GAPBOND_PAIRING_MODE_WAIT_FOR_REQ
等待从机配对请亲
->GAPBOND_PAIRING_MODE_INITIATE
不用等待,直接接收匹配
——————————————————————————————————————————————
uint8 mitm = DEFAULT_MITM_MODE;
<-防止攻击 TRUE:需要密码配对, FALSE:不需要密码配对
——————————————————————————————————————————————
uint8 ioCap = DEFAULT_IO_CAPABILITIES;
<-设置 Bond IO 功能 ->GAPBOND_IO_CAP_DISPLAY_ONLY
Display Only Device
->GAPBOND_IO_CAP_DISPLAY_YES_NO
Display and Yes and No Capable
->GAPBOND_IO_CAP_KEYBOARD_ONLY
Keyboard Only
->GAPBOND_IO_CAP_NO_INPUT_NO_OUTPUT No Display or Input Device
->GAPBOND_IO_CAP_KEYBOARD_DISPLAY
Both Keyboard and Display Capable
——————————————————————————————————————————————
uint8 bonding = DEFAULT_BONDING_MODE;
<是否绑定: TRUE:绑定
FALSE:不绑定
参数设置过程:->>>>>>>>>>>>>>>>>>>
GAPBondMgr_SetParameter( GAPBOND_DEFAULT_PASSCODE, sizeof( uint32 ), &passkey );
GAPBondMgr_SetParameter( GAPBOND_PAIRING_MODE, sizeof( uint8 ), &pairMode );
GAPBondMgr_SetParameter( GAPBOND_MITM_PROTECTION, sizeof( uint8 ), &mitm );
GAPBondMgr_SetParameter( GAPBOND_IO_CAPABILITIES, sizeof( uint8 ), &ioCap );
GAPBondMgr_SetParameter( GAPBOND_BONDING_ENABLED, sizeof( uint8 ), &bonding );
================================================================
4. 事件回调函数
4.1。如何理解? CentralRole 产生事件,通过回调函数给APP处理
|
typedef struct
| {
| pfnGapCentralRoleRssiCB_t rssiCB; //!< RSSI callback.
|
pfnGapCentralRoleEventCB_t eventCB; //!< Event callback.
| } gapCentralRoleCB_t;
|—————————————————————————————————
|
typedef void (*pfnGapCentralRoleRssiCB_t)
|
(
| uint16 connHandle, //!< Connection handle of the current RSSI.
| int8 rssi //!< New RSSI value.
|
);
|———————————————————————————————
|
typedef uint8 (*pfnGapCentralRoleEventCB_t)
|
(
|
gapCentralRoleEvent_t *pEvent //!< Pointer to event structure.
|
);
————————————————————————————————————
4.2。CentralRole有两个回调函数,先分析事件回调函数 (*pfnGapCentralRoleEventCB_t)
|
函数有一个形参,类型是gapCentralRoleEvent_t 事件结构体,结构体包含以下事件结构体:
|
typedef union
|
{
|
gapEventHdr_t gap; //!< GAP_MSG_EVENT and status.
|
gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done.
|
gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.
|
gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure.
|
gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure.
|
gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure.
|
gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure.
|
} gapCentralRoleEvent_t;
|
|
里面每一个“结点”又是一个结构体,用来描述该事件,具体描述可以参考
|
TI CC254x Bluetooth Low Energy Software Developer’s Guide ->GAP API ->Events
|
和 BLE_API_Guide_main.htm
|
《文档最后有常用的事件描述》
——————————————————————————————————————————
4.3。注册回调函数(回调函数编写放在最后)
|
4.3.1 定义回调函数结构体
|
static const gapCentralRoleCB_t simpleBLERoleCB =
|
{
|
simpleBLECentralRssiCB, // RSSI callback
|
simpleBLECentralEventCB // Event callback
|
};
4.3.2 注册回调函数并启动齐备
|
// 启动设备,同时 注册了回调函数
|
VOID GAPCentralRole_StartDevice( (gapCentralRoleCB_t *) &simpleBLERoleCB );
——————————————————————————————————————
4.4
编写回调函数
|
static uint8 simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )
|
{
|
switch ( pEvent->gap.opcode )
|
{
|
case GAP_DEVICE_INIT_DONE_EVENT : 用户代码;break;
|
case GAP_DEVICE_DISCOVERY_EVENT :用户代码;break;
|
case GAP_LINK_ESTABLISHED_EVENT : 用户代码;break;
|
case GAP_DEVICE_INFO_EVENT:
用户代码; break;
|
}
|
}
|
5. 启动扫描
|使用函数GAPCentralRole_StartDiscovery,函数包含3个参数
|——————————————————————————————————————————————————————————————————————————————
|5.1 参数1:DISCOVERY_MODE
|
DEVDISC_MODE_NONDISCOVERABLE
|
DEVDISC_MODE_GENERAL
|
DEVDISC_MODE_LIMITED
|
DEVDISC_MODE_ALL
|
|
参数2:TURE/FALSE 是否自动扫描
|
非主动扫描(被动扫描): Central 只监听广播者,而不发起任何数据
|
主动扫描:Central会要求广播者发起scan request,广播者会做出scan response
|
|
参数3:TRUE/FALSE
是否支持白名单
|
|5.2 实现
|
GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,
| DEFAULT_DISCOVERY_ACTIVE_SCAN,
| DEFAULT_DISCOVERY_WHITE_LIST );
|
======================================================================================
GAP_DEVICE_INIT_DONE_EVENT
在4.3.2 中,注册回调函数,并启动设备之后,会产生GAP_DEVICE_INIT_DONE_EVENT
GAP_DEVICE_INFO_EVENT
在发现设备过程中,产生的事件,如在主动扫描模式中,广播者发出的scan response包
事件的用户代码如下:
DEFAULT_DEV_DISC_BY_SVC_UUID是APP中的宏定义,是否过滤UUID
if ( DEFAULT_DEV_DISC_BY_SVC_UUID == TRUE )
{
判断当前发现设备的UUID是否SIMPLEPROFILE_SERV_UUID,
if ( simpleBLEFindSvcUuid( SIMPLEPROFILE_SERV_UUID,
pEvent->deviceInfo.pEvtData,
pEvent->deviceInfo.dataLen ) )
{
登记设备信息
simpleBLEAddDeviceInfo( pEvent->deviceInfo.addr, pEvent->deviceInfo.addrType );
《还可以获取scan response包数据信息》
}
}
GAP_LINK_ESTABLISHED_EVENT
如果设备连接成功,那么就把参数改成设备连接成功的参数并且如果句柄值没有读到过,则进行发现服务事件。
如果连接失败,就把连接参数改为空闲的状态。
GAP_DEVICE_INFO_EVENT
设备发现过程完成后产生该事件