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.

[参考译文] CC2650:GATT_writecharvalue 返回有效句柄的 ATT_ERROR_RSP 0x01 (无效句柄)

Guru**** 2587365 points
Other Parts Discussed in Thread: CC2650STK, CC2540

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/598821/cc2650-gatt_writecharvalue-returns-att_error_rsp-0x01-invalid-handle-for-a-valid-handle

器件型号:CC2650
主题中讨论的其他器件: CC2540

我有四个 CC2650STK 板配置如下:

董事会1:中心角色

Board2、3、4:外围设备角色

对于所有外设节点、连接间隔设置为1秒、并且我已通过监控器件电流消耗曲线验证连接间隔确实设置正确(在完成自动间隔参数更新事件后)。

在中央设备中、我有一个每8秒触发一次的周期性事件。 在所有三个连接的外设成功完成 GAP 参数更新(针对请求的1秒连接间隔)后、周期函数将被启动。  

第一个周期性函数调用会调用 Board2连接句柄的 GATT_writecharvalue。 第2个周期函数调用调用 Board3的 GATT_writecharvalue。 Board4没有 GATT_writecharvalue 调用。  

Board2的 GATT_writecharvalue 的第一次调用成功完成(通过 ATT_write_RSP 确认)。 然而、GATT_writecharvalue 的第二次调用(这次用于 Board3)会获取 ATT_ERROR_RSP && ATT_WRITE_REQ、错误代码为0x1 (无效句柄)。  

我已经检查了很多事项、以确保我没有做任何明显的错误:

  1. 我已通过 btool 验证了 Board3/2的属性句柄。
  2. 我已经验证了连接句柄
  3. Board2和 Board3具有相同的固件(SensorTag 固件的修改版本)。 切换 GATT_writecharvalue 的调用顺序(第一个用于 Board2、第一个用于 Board3)无关紧要。 错误代码始终用于第2个 GATT_writecharvalue 调用。
  4. 我还尝试为该句柄输入 Board3的 WriteCB 函数的断点。 断点似乎永远不会到达;换句话说、Board3永远不会看到该句柄的属性写入请求。
  5. 我已经验证了任何外设(Board2/3/4)的连接从未中断。
  6. 我已检查 GATT_writecharvalue 函数调用的 bStatus_t 状态。 两个调用(首先是 Board2、然后是 Board3)都返回成功、因此写入请求的框架方式没有问题。  

我在某处看到、当多个外设连接到中央时、只能为一个连接传输一个数据包。 我感觉、由于某种原因、扩大连接间隔与它有关。

遗憾的是、我没有 CC2540 USB 软件狗来监听数据包、以查看中央正在为第二个 GATT_writecharvalue 请求传输的确切内容。  

我还可以进一步检查/调试什么?

谢谢、

Vipin

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

    我认为需要一个监听器来查看无线传输中的内容。 从周期性计时器调用 GATT 客户端操作通常不是一种好的方式、除非您已在应用程序中实施信号/流控制检查以验证状态是否正确。

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我将获取监听器硬件并重新发布。 同时,您能否帮助解释为什么从客户端定期调用 GATT_*函数不是一个好主意?

    我的客户端(中央)需要定期监测 GATT 服务器上的传感器状态(例如湿度传感器)、以查看是否已超过特定阈值。 我也可以在服务器端执行此阈值检查、但我不想唤醒传感器节点上的 MCU、而是在客户端处理信息、因为它不限于电池电源。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    不使用 GATT_WriteCharValue(),是否可以使用 GATT_WriteNoRsp()而不需要响应?

    祝你一切顺利
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我可以这么做。 但我确实想确保我的固件中没有真正的问题。 我至少想了解 GATT 服务器的错误响应的原因。

    客户端肯定会发送一些 GATT_writecharvalue 请求(这就是为什么客户端会响应)、但由于某种原因、GATT 服务器会将该请求解释为无效的句柄。 我在代码中添加了一些断点、以确保在客户端上发起 GATT_writecharvalue 调用之前连接句柄和属性句柄正确。