你好,
我有一些关于作为attmdb_add_service()输入的总大小参数的问题
假设,我有:
1 128位服务
1 128位特性的类型uint8_t
以下说法是否正确:
Total_size = 16 + 19 + 1
nb_att_16 = 2
nb_att_32 = 0
nb_att_128 = 1
问:1
现在,如果我的上述特征是类型不透明结构(0x1B作为每BT SIG格式值)而不是uint8_t
那么我应该输入什么作为它的大小(而不是total_size方程中的+ 1)
问:2
另外,是否必须将特征值大小(取决于类型)添加到总大小中?
我的意思是,如果我在不同的控制器上保存和处理特征读/写值,该控制器在UART上获得读/写请求,那么是否有必要在上面加+1 ?
简而言之,我不打算在对话框的GATT树中保存特征或描述符的值。我仍然需要在total_size字段中说明它们的值大小吗?
问:3
在示例中,我注意到,对于特征描述符(比如CCC或特征描述符或任何自定义描述符),total_size中添加的大小仅用于描述符存储的值,而不是描述符本身。这是正确的吗?如果是,SDK将描述符的UUID和权限存储在哪里?
我引用了函数:attm_svc_create_db_128(),在它的开头计算了属性的total_size和no。
设备:
嗨dhrishi,
Q1:我不确定我得到的问题,如果你想有一个值特征值超过1字节,你只需要增加额外的字节到总大小的计算,例如,在上面的例子中,如果你想要一个16位的值,你要加+2,而不是加1,你只需要添加你想要的值特征的字节。请查看AN-B-029.pdf和支持AN-B-029文件的补充教程文件。检查项目sample128_After第7.2节,它将第一个特征的长度增加到8字节。
Q2:是的,你必须声明特征的大小,以便堆栈分配数据库的大小,无论你是否处理其他地方的值,这些值也存储在创建的内部数据库中。
第三季度:是的,当CCC包含在数据库中,只计算两个字节,这是描述符本身的值,每个特征的权限存储在特征声明属性(这就是为什么每个特征声明有19字节大小的数据,UUID的16个字节指向Characteristic的值属性+1个字节表示权限,+2个字节表示句柄)。
由于MT_dialog
Q1:是的。我理解根据数据类型的确切大小应该添加到总大小中。我的意思是,如果我的数据类型是不透明的struct,而不是uint8, uint16或string(当值被读或写时动态添加的tlv列表),那么我将不知道准确的大小,因为它将为每个读/写调用而变化。对于这种类型的特征,我应该在total_size中添加什么?
Q2:即使我没有为任何特征设定价值,它仍然是必需的吗?如果应用程序不使用它,堆栈什么时候使用为特征值分配的值?
Q3:我理解19个字节的划分。但是,如果我的特征支持读和写,它有一个描述符的用户描述,只支持读,那么相同的权限如何适用于两者?
为了更清楚,请给出这个的总大小:
服务:128位
1特性:128位:读写权限:可存储1个字节的数据
1特征描述符:128位(自定义):只读:存储2字节数据
嗨dhrishi,
Q1:你应该提供一个固定长度时宣布为了特征数据库分配的数量,你不能动态地分配数据库的大小取决于你当前的需求,你可以把最大的你希望处理的数据量。
Q2:你可以离开特性的值属性而不设置值,你不需要设置它。必须是在创建数据库时你必须调用设置attribue函数为了设置特点声明属性的值来设置权限和特定属性的UUID,如果这是你在问什么。
第三季度:如果我正确地理解了你的问题,你可以设置你的描述符,如你想(读或写),但是BLE规范为特征描述符定义了固定的属性(例如客户端特征配置应该是可读或可写的),属性仅应用于构成特征的“用户定义”属性。当中央连接到外围,它将不是现在的属性描述符,它会假设它可以读或写(基于描述符,它读取),所以你不需要分配额外的空间在您的数据库,因为这些属性被中央基于类型的描述符。如果您对在描述符上设置特殊权限感兴趣,BLE规范指定了一个额外的描述符,以指定名为“特征扩展属性”的描述符的属性。
由于MT_dialog
Q1。设置最大可能的大小有点困难,因为我们在这些特定特征上获得了超过1000字节的数据,这就是我们不打算在DA14580上存储数据的原因。
Q2。由于我没有初始设置或存储DA14580上的特征值,堆栈什么时候使用为该特定特征值保留的存储?
第三季。好的。关于权限我明白。现在,我想知道的是,为什么堆栈不分配大小存储的描述符的值(例如2字节的CCC描述符,告诉是否通知/指示是启用或禁用)。
同样,根据我之前的问题,我的特征描述符将是一个自定义(16字节UUID)而不是标准的,它将存储2字节的数据值。我需要为这个描述符保留多少字节。简而言之,我需要的总大小:
1服务:128位=>
1特性:128位:读写权限:存储1个字节的数据=> 19 + 1
1个特征描述符:128位(自定义):只读权限:存储2字节的数据=> ??
嗨dhrishi,
正如我提到的,你不能根据你当前的需求分配数据库的数量,你需要指定一个固定的数量。
Q2:除了在创建时自己分配空间之外,我认为堆栈在任何其他情况下都不会使用该区域。
Q3:因为你声明了一个描述符特征,堆栈将自己分配指定的数量,而且你在创建服务时声明了数据库中包含的16位UUID的数量。您为描述符声明的字节(描述符将拥有的实际数据是通过向服务声明声明应该分配的存储为2个字节来分配的)。
关于你的问题,据我所知,你想声明一个自定义128UUID描述符,据我所知,特征描述符不能自定义,而是由BLE规范描述的标准标签,为了描述自定义或采用的特征,例如0x2902客户端特征配置,0x2901用户特征描述等。为了让BLE理解这是一个描述符,您必须声明所采用的标记之一。
由于MT_dialog