微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > BLE自定义的 Characteristic 包含的数据最大可以为多少?BLE协议栈支持多大的数组?

BLE自定义的 Characteristic 包含的数据最大可以为多少?BLE协议栈支持多大的数组?

时间:10-02 整理:3721RD 点击:

像是例程里面的 SIMPLEPROFILE_CHAR5_LEN 为 5,这个最大可以定义为多少呢?

BLE协议栈可以定义多大的数组?

这个问题很低端吗?

有知道的麻烦请交流一下,谢谢!

有没有人知道啊?

Hi wei,

作为peripheral, 要以notification 或者 indication 形式向central发送数据的时候, 最大允许20个字节一次.

Attribute value - encoding of the octet array is defined in  the applicable profile. The maximum length of an attribute  value shall be 512 octets,

The service, characteristic, characteristic value and descriptors are all stored as attributes on the server

这里说最大的长度是512啊?

这个长度可以自定义吗?

I think my question is simple,but why it takes so long to reply.....

应该就是Yan 所说的那样,不同的模式下分为18个字节和20个字节

1. 512字节说的是一个属性值的最大长度是512字节,而18或者20是(具体记不清楚了)是Notification的最大字节长度

2  不知道能不能修改notification长度

ble4.0 不支持大数据,就是20个字节一包

从哪儿可以看出来是20字节?

你看notification实现的源码

楼上都是正解,我想补充一下,不光是用NOtification发送数据,所有符合蓝牙4.0 BLE协议规范的射频发送数据,最大有效字节数都是20个,这个蓝牙4.0核心规范规定的,是蓝牙技术联盟规定的,具体你可以从网上搜一下这标准规范,整个核心规范2302页,全英文,BLE部分应该每章节的后边部分。

楼上那几位回去好好看看源码吧!压根不是你们解释的那样!你们看看notification那个数据结构:

typedef struct
{
uint16 handle; //!< Handle of the attribute that has been changed (must be first field)
uint8 len; //!< Length of value
uint8 value[ATT_MTU_SIZE-3]; //!< New value of the attribute ,Minimum ATT MTU size =23 宏定义为23
} attHandleValueNoti_t;

value[ATT_MTU_SIZE-3]; //!< New value of the attribute ,Minimum ATT MTU size =23 宏定义为23 

而ATT_MTU_SIZE大小可以设置为23-517字节!所以说BLE是可以实现最大517字节帧的传递的!现在主要是在设置属性表characteristic数组大小的时候,不能超过20字节,超过20字节的大小的数组就连接不上主机,估计是程序跑偏,我想楼主想问的问题就是characteristic最大能定义多大,而不是说BLE能传递多大的数据!BLE底层协议栈是可以传递517字节以下的数据帧的,估计是TI底层了characteristic的数组大小,不知道我这样的理解正不正确,希望TI员工出来解释下为何characteristic最大只能定义20字节的数组,但是他notification数据value的数组大小确可以再23-517字节之间的范围内选择?如果characteristic只能20字节,notification数据有517字节有何用啊?按照BLE传递的数据包结构推算,传递20字节的characteristic整个数据包不会超过50字节!好比水池里的水就是1吨,你要用适配100吨的水管去放水池的水,是不是有点老牛拉小车?

Ti员工和各位真正了解底层的朋友能不能给个正确的解释?

大卫的,

只有20。

协议规定,payload 最大27。有兴趣你可以去看蓝牙的协议栈。第六章中的2.4.

刨去L2CAP的头,4个字节,剩下的就23个字节MTU。就是你看到的。

ATT层会用掉上1个字节的op code, 2个字节的attribute handle,就剩下20了。

不要被517所迷惑,这个是目前CC254x中ATT测试的时候用的。

哦,是这样啊,那是我误解楼上几位大神了,万分抱歉!感觉把示例里面的那几个宏定义删掉最好了,很容易误导人,我反反复复做了一上午的测试实验,就是为了验证修改characteristic数组大小和传递数据包大小能不能定义到517以内,现在听你这么解释总算是清醒了,谢谢yan了,我现在刚入门,看了TI的用户手册和开发者手册,例程也把central和peripheral的例程读了一遍,感觉对BLE通讯的底层和各个细节不是很懂,只是了解了APP层的简单用法,有没有相关的文档资料推荐一下呢,可以深沉了解BLE通讯的知识的,比如您讲的蓝牙协议栈之类的文档。

David,

其实这个MTU只能说明L2CAP层最大支持多少,但是再大的数据,最后还是会被拆分为20个字节。(这个目前在254x上你得自己加些代码处理。)

但是作为slave外设,没必要用这么大,所以254x只用23,再大的,就用来做测试。

能不能帮看看这个网页的问答?

能不能给详细说明一下?

https://developer.bluetooth.org/Community/Lists/Community%20Discussion/Flat.aspx?RootFolder=%2fCommunity%2fLists%2fCommunity%20Discussion%2fMTU%20limit%20on%20BT%20LE&FolderCTID=0x01200200E2F0E56E3D53004DBA96BDF0C357551F

前一段时间我也是遇到这个问题有点疑惑,明明书上写着GATT过程中还有MTU request and respone exchange这一项呢

http://e2e.ti.com/support/wireless_connectivity/f/538/t/71381.aspx

After talking with developers here, we are going to be limited to around 80bytes of application data per connection event.  The 512 size attribute will still be broken down and handled automatically, but the amount of data sent per connection event is still limited.  With the small connection interval and some slave latency - you should only be on when you need to transmit data.  There are some peak current power savings achieved with this implementation,  although it does add overhead with large amounts of data which is the situation you are seeing.

Br,

-Greg

那作为central 向peripheral发数据也是 最大允许20个字节一次吗?

都是20字节,链路层一个包33字节,其中payload27字节,即L2CAP层一个包27字节=MTU(23字节)+header(4字节),MTU=opcode1字节+handle2字节
+data20字节,所以20字节是从链路层开始就有的限制的。这都是BLE中规定好的。

这么给你说把。蓝牙核心协议规范规定的L2M层的最大是容许传输的是255字节。TI自己在封装的时候屏蔽上层的处理,就是TI没做好,就这么简单。原因很可能是功耗的问题。 明白了吗

lenli LENLI,

不要瞎说,你这样会误导真正想学习的人。

蓝牙core spec到4.1版本,BLE的link layer空口最大长度是31个字节,这个所有厂家都一样,不是什么TI没做好。

直到4.2的版本才到255. 而且这个255是需要连接之后双方再握手一次才能使用的,连接建立默认还是向下兼容的31个字节。

TI的254x 只支持到4.1,TI的2640是完全支持4.2的所有spec特性。

是这样哦。不好意思。但是CC2640好像也不支持啊,MTU交换函数完全不能用,用dongle抓不到包。能给个合理的解释,或者技术文档,在CC2640上实现握手交换?

  1. 调用这个API函数 ,并修改参数宏HCI_EXT_SetMaxDataLenCmd(APP_TX_PDU_SIZE ,  APP_TX_TIME,    APP_RX_PDU_SIZE, APP_RX_TIME);  

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top