你好
我有一些关于作为attmdb_add_service()输入的总大小参数的问题
假设,我有:
1 128位服务
1 128位特性的类型uint8_t
以下说法是否正确:
Total_size = 16 + 19 + 1
注意:附件16=2
nb_att_32 = 0
注意:附件128=1
问:1
现在,如果我的上述特征是不透明结构类型(根据BT SIG格式值为0x1B),而不是uint8_t
那么我应该输入什么作为它的大小(而不是total_size方程中的+ 1)
问:2
另外,是否必须将特征值大小(取决于类型)添加到总大小中?
我的意思是,如果我在不同的控制器上保存和处理特征读/写值,该控制器在UART上获得读/写请求,那么是否有必要在上面加+1 ?
简言之,我不打算将特征或描述符的值保存在GATT树上的对话框中。我是否仍需要在total_size字段中说明它们的值大小?
问:3
在示例中,我注意到,对于特征描述符(比如CCC或特征描述符或任何自定义描述符),total_size中添加的大小仅用于描述符存储的值,而不是描述符本身。这是正确的吗?如果是,SDK将描述符的UUID和权限存储在哪里?
我提到了函数:attm_svc_create_db_128(),在该函数中,开始时计算总大小和属性数。
设备:

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