你好mt_dialog,
我已经使用了模板项目Yith Cust1和Cust2服务,现在我想有100个字段,所以什么可能是最好的方法?
我应该只有100个字段的一个服务,还是为Exemple 5服务创建和每项服务20个字段?
否则,是否有更好的解决方案?因为我需要在连接模式下发送100个变量到我的BLE应用程序。
谢谢,
你好,
我试图在Cust1服务中创建20个字段,但是当我运行项目时,我收到了错误:reset_mem_alloc_fail(0xf2f2f2f2)的wrap_platform_reset函数。它可以修复吗?或者我刚刚达到了极限?
拥有100个特征的想法似乎很糟糕。服务发现时间需要很长时间,并且所有数据结构所需的内存分配可能会占用相当大的RAM。
你想做什么?如果您需要能够远程设置多个变量,则应使用一个特征来实现一些简单的协议,因为您无论如何都有自定义服务。一个解决方案是,当您从中中心写入特性时,使用第一个字节来指示您要写入的哪个变量。其余的字节包括实际值。然后在您的GATT特征写处理程序中,您只需检查第一个字节是什么并采取行动。
如果您还需要能够读取变量,您将无法直接使用GATT读取过程。而是使通知能够启用通知,并且如果使用特定值发送写命令(这将指示您想要读取),则会向包含该值的中央发送通知(哪些应该包括正在发送哪个变量)。或者如果您有通知,您希望在没有中央请求的情况下发送,通过包括可变ID和在特征值中的数据。为了确保通知并写入不会在一个特征上相互干扰,请确保您实际上从未在WRITE命令处理程序中使用ATTMDB_ATT_SET_VALUE。
我已经考虑过这个想法,但问题是我想向我的智能手机应用程序发送大约100个值,这将显示这个数据,如果我只使用一个特征,我应该在获得智能手机应用程序上的所有值之前发出100个发送操作,所以它也需要很长时间,会更加复杂。
但是这里只有20个特征,我得到了内存分配失败,所以我想我没有这么多选择..
你的价值观多大?也许你可以一起包装它们并在一个通知中发送许多值?
如果您多次发送相同特征的通知,或者如果您有许多特征并发送一个通知,则不会发生任何性能更改。它仍然只能一次发送一个数据包。
让我们说每变量2个字节,我认为特征的最大大小是16字节的右边?因此,如果它是真的,我需要超过10个特点..
你好。
您可以在一个通知中发送20个字节。
这意味着如果包装所有内容,您必须发送10个通知。
大多数智能手机每个连接事件都能容忍3-4个报文。这意味着您需要大约3个连接事件来发送所有内容。使用50 ms(Android默认值)的连接间隔,这将需要150毫秒。
嗨bensalemsaif,
由于JoacimWe建议具有100个特征它是一个坏主意,并且您应该尝试用来使用一些协议并在一个或多个特征中合并您的值。
你有这个指示的事实(平台重置)意味着您已耗尽为数据库分配的内存。数据库多大程度可以取决于为DB目的分配580的内存。请在如何使您的BD堆更大的情况下查看以下帖子http://support.dialog-semicondiondiondum/increasing-dbheapsz.,但仍然在一个或多个特征中包装您的数据是更好的选择。
谢谢mt_dialog.
感谢你们答案的答案,我认为合并我的价值观将是最好的选择,但是你能向我解释如何做到这一点?直到现在,让我们说这是我有的:
- 字段UUID:128位- 领域Char Len- 现场用户描述- ATT_CHAR128_DESC.- 在我的数据库中:field_char,field_val和field_user_desc我知道这个函数将更新数据库,因为我的数据将动态改变(我将使用UART获得它):attmdb_att_update_value(句柄,长度,偏移,值)
所以现在,如果我想在一个字段中建议使用的值,我应该只用包含所有值的缓冲区调用更新函数?我这样做,我可以把超过20个字节放到20多个字节呢?这里有一个屏幕截图,读取40字节的缓冲区
属性本身可以大于20个字节,但通知只能是20个字节(除非您增加MTU)。您的中心最有可能使用称为“读取长特征值”的GATT功能。(有关详细信息,请参阅蓝牙规范。)
该过程反复使用ATT读取BLOB请求以检索特性的所有部分。在每个请求 - 响应对中只能传输22个字节。与此程序的缺点是它无效。每个部分需要大约两个往返往返往返。如果这对你没问题,你可以这样做。通过通知,您可以立即发送所有这些(可以在一个连接事件中适用)。
如果您的中央支持,我还建议您增加MTU以便能够发送更大的数据包。您还可以查看蓝牙规范的GATT部分以查看所有可用选项。
你用的是什么sdk?如果使用SDK5和自定义服务,请发送通知您使用Custs1_val_ntf_req消息。当它已被处理并准备接收下一个后,您将在User_Peripheral.cn中收到Custs1_val_ntf_cfm消息。如果您要获取读取的长特征值方法,只需发送消息Custs1_val_set_req并设置大的特征值。然后堆栈自动处理中央的读取请求。
我正在使用sdk 5.0.3,在我的gapm.c文件中我有这个值:gap_max_le_mtu_var = 512,所以似乎我的mtu = 512吧?
现在有关通知,我能够在uart上获得新值时与这两条线一起发送我的数据:
attmdb_att_update_value((custs1_env.shdl + cust1_idx_field1_val),长度,offset,new_value)prf_server_send_event((prf_env_struct *)&custs1_env,0,(custs1_env.shdl + cust1_idx_field1_val))
如果我在智能手机应用程序中启用通知,我可以看到我的新值是动态更新的,它是正确的吗?
是的,只有在手机上启用通知时,您只能在客户端上接收数据。关于您使用要发送数据的代码,为什么您没有消息并让自定义配置文件句柄其余的,您只能分配custs1_val_ntf_req和相应的处理程序(custs1_val_ntf_req_handler)将使用与您的相同代码更新值正在使用。
你好,
我试图在Cust1服务中创建20个字段,但是当我运行项目时,我收到了错误:reset_mem_alloc_fail(0xf2f2f2f2)的wrap_platform_reset函数。它可以修复吗?或者我刚刚达到了极限?
谢谢,
拥有100个特征的想法似乎很糟糕。服务发现时间需要很长时间,并且所有数据结构所需的内存分配可能会占用相当大的RAM。
你想做什么?
如果您需要能够远程设置多个变量,则应使用一个特征来实现一些简单的协议,因为您无论如何都有自定义服务。
一个解决方案是,当您从中中心写入特性时,使用第一个字节来指示您要写入的哪个变量。其余的字节包括实际值。然后在您的GATT特征写处理程序中,您只需检查第一个字节是什么并采取行动。
如果您还需要能够读取变量,您将无法直接使用GATT读取过程。而是使通知能够启用通知,并且如果使用特定值发送写命令(这将指示您想要读取),则会向包含该值的中央发送通知(哪些应该包括正在发送哪个变量)。或者如果您有通知,您希望在没有中央请求的情况下发送,通过包括可变ID和在特征值中的数据。为了确保通知并写入不会在一个特征上相互干扰,请确保您实际上从未在WRITE命令处理程序中使用ATTMDB_ATT_SET_VALUE。
谢谢,
我已经考虑过这个想法,但问题是我想向我的智能手机应用程序发送大约100个值,这将显示这个数据,如果我只使用一个特征,我应该在获得智能手机应用程序上的所有值之前发出100个发送操作,所以它也需要很长时间,会更加复杂。
但是这里只有20个特征,我得到了内存分配失败,所以我想我没有这么多选择..
你的价值观多大?也许你可以一起包装它们并在一个通知中发送许多值?
如果您多次发送相同特征的通知,或者如果您有许多特征并发送一个通知,则不会发生任何性能更改。它仍然只能一次发送一个数据包。
让我们说每变量2个字节,我认为特征的最大大小是16字节的右边?因此,如果它是真的,我需要超过10个特点..
你好。
您可以在一个通知中发送20个字节。
这意味着如果包装所有内容,您必须发送10个通知。
大多数智能手机每个连接事件都能容忍3-4个报文。这意味着您需要大约3个连接事件来发送所有内容。使用50 ms(Android默认值)的连接间隔,这将需要150毫秒。
嗨bensalemsaif,
由于JoacimWe建议具有100个特征它是一个坏主意,并且您应该尝试用来使用一些协议并在一个或多个特征中合并您的值。
你有这个指示的事实(平台重置)意味着您已耗尽为数据库分配的内存。数据库多大程度可以取决于为DB目的分配580的内存。请在如何使您的BD堆更大的情况下查看以下帖子http://support.dialog-semicondiondiondum/increasing-dbheapsz.,但仍然在一个或多个特征中包装您的数据是更好的选择。
谢谢mt_dialog.
你好,
感谢你们答案的答案,我认为合并我的价值观将是最好的选择,但是你能向我解释如何做到这一点?直到现在,让我们说这是我有的:
- 字段UUID:128位
- 领域Char Len
- 现场用户描述
- ATT_CHAR128_DESC.
- 在我的数据库中:field_char,field_val和field_user_desc
我知道这个函数将更新数据库,因为我的数据将动态改变(我将使用UART获得它):
attmdb_att_update_value(句柄,长度,偏移,值)
所以现在,如果我想在一个字段中建议使用的值,我应该只用包含所有值的缓冲区调用更新函数?我这样做,我可以把超过20个字节放到20多个字节呢?
这里有一个屏幕截图,读取40字节的缓冲区
谢谢,
属性本身可以大于20个字节,但通知只能是20个字节(除非您增加MTU)。
您的中心最有可能使用称为“读取长特征值”的GATT功能。(有关详细信息,请参阅蓝牙规范。)
该过程反复使用ATT读取BLOB请求以检索特性的所有部分。在每个请求 - 响应对中只能传输22个字节。与此程序的缺点是它无效。每个部分需要大约两个往返往返往返。如果这对你没问题,你可以这样做。通过通知,您可以立即发送所有这些(可以在一个连接事件中适用)。
如果您的中央支持,我还建议您增加MTU以便能够发送更大的数据包。
您还可以查看蓝牙规范的GATT部分以查看所有可用选项。
你用的是什么sdk?如果使用SDK5和自定义服务,请发送通知您使用Custs1_val_ntf_req消息。当它已被处理并准备接收下一个后,您将在User_Peripheral.cn中收到Custs1_val_ntf_cfm消息。如果您要获取读取的长特征值方法,只需发送消息Custs1_val_set_req并设置大的特征值。然后堆栈自动处理中央的读取请求。
你好,
我正在使用sdk 5.0.3,在我的gapm.c文件中我有这个值:gap_max_le_mtu_var = 512,所以似乎我的mtu = 512吧?
现在有关通知,我能够在uart上获得新值时与这两条线一起发送我的数据:
attmdb_att_update_value((custs1_env.shdl + cust1_idx_field1_val),长度,offset,new_value)
prf_server_send_event((prf_env_struct *)&custs1_env,0,(custs1_env.shdl + cust1_idx_field1_val))
如果我在智能手机应用程序中启用通知,我可以看到我的新值是动态更新的,它是正确的吗?
谢谢,
嗨bensalemsaif,
是的,只有在手机上启用通知时,您只能在客户端上接收数据。关于您使用要发送数据的代码,为什么您没有消息并让自定义配置文件句柄其余的,您只能分配custs1_val_ntf_req和相应的处理程序(custs1_val_ntf_req_handler)将使用与您的相同代码更新值正在使用。
谢谢mt_dialog.