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.

[参考译文] RTOS/CC2650EM-7ID-RD:SimpleBLECentral 读取/写入特性

Guru**** 2577385 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/590083/rtos-cc2650em-7id-rd-simpleblecentral-read-write-characteristic

器件型号:CC2650EM-7ID-RD

工具/软件:TI-RTOS

您好!

我设置了两个 SmartRF06、一个处于中央模式、另一个处于外设模式。 我创建了4个定制服务、并能够将中央设备连接到外设。 如果已连接、则向上按钮将交替发出样本读取/写入请求。

答案是:

  • 读取:0
  • 写入:错误3

在外设中、特性被设置为只读。 我的问题是,我不知道要读哪一个 Chara。

那么、如果这是一个读取/写入请求、我如何执行一个特性的实际读取/写入? 我要在哪个点设置 UUID?

注:

这是我使用的请求函数:

bStatus_t GATT_ReadCharValue (uint16 connHandle、attReadReq_t * pReq、
uint8 taskId)
{
return gattRequest (connHandle、(attMsg_t *) pReq、taskId、ATT_read_Req);
} 

bStatus_t GATT_WriteCharValue (uint16 connHandle、attWriteReq_t * pReq、
uint8 taskId)
{
return gattRequest (connHandle、(attMsg_t *) pReq、taskId、ATT_write_Req);
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Luis、

    是的、您可以使用这些 API 来读取/写入特性。 例如、您可以查看 simple_central 项目以查看其如何完成:

    写一个字符:

    REQ.Handle = charHdl;
    Req.len = 1;
    REQ.pValue[0]= charVal;
    REQ.SIG = 0;
    REQ.cmd = 0;

    状态= GATT_WriteCharValue (connHandle、&req、self 实体);

    读取字符:
    //读取
    attReadReq_t req;

    REQ.Handle = charHdl;
    状态= GATT_ReadCharValue (connHandle、&req、self 实体);

    您必须知道特征的句柄、在发现过程中可以找到该句柄。 此外、如果特征没有写入属性、则不应尝试写入、否则会返回错误。

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Zahid、

    感谢您的回答。 现在、我了解我必须使用句柄、而不是 UUID。  还有另一个线程、类似于我的: e2e.ti.com/.../508093

    仍然存在如何将 UUID 引用到句柄的问题、此时我还不知道。 在我的示例中、我有一些自定义服务。 如何知道我要读取/写入哪个?

    顺便说一下、我弄清楚了我的问题是什么。 我无法读取/写入、因为发现例程无法找到正确的服务、因此无法继续特征发现。 此时:

    //找到服务,存储句柄
    if (pMsg->method = ATT_find_BY_TYPE_Value_RSP &&
    pMsg->msg.findByTypeValueRsp.numInfo >0) 

    PMsg.method 为0x01。

    我的服务将0xFF01作为 UUID。 我确信存在与 SimpleBLECentral_processGATTDiscEvent 函数不兼容的情况。 你有什么建议吗?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    0x01对应于 ATT_ERROR_RSP。
    您是否调用了 GATT_DiscPrimaryServiceByUUUUUID()?

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    是的、我调用了

    状态= GATT_DiscPrimaryServiceByUUID (connHandle、uuid、ATT_BT_UUART_SIZE、self实体); 

    其中 uuid = 0xF0FF 由给定

    uint8_t uuuid[ATT_BT_UUID_SIZE]={LO_UINT16 (SIMPLEPROFILE_SERV_UUID)、
    hi_uint16 (SIMPLEPROFILE_SERV_UUID)}; 

    GATT_DiscPrimaryServiceByUUUUUUUUUUUID()的响应为0x00 (状态= 0x00)。

    如果我 得到 ATT_ERROR_RSP、这是否意味着我的外设未应答或我的中央设备发送了错误的请求?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现 GATT_DiscPrimaryServiceByUUUUUUUUID()的响应总是成功的,我不知道原因。 现在、我已经给出了另一个 UUID 作为参数、即来自外设上的主服务的 UUID (0x180A)。 响应也是成功的、但是 DISCState 永远不会更改为 BLE_DISC_State_SVC (0x02)。 也没有其他的 gattDiscEvents 了...

    我现在所做的只是使用 TI 的预定义函数和服务。 我缺少什么吗?

    此致

    更新:发现服务后、我得到了

    pMsg->msg.errorRsp.errCode (= 0x0A)//ATT_ERR_ATTR_NOT _未找到
    pMsg->msg.errorRsp.reqOpcode (= 0x06)//ATT_find_BY_TYPE_Value_Req 

    作为响应。 它似乎是失败的请求。 仅当属性的红色或写入请求 失败时、才会设置此错误。