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.

在使用CC2640R2F的过程中,服务发现失败

Other Parts Discussed in Thread: CC2640R2F

SDK:4.3版本。开发环境:CCS。协议版本:ble5stack。

根据ble5_simple_peripheral_cc2640r2lp_app修改的程序,作为单连接的从机设备,使用手机在发现服务的过程中出现了发现服务失败的问题,请协助分析一下

  • 这是对方设置的问题,看下面解释:

    Attribute permissions,Attribute的权限属性,权限属性不会直接在空口包中体现,而是隐含在ATT命令的操作结果中。假设一个attribute read属性设为open(即读操作不需要任何权限),那么client去读这个attribute时server将直接返回attribute的值;如果这个attribute read属性设为authentication(即需要配对才能访问),如果client没有与server配对而直接去访问这个attribute,那么server会返回一个错误码:告诉client你的权限不够,此时client会对server发起配对请求,以满足这个attribute的读属性要求,从而在第二次读操作时server将把相应的数据返回给client。目前主要有如下四种权限属性:

    Open,直接可以读或者写

    No Access,禁止读或者写

    Authentication,需要配对才能读或者写,由于配对有多种类型,因此authentication又衍生多种子类型,比如带不带MITM,有没有LESC

    Authorization,跟open一样,不过server返回attribute的值之前需要应用先授权,也就是说应用可以在回调函数里面去修改读或者写的原始值。

    Signed,签名后才能读或者写,这个用得比较少。

  • 但是我在设置的时候,并没有把这个服务下的权限设置为需要匹配或者认证的模式。这个情况很特殊,只出现在某些特定型号的手机上,在反复连接几次之后才会出现APP不能读出服务。
  • 按照描述,怀疑是手机的问题,建议查一下手机的蓝牙部分,是不是有什么特殊要求
  • 根据抓包的结果来看,是因为CC2640R2F在回复手机的过程中数据格式错误导致的,错误码是这个 :Error Code: Insufficient Resources (0x11)。请问你们之前有遇到过类似的问题吗
  • 资源不足的话,建议如下设置:
    1、优化flash/RAM的使用:dev.ti.com/.../creating-a-custom-bluetooth-low-energy-application.html
    2、检查heap的使用情况 及HeapMgr的使用情况:dev.ti.com/.../debugging-index.html
  •  我们也查看了蓝牙手册Core_V5.0,看到有这个错误,但是并没有看见详细的说明,针对这个资源不足的问题,有如下疑问:

    1.Insufficient Resource资源不足这个错误是如何产生的?资源不足具体指的是什么,是芯片的flash、RAM不足或者是对方手机的资源不足?是否有对这个问题详细的解释说明。

    2.若确认是资源不足的问题,那么为什么只存在于某些特定的手机型号,目前测试来看主要是华为手机存在此问题,并且当华为手机连接出现不能获取服务列表的时候,不断电的情况下别的手机仍然可以正常连接获取服务,不会出现此问题。

  •  这是我的flash和ram的使用情况

  • 1、没有详细说明,一般是设备方的资源不足
    2、建议按照上面的方式排查
  • 按照这个逻辑来说,也就是使用华为手机的时候会占用更多的资源?而别的手机就不会?
  • 目前看来是这样,是不是有多次读取或读取过于频繁等操作?
  • 从抓包的结果来看,没有多次读取操作。我发现可能是由于MTU值造成的,很可能是华为手机的MTU和别的手机的不一样。因为我在尝试将MTU值改小之后,华为手机成功读取服务的次数能明显增加。另外可能协议栈还是存在内存泄漏或者是内存释放不及时,导致在建立新的连接时协议栈不能申请到更多的空间。
  • 有可能是过大的MTU造成SimpleBLEPeripheral_taskFxn的堆栈溢出了,此错误会造成各种奇怪问题,可以加大堆栈大小试试