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.

CC2640使用ble5stack栈时,使用Notification方式发送数据时的问题?

Other Parts Discussed in Thread: CC2540

即使把MTU设置为251,使用Notification方式发送,数据长度大于20字节都仍会被分解成20字节/包分多次发送!

BT4.2以后不是可以支持大于20字节数据发送了吗?为何会出现这种现象?

BT5.0协议我也查了,没有查到Notification的数据长度,请大神解惑,谢谢!

  • MTU支持251是双方设备协调的过程,请问两个设备都是跑BLE5的协议吗?

  • 是的,我抓包看过,MTU rsp的值是251.

    是不是notify方式不支持大数据包发送,会自动分拆呢?

  • 楼主,你的bt5抓包工具用的啥?还是cc2540 dongle ?

  • 调用下面函数看看是不是返回251

    uint16 L2CAP_GetParamValue ( void  )

    Get the L2CAP parameter value.

    Returns
    L2CAP parameter value
  • 配置更大的MTU

    GATT Client 可以通过使用GATT_ExchangeMTU() 在连接期间请求更大的ATT_MTU。在此过程中,客户端请求服务器其最大支持的接收MTU大小,服务器回复其最大支持的接收MTU大小进行。只有客户端可以启动此过程。当成功交换该值后,ATT_MTU是客户端MTU和服务器MTU值的最小值。如果客户端表示可以支持200字节的MTU,并且服务器响应最大大小为150字节,该ATT_MTU连接的大小为150。

    采取以下步骤配置协议栈以支持较大的MTU值。

    1. 将应用程序项目中的MAX_PDU_SIZE预处理器符号设置为所需的值,以达到L2CAP PDU所需的最大大小。最大ATT_MTU大小总是比MAX_PDU_SIZE小4字节。
    2. 在主从设备建立连接后,调用GATT_ExchangeMTU()(仅限GATT客户端)。传递给此函数的MTU参数必须小于或等于步骤1GATT Servier 中的定义ATT_MTU
    3. 接收ATT_MTU_UPDATED_EVENT以验证MTU是否已成功更新。此更新要求调用已注册的GATT消息任务。

    尽管可以将协议栈配置为支持MAX_PDU_SIZE最大为255个字节,但每个低功耗蓝牙最初连接时都使用默认的27字节(ATT_MTU= 23字节),直到交换MTU过程中出现更大的MTU。必须在每个蓝牙低功耗连接上执行交换MTU过程,且须由客户端发起。

    注意:如果启用安全连接BLE 4.2功能,连接时默认的MTU大小为69。详情查看ble_user_config.h。

    增加ATT_MTU大小可以在单个ATT数据包中发送更多数据。单个数据包中发送的最长属性为(ATT_MTU-1)个字节。如果是通知,则有额外的长度限制。如果一个属性值的长度为100个字节,则读取该整个属性需要读取请求来获取第一个(ATT_MTU-1)字节,然后是多个读取blob请求以获得后续(ATT_MTU-1)字节。要传输整个100字节的有效载荷数据,默认ATT_MTU值为23字节,需要五个请求或响应过程,每个字节返回22个字节。如果执行了交换MTU过程,并且将ATT_MTU其配置为101字节(或更大),则可以在单个读取请求或响应过程中读取整个100个字节。

    注意:由于内存和处理的限制,并不是所有的蓝牙低功耗系统都支持更大的MTU尺寸。在定义系统的行为时,了解预期对等设备的功能。如果对等设备的能力未知,请设计系统使用默认的27字节L2CAP PDU/23字节ATT_MTU 大小。例如,发送长度大于20字节(ATT_MTU-3)字节的通知会导致在不支持较大MTU大小的设备上截断数据。

  • @大秦正声: 抓包工具是CC2540

    @Eggsy Pang: L2CAP_GetParamValue()读出值一直是0

    @Viki Shi: 这段资料我也查到了,并按要求改了MAX_PDU_SIZE,并在ATT_MTU_UPDATED_EVENT事件中验证了MTU交换后已经改过来了,但是发包还是被分包成多个27byte发送

    好像怎么改都没有,无法突破27byte限制,下面是发送的150byte抓的图:

    请教2640是否支持BT4.2的DLE?如果支持该如何打开呢?

  • 是cc2540 dongle ,有影响吗?

  • DLE默认打开的,参考

    http://software-dl.ti.com/lprf/simplelink_cc2640r2_latest/docs/blestack/ble_user_guide/html/ble-stack-3.x/data-length-extensions.html?highlight=dle#le-data-length-extension-dle