CH579主机GATT_ReadUsingCharUUID和GATT_DiscCharsByUUID的区别是什么?

使用CH579做低功耗蓝牙主机。在主机例程中,获取特征值句柄的代码如下:

if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  &&
        pMsg->hdr.status == bleProcedureComplete ) ||
        ( pMsg->method == ATT_ERROR_RSP ) )
        {
            if ( centralSvcStartHdl != 0 )
            {
                // Discover characteristic
                centralDiscState = BLE_DISC_STATE_CHAR;
                req.startHandle = centralSvcStartHdl;
                req.endHandle = centralSvcEndHdl;

                req.type.len = ATT_BT_UUID_SIZE;
                req.type.uuid[0] = LO_UINT16(TEMPPROFILE_CHAR3_UUID);
                req.type.uuid[1] = HI_UINT16(TEMPPROFILE_CHAR3_UUID);

                GATT_ReadUsingCharUUID( centralConnHandle, &req, centralTaskId ); 
            }
        }

我模仿主机例程,新增了一个服务表,特征值均采用16oct,然而无法获取到特征值句柄,代码如下:

if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  &&
        pMsg->hdr.status == bleProcedureComplete ) ||
        ( pMsg->method == ATT_ERROR_RSP ) )
        {
            if ( centralSvcStartHdl != 0 )
            {
                // Discover characteristic
                centralDiscState = BLE_DISC_STATE_CHAR;
                req.startHandle = centralSvcStartHdl;
                req.endHandle = centralSvcEndHdl;

                req.type.len = ATT_BT_UUID_SIZE;
                req.type.uuid[0] = LO_UINT16(LED_CHAR2_UUID);
                req.type.uuid[1] = HI_UINT16(LED_CHAR2_UUID);
                GATT_ReadUsingCharUUID( centralConnHandle, &req, centralTaskId ); 
            }
        }

但是,如果使用如下代码,只换了GATT_DiscCharsByUUID就可以了:

if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  &&
        pMsg->hdr.status == bleProcedureComplete ) ||
        ( pMsg->method == ATT_ERROR_RSP ) )
        {
            if ( centralSvcStartHdl != 0 )
            {
                // Discover characteristic
                centralDiscState = BLE_DISC_STATE_CHAR;
                req.startHandle = centralSvcStartHdl;
                req.endHandle = centralSvcEndHdl;

                req.type.len = ATT_BT_UUID_SIZE;
                req.type.uuid[0] = LO_UINT16(LED_CHAR2_UUID);
                req.type.uuid[1] = HI_UINT16(LED_CHAR2_UUID);
               GATT_DiscCharsByUUID( centralConnHandle, &req, centralTaskId ); 
            }
        }

为什么啊?

如果按照主机程序的流程会先发现handle的范围,同时已知UUID,因此可以DiscCharsByUUID,且我们自己在进行蓝牙连接和透传数据时是会修改为这个的。设置为ReadUsingCharUUID是已知UUID就可以了。


@TECH_Lpc:

你没认真审我的题呀~

DiscCharsByUUID和ReadUsingCharUUID都是在获取到service范围,且已知uuid的情况,同时他们的参数都是一样的。


我按照主机例程使用ReadUsingCharUUID可以读出来特征,但是我新增服务表,却只能用DiscCharsByUUID。为什么呢?



检查一下你的LED_CHAR2_UUID是否带有读属性,如果不带有读属性那就使用DiscCharsByUUID,如果带有读属性尝试使用ReadUsingCharUUID,可以进行验证,如验证现象不符合我们这里会进一步验证。



@TECH_Lpc

按照你四楼的回复。还是不行。我描述下我的测试过程。


1,我的服务表如下:

static gattAttribute_t tempProfileAttrTbl[] =
{
    // Temp Profile 服务
    {
        { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */
        GATT_PERMIT_READ,                         /* permissions */
        0,                                        /* handle */
        (uint8 *)&tempProfileService            /* pValue */
    },

   
   
      // Characteristic 2 Declaration
      (省略不写,notify类型)
     
   
    // Characteristic 3 Declaration
    {
        { ATT_BT_UUID_SIZE, characterUUID },
        GATT_PERMIT_READ,
        0,
        &tempProfileChar3Props 
    },

      // Characteristic Value 3
    {
        { ATT_UUID_SIZE, tempProfilechar3UUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE,
        0,
        tempProfileChar3 
    },

      // Characteristic 3 User Description
      {
        { ATT_BT_UUID_SIZE, charUserDescUUID },
        GATT_PERMIT_READ,
        0,
        tempProfileChar3UserDesp 
      },

    // Characteristic 4 Declaration
    (省略不写,notify类型)

 
};

2,tempProfileChar3Props定义为:

static uint8 tempProfileChar3Props = GATT_PROP_WRITE | GATT_PROP_READ;


3,获取属性特征值:

 if ( ( pMsg->method == ATT_FIND_BY_TYPE_VALUE_RSP  &&
        pMsg->hdr.status == bleProcedureComplete ) ||
        ( pMsg->method == ATT_ERROR_RSP ) )
        {
            if ( centralSvcStartHdl != 0 )
            {
                // Discover characteristic
                centralDiscState = BLE_DISC_STATE_CHAR;
                req.startHandle = centralSvcStartHdl;
                req.endHandle = centralSvcEndHdl;
#if 1
                req.type.len = ATT_BT_UUID_SIZE;
                req.type.uuid[0] = LO_UINT16(TEMPPROFILE_CHAR3_UUID);
                req.type.uuid[1] = HI_UINT16(TEMPPROFILE_CHAR3_UUID);
#else
                // Characteristic 1 UUID: 0xF002
                uint8 uuidx[ATT_UUID_SIZE] =
                { 
                    0xFB,0x34,0x9B,0x5f,0x80,0,0,0x80,0,0x10,0,0,
                    LO_UINT16(TEMPPROFILE_CHAR3_UUID), HI_UINT16(TEMPPROFILE_CHAR3_UUID),
                    0,0,
                };
                tmos_memcpy(req.type.uuid, uuidx, ATT_UUID_SIZE);         
#endif
                GATT_ReadUsingCharUUID( centralConnHandle, &req, centralTaskId );
                //GATT_DiscCharsByUUID( centralConnHandle, &req, centralTaskId );
            }
        }

4,结果如下,可以看到,没有找到特征值句柄,没有打印

Found Characteristic 1 handle :

Param Update...
Conn 1 - Int 60 
Found Profile Service handle : e ~ ffff 
numPairs = 2, cccdX [0] = 12
numPairs = 2, cccdX [1] = 18
Found client characteristic configuration handle : 18 
numPairs = 2
Write success

Char2和char4 是notify。即,cccdx0和cccdx1



5,另外我想描述下这里和主机的一个区别点,这里的tempProfilechar3UUID是16otc。

不知道获取特征值句柄,是不是也需要传入16otc


如果是为了将通道3设置为具有读写功能的,可以直接参考peripheral例程里的通道1的设置;设置非通道4具有noti功能,可以先简单的设置通道4的noti切换为如通道2的noti,然后再进行添加相应的noti 功能。

这里建议发送邮件至邮箱lpc@wch.cn,描述一下具体需求和发送相应的工程,我们这里进行查看验证。


只有登录才能回复,可以选择微信账号登录