关于GATT_indicate以及GAPROLE_CONNHANDLE
1、GATT_Indication( connHandle, pNoti, FALSE, taskId );
这个函数中实参connHandle表示的是indicate属性的句柄是么?
2、GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );
这个函数又有什么作用呢,GAPROLE_CONNHANDLE,TI协议栈注释是Connection Handle. Read Only. Size is uint16.
连接的句柄,这里有疑问 UUID设置了好几个,那这些句柄都是连接的,怎么找到自己想要indicate属性的句柄呢?
3、往GATT_Indication( connHandle, pNoti, FALSE, taskId )这个函数中的pNoti填充,调用该函数,是否意味着就会
直接发送填充到pNoti的数据呢?蓝牙协议规定了每次最多发送二十个字节,那么超过20个字节的发送可以这么处理么?
if(HeadValue.nLength<20)
{
osal_memcpy(&(pNoti->value[0]), p, HeadValue.nLength );
wechat_sendIndicate(connHandle,pNoti,taskId );
}
else
{
for(i=0;i<len;i++)
{
osal_memcpy(&(pNoti->value[0]), p, HeadValue.nLength );
wechat_sendIndicate(connHandle,pNoti,taskId );
p+=20;
}
if(HeadValue.nLength>20&&HeadValue.nLength%20)
{
osal_memcpy(&(pNoti->value[0]), p, HeadValue.nLength );
wechat_sendIndicate(connHandle,pNoti,taskId );
}
}
GATT_Indication的connHandle和GATT_Notification的connHandle是一样的,可以参考GATT_Notification的使用。
Notification和Indication的区别在于,一个没有确认回复,一个有确认回复,因此Indication在使用上,还需要添加一个事件回调函数来确认是否有收到确认回复
GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle )这个获取的是连接的handle不是UUID的句柄
notification和indication一个包最多只能发20个byte
hi WBJ:
按照你说的GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle )这个获取的是连接的handle不是UUID的句柄,那假设我是设置了两个通道的,那这两个通道都是一起连接的,调用GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle )这个函数怎么知道是获取其中哪个连接的handle呢?
还有就是对于你说Indication在使用上,还需要添加一个事件回调函数来确认是否有收到确认回复,
我想问下这个回调函数用static void simpleProfileChangeCB( uint8 paramID )这个函数么?
我发现调用GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle ),在软件调试时,会出现找不到特征属性导致会连接不上。
在定义的事件里面,判断是否连接,在里面使用GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );会出现如下图的情况
if( gaprole_state == GAPROLE_CONNECTED )
{
static uint16 gapConnHandle;
attHandleValueInd_t *pNoti;
GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );
static uint16 nSeq=1;
timeDisConnect = 0;
AuthRequest *authReq;
Send_Auth_Request(authReq,nSeq,gapConnHandle,pNoti,simpleBLEPeripheral_TaskID);
}
不要使用自定义的事件,添加Indication的事件,注意看函数的注释,有写它会返回什么消息的
参考
static void simpleBLEPeripheral_ProcessOSALMsg( osal_event_hdr_t *pMsg )
{
switch ( pMsg->event )
{
#if defined( CC2540_MINIDK )
case KEY_CHANGE:
simpleBLEPeripheral_HandleKeys( ((keyChange_t *)pMsg)->state, ((keyChange_t *)pMsg)->keys );
break;
case GATT_MSG_EVENT:
simpleBLEPeripheralProcessGattMsg((gattMsgEvent_t *) pMsg);
break;
#endif // #if defined( CC2540_MINIDK )
default:
// do nothing
break;
}
static void simpleBLEPeripheralProcessGattMsg(gattMsgEvent_t * pMsg)
{
//Message Indication Confirmation
if (pMsg->method == ATT_HANDLE_VALUE_CFM)
{
simpleBLEPeripheralSendIndication();
}
}
static void simpleBLEPeripheralSendIndication()
{
attHandleValueInd_t Indication;
Indication.value = ;
Indication.len = ;
Indication.handle = ;
bStatus_t status;
status = GATT_Indication (gapConnHandle, &Indication, FALSE, simpleBLEPeripheral_TaskID);
}
一般connection handle就是0 1 2这么排下去的
参考
static void peripheralStateNotificationCB( gaprole_States_t newState )
{
switch ( newState )
{
case GAPROLE_CONNECTED:
{
//Get connection handle
GAPRole_GetParameter( GAPROLE_CONNHANDLE, &gapConnHandle );
#if (defined HAL_LCD) && (HAL_LCD == TRUE)
HalLcdWriteString( "Connected", HAL_LCD_LINE_3 );
#endif // (defined HAL_LCD) && (HAL_LCD == TRUE)
}
break;
假设我使用indicate,但是不去判断是否有返回的信息,那么indicate是否就一直发送同样的数据,直到收到返回的信息,才发送其他数据呢?