This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

GATT_WriteCharValue怎么写多个字节的数据



主机通过GATT_WriteCharValue写,只能写一个字节。在从机程序里面怎么设置特征值可以写多个字节???

  • #define ATT_ERR_INVALID_VALUE_SIZE       0x0d //!< The attribute value length is invalid for the operation

    另外可以参考之前的帖子 http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/44889.aspx?pi2132219853=1

  • uint8 buffer[VSERIAL_BLOCK_SIZE];
    attWriteReq_t req = {NULL};
    req.handle = charHandle;
    req.len = VSERIAL_BLOCK_SIZE;
    req.cmd = 1;
    if(enableAES == TRUE)
    {
    AES_Init(curDevice->aesKey);
    AES_Encrypt(buffer, pValue);
    osal_memcpy(&req.value, buffer, AES_BLOCK_SIZE);
    }
    else
    {
    osal_memcpy(&req.value, pValue, AES_BLOCK_SIZE);
    }

    return ( GATT_WriteNoRsp( conHandle, &req ) );

    其中charHandle是特征值的handle,conHandle是连接的handle,aes加密是可选,我自己实现的。

  • 这个问题解决了,原来是要修改simpleGATTprofile.c中的simpleProfile_WriteAttrCB函数,这里面规定了特征值字节数为1

    if ( len != 1 )
    {
    status = ATT_ERR_INVALID_VALUE_SIZE;
    }

    但是又出现了新的问题,写5个字节内的数据都没问题,但写6个字节以上的数据就直接Discconected,原因是0x08

    #define LL_STATUS_ERROR_CONNECTION_TIMEOUT             0x08 // Connection Timeou

    这是为什么?什么地方规定了只能5字节,不是最大为20字节吗?

    #define ATT_MTU_SIZE                     L2CAP_MTU_SIZE

    #define L2CAP_MTU_SIZE                   23

    typedef struct
    {
    uint16 handle; //!< Handle of the attribute to be written (must be first field)
    uint8 len; //!< Length of value
    uint8 value[ATT_MTU_SIZE-3]; //!< Value of the attribute to be written
    uint8 sig; //!< Authentication Signature status (not included (0), valid (1), invalid (2))
    uint8 cmd; //!< Command Flag
    } attWriteReq_t;

    typedef struct
    {
    uint8 len; //!< Length of value
    uint8 value[ATT_MTU_SIZE-1]; //!< Value of the attribute with the handle given
    } attReadRsp_t;

    typedef struct
    {
    uint16 handle; //!< Handle of the attribute to be written (must be first field)
    uint16 offset; //!< Offset of the first octet to be written
    uint8 len; //!< Length of value
    uint8 value[ATT_MTU_SIZE-5]; //!< Part of the value of the attribute to be written
    } attPrepareWriteReq_t;

    第二个问题,这三个飘红的地方为什么规定的长度不一样?


    恳请TI的工程师和高手来帮帮我!!!!谢谢


  • 写多个字节要修改simpleProfileChangeCB函数。