很多人会对cc2540的一些参数不知道怎么操作,例如哪里判断连接成功/失败?哪里操作断开连接等等。.下面以SimpleBLEPeripheral工程为例子吧。
BLE广播的使能
uint8 initial_advertising_enable = TRUE;
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof( uint8 ), &initial_advertising_enable );
在SimpleBLEPeripheral.c文件下面的这段代码是管理初始化的时候是否进行广播的函数;你可以找到peripheral.c中变量gapRole_AdvEnabled。每次调用这个函数其实都是写入到这个变量,而连接结束后是根据这个变量来决定要不要重新启动广播的。
在peripheral.c的函数中static void gapRole_ProcessGAPMsg(gapEventHdr_t * pMsg)中可以找到:
case GAP_LINK_ESTABLISHED_EVENT:
{
...
gapRole_AdvEnabled = FALSE; //建立连接后,将其强制为FALSE。
}
case GAP_LINK_TERMINATED_EVENT://断开连接
{
...
if ( gapRole_AdvEnabled) //如果最后的状态为TRUE,则不重新启动广播
{
// End advertising so we can restart advertising in order
// to change to connectable advertising from nonconnectable.
VOID GAP_EndDiscoverable( gapRole_TaskID );
}
else // Turn advertising back on.//如果为FALSE
{
gapRole_AdvEnabled = TRUE;
VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT);//启动广播
}
}
以上便是操作BLE广播的操作
BLE连接断开函数
在peripheral.c文件中,当ble连接成功的时候会调用gapRole_ProcessGAPMsg()下面的GAP_LINK_ESTABLISHED_EVENT事件:
case GAP_LINK_ESTABLISHED_EVENT:
{
gapEstLinkReqEvent_t *pPkt = (gapEstLinkReqEvent_t *)pMsg;
if ( pPkt->hdr.status == SUCCESS )
{
VOID osal_memcpy( gapRole_ConnectedDevAddr, pPkt->devAddr, B_ADDR_LEN );
gapRole_ConnectionHandle = pPkt->connectionHandle;
gapRole_state = GAPROLE_CONNECTED;
if ( gapRole_RSSIReadRate )
{
// Start the RSSI Reads
VOID osal_start_timerEx( gapRole_TaskID, RSSI_READ_EVT, gapRole_RSSIReadRate );
}
// Store connection information
gapRole_ConnInterval = pPkt->connInterval;
gapRole_ConnSlaveLatency = pPkt->connLatency;
gapRole_ConnTimeout = pPkt->connTimeout;
// Check whether update parameter request is enabled
if ( gapRole_ParamUpdateEnable == TRUE )
{
// Get the minimum time upon connection establishment before the
// peripheral can start a connection update procedure.
uint16 timeout = GAP_GetParamValue( TGAP_CONN_PAUSE_PERIPHERAL );
osal_start_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT, timeout*1000 );
}
// Notify the Bond Manager to the connection
VOID GAPBondMgr_LinkEst( pPkt->devAddrType, pPkt->devAddr, pPkt->connectionHandle, GAP_PROFILE_PERIPHERAL );
// Set enabler to FALSE; device will become discoverable again when
// this value gets set to TRUE
gapRole_AdvEnabled = FALSE;
}
else if ( pPkt->hdr.status == bleGAPConnNotAcceptable )
{
// Set enabler to FALSE; device will become discoverable again when
// this value gets set to TRUE
gapRole_AdvEnabled = FALSE;
// Go to WAITING state, and then start advertising
gapRole_state = GAPROLE_WAITING;
}
else
{
gapRole_state = GAPROLE_ERROR;
}
notify = TRUE;
}
break;
同样道理,当ble断开的时候就会调用GAP_LINK_TERMINATED_EVENT事件:
case GAP_LINK_TERMINATED_EVENT:
{
gapTerminateLinkEvent_t *pPkt = (gapTerminateLinkEvent_t *)pMsg;
VOID GAPBondMgr_ProcessGAPMsg( (gapEventHdr_t *)pMsg );
osal_memset( gapRole_ConnectedDevAddr, 0, B_ADDR_LEN );
// Erase connection information
gapRole_ConnInterval = 0;
gapRole_ConnSlaveLatency = 0;
gapRole_ConnTimeout = 0;
UserRight=0;//复位用户权限
isLogin=0;//复位是否登录状态位
// Cancel all connection parameter update timers (if any active)
VOID osal_stop_timerEx( gapRole_TaskID, START_CONN_UPDATE_EVT );
VOID osal_stop_timerEx( gapRole_TaskID, CONN_PARAM_TIMEOUT_EVT );
// Go to WAITING state, and then start advertising
if( pPkt->reason == LL_SUPERVISION_TIMEOUT_TERM )
{
gapRole_state = GAPROLE_WAITING_AFTER_TIMEOUT;
}
else
{
gapRole_state = GAPROLE_WAITING;
}
notify = TRUE;
// Check if still advertising from within last connection.
if ( gapRole_AdvEnabled)
{
// End advertising so we can restart advertising in order
// to change to connectable advertising from nonconnectable.
VOID GAP_EndDiscoverable( gapRole_TaskID );
}
else // Turn advertising back on.
{
gapRole_AdvEnabled = TRUE;
VOID osal_set_event( gapRole_TaskID, START_ADVERTISING_EVT);
}
gapRole_ConnectionHandle = INVALID_CONNHANDLE;
}
break;