微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 关于GATT_indicate以及GAPROLE_CONNHANDLE

关于GATT_indicate以及GAPROLE_CONNHANDLE

时间:10-02 整理:3721RD 点击:

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是否就一直发送同样的数据,直到收到返回的信息,才发送其他数据呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top