微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 怎么获取多个特征值的句柄?

怎么获取多个特征值的句柄?

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

各位好!

比如,主从机连接后,想要实现,按UP键读写特征值1;按Down键读取特征值6。

在simpleBLEGATTDiscoveryEvent里面,

if ( simpleBLESvcStartHdl != 0 )
{
// Discover characteristic
simpleBLEDiscState = BLE_DISC_STATE_CHAR;

req.startHandle = simpleBLESvcStartHdl;
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

//hc: To discover the characteristic 6
req_char6.startHandle = simpleBLESvcStartHdl;
req_char6.endHandle = simpleBLESvcEndHdl;
req_char6.type.len = ATT_BT_UUID_SIZE;
req_char6.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR6_UUID);
req_char6.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR6_UUID);

GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req_char6, simpleBLETaskId );

else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
{
// Characteristic found, store handle
if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0 )
{
simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
pMsg->msg.readByTypeRsp.dataList[1] );

HalLcdWriteStringValue("numPairs=",pMsg->msg.readByTypeRsp.numPairs,10,HAL_LCD_LINE_5);
HalLcdWriteStringValue("len=",pMsg->msg.readByTypeRsp.len,10,HAL_LCD_LINE_6);
HalLcdWriteStringValueValue(" dataList",pMsg->msg.readByTypeRsp.dataList[0],16,pMsg->msg.readByTypeRsp.dataList[1],16,HAL_LCD_LINE_7);

LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_3 );
simpleBLEProcedureInProgress = FALSE;
}

1、发现numPairs一直是1

2、GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );函数的具体作用。如果传递的是req,则len=3;如果是req_char6,则len=7;为什么?

typedef struct
{
uint8 numPairs; //!< Number of attribute handle-UUID pairs found
uint8 len; //!< Size of each attribute handle-value pair
uint8 dataList[ATT_MTU_SIZE-2]; //!< List of 1 or more attribute handle-value pairs
} attReadByTypeRsp_t;


怎么没人?

这样做为什么不行?得到的特征值1的句柄是25,对;特征值6的句柄是250,是错的。

static void simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )
{
attReadByTypeReq_t req;
attReadByTypeReq_t req_char6;

if ( simpleBLEDiscState == BLE_DISC_STATE_SVC )
{
// Service found, store handles
if ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
pMsg->msg.findByTypeValueRsp.numInfo > 0 )
{
simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;
simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;
simpleBLESvcStartHdl6 = pMsg->msg.findByTypeValueRsp.handlesInfo[1].handle;
simpleBLESvcEndHdl6 = pMsg->msg.findByTypeValueRsp.handlesInfo[1].grpEndHandle;
}

// If procedure complete
if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP &&
pMsg->hdr.status == bleProcedureComplete ) ||
( pMsg->method == ATT_ERROR_RSP ) )
{
if ( simpleBLESvcStartHdl != 0 )
{
// Discover characteristic
simpleBLEDiscState = BLE_DISC_STATE_CHAR;

req.startHandle = simpleBLESvcStartHdl;
req.endHandle = simpleBLESvcEndHdl;
req.type.len = ATT_BT_UUID_SIZE;
req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);
req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

req_char6.startHandle = simpleBLESvcStartHdl6;
req_char6.endHandle = simpleBLESvcEndHdl6;
req_char6.type.len = ATT_BT_UUID_SIZE;
req_char6.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR6_UUID);
req_char6.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR6_UUID);

GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );
GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req_char6, simpleBLETaskId );
}
}
}
else if ( simpleBLEDiscState == BLE_DISC_STATE_CHAR )
{
// Characteristic found, store handle
if ( pMsg->method == ATT_READ_BY_TYPE_RSP &&
pMsg->msg.readByTypeRsp.numPairs > 0 )
{
simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
pMsg->msg.readByTypeRsp.dataList[1] );
simpleBLECharHdl6 = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[2],
pMsg->msg.readByTypeRsp.dataList[3] );
HalLcdWriteStringValue("CharHdl:",simpleBLECharHdl,16,HAL_LCD_LINE_4);
HalLcdWriteStringValue("CharHdl6:",simpleBLECharHdl6,16,HAL_LCD_LINE_5);

HalLcdWriteStringValue("numPairs=",pMsg->msg.readByTypeRsp.numPairs,10,HAL_LCD_LINE_6);
HalLcdWriteStringValue("len=",pMsg->msg.readByTypeRsp.len,10,HAL_LCD_LINE_7);
HalLcdWriteStringValueValue("dL",pMsg->msg.readByTypeRsp.dataList[2],16,pMsg->msg.readByTypeRsp.dataList[3],16,HAL_LCD_LINE_8);

LCD_WRITE_STRING( "Simple Svc Found", HAL_LCD_LINE_3 );
simpleBLEProcedureInProgress = FALSE;
}

simpleBLEDiscState = BLE_DISC_STATE_IDLE;
}
}

首先使用GATT_DiscAllChars函数启动扫描,然后就可以在*pDiscState == BLE_DISC_STATE_CHAR的中断中得到msg.readByTypeRsp,里面包含有扫描到的特征值的handle,缓存起来就可以进行读写操作了。

谢谢!

还有几个问题想请教一下:

1、GATT_DiscAllChars函数在哪里调用?

2、msg.readByTypeRsp里面是不是dataList[]存储了特征值的handle?

3、特征值1和特征值5分别对应dataList的第几个元素?

simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],
pMsg->msg.readByTypeRsp.dataList[1] );

4、GATT_ReadUsingCharUUID函数的作用?

如果 GATT_ReadUsingCharUUID( simpleBLEConnHandle, &req, simpleBLETaskId );

主机程序里面dataList[0]、dataList[1]就对应特征值1的handle

Hi,Fred

我按照你的方法,调用GATT_DiscAllChars启动扫描,在BLE_DISC_STATE_CHAR里面

打印出来

pMsg->msg.readByTypeRsp.numPairs为1

pMsg->msg.readByTypeRsp.dataList[0]       25

pMsg->msg.readByTypeRsp.dataList[1]       0

下面依次为01,02,00,00,3E,00

还是只有特征值1的句柄

能不能在详细点呢

你好You You,你的这段代码

{
simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;
simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;
simpleBLESvcStartHdl6 = pMsg->msg.findByTypeValueRsp.handlesInfo[1].handle;
simpleBLESvcEndHdl6 = pMsg->msg.findByTypeValueRsp.handlesInfo[1].grpEndHandle;
}

特征值1和特征值6获取的是服务开始句柄和结束句柄是一样的吧。。因为char1和char6都是同属于一个服务下。服务句柄区间应该包含了char1和char6的句柄。

dearFred:

       我已经获得了特征值1的句柄0x25,但是在使用句柄读取特征值的时候GATT_ReadCharValue函数返回值却是0x16,意思是在等待,不知道这是怎么回事,你有遇到过或者知道怎么回事吗?

谢谢!

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

网站地图

Top