你好MT_dialog,
我已经使用了模板项目yith cust1和cust2服务,现在我想要100个字段,那么最好的方法是什么呢?
我应该只创建一个带有100个字段的服务,还是创建5个服务和每个服务的20个字段?
否则,有没有更好的解决方案?因为我需要发送100个连接模式的变量到我的BLE应用程序。
谢谢你!
你好,
我试图在cust1服务中创建20个字段,但是当我运行项目时,我得到了wrap_platform_reset函数中的错误:RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)。它能被修复吗?还是我已经达到极限了?
拥有100个特征的想法似乎很糟糕。服务发现时间将花费很长时间,所有数据结构所需的内存分配可能会占用相当大的RAM。
你想做什么?如果您需要能够远程设置多个变量,您应该使用一个特征来实现一些简单的协议,因为您有自己的自定义服务。一种解决方案是,当您从中心写入特征时,使用第一个字节来指示您想写入哪个变量。其余的字节由实际值组成。然后在gatt特征写处理程序中,您只需检查第一个字节是什么并对其进行操作。
如果您还需要能够读取您的变量,您将不能直接使用gatt读取过程。取而代之的是启用通知,并且有一种方式,如果一个写命令发送了一个特定的值(这将表明您想要读取),您将向包含该值的中央发送一个通知(该值还应该包括正在发送的变量)。或者,如果您希望在中央请求的情况下发送通知,可以通过在特征值中包含变量id和数据来实现相同的操作。要确保通知和写入不会在一个特征上相互干扰,请确保在写入命令处理程序中实际上从未使用attmdb_att_set_value。
我已经想过这个想法,但问题是,我想把大约100值我的智能手机应用程序,该应用程序将显示这些数据,如果我只用一个特点,我应该让100发送操作之前所有值的智能手机应用程序,所以它将需要很长时间,将会更加复杂。
但是这里只有20个特征,我得到内存分配失败,所以我想我没有那么多的选择。
你的价值有多大?也许你可以把它们打包在一起,在一个通知中发送许多值?
如果您多次发送同一个特征的通知,或者如果您有多个特征并且每个特征发送一个通知,则不会有任何性能变化。它一次仍然只能发送一个数据包。
假设每个变量有2字节,我认为特征的最大大小是16字节,对吧?所以如果这是真的,我需要超过10个特征…
嗨。
一个通知可以发送20个字节。
这意味着如果你打包了所有东西,你将不得不发送10个通知。
大多数智能手机允许每个连接事件接收3-4个数据包。这意味着您将需要大约3个连接事件来发送所有内容。如果连接间隔是50毫秒(Android的默认设置),那么这将需要150毫秒。
嗨bensalemsaif,
正如Joacimwe建议的那样,拥有100个特征不是一个好主意,您应该按照建议使用某种协议,并将您的值合并到一个或多个特征中。
您得到这个指示(平台重置)的事实意味着您已经耗尽了为数据库分配的内存。数据库的大小取决于580如何分配用于数据库目的的内存。请查看下面的帖子如何使你的bd堆更大http://support.dialog-semiconductor.com/increasing-dbheapsz,但是将数据打包成一个或更多的特征仍然是更好的选择。
由于MT_dialog
谢谢两位的回答,我想合并我的价值观是最好的选择,但是你能给我解释一下怎么做吗?直到现在,让我们说这是我拥有的:
—字段UUID: 128位-字段char Len—字段User description——att_char128_desc-和在我的数据库:field_char, field_val,和field_user_desc我知道这个函数将更新数据库,因为我的数据将动态改变(我将使用uart得到它):Attmdb_att_update_value(句柄,长度,偏移量,值)
如果我想合并一个字段中的值,我是否应该调用一个包含所有值的缓冲区的update函数?我这么做了,我可以放超过20个字节怎么可能呢?这里附上了一个截图,读取了一个40字节的缓冲区
属性本身可以大于20个字节,但是通知只能是20个字节(除非增加MTU)。你的中心最有可能使用GATT的“读取长特征值”功能。(更多信息参见蓝牙规范。)
该过程重复使用ATT Read Blob请求来检索特征的所有部分。在每个请求-响应对中,只能传输22个字节。这个程序的缺点是它是无效的。每部分大约需要两次往返。如果这对你没有问题,你可以这样做。有了通知,你可以一次发送所有的通知(一个连接事件可以容纳多少通知)。
如果您的中央支持,我还建议您增加您的MTU,以能够发送更大的数据包。您还可以查看蓝牙规范的GATT部分,以查看所有可用的选项。
你使用什么SDK ?如果使用SDK5和自定义服务,则使用CUSTS1_VAL_NTF_REQ消息发送通知。当它被处理并准备接收下一个时,您将在user_peripheral.c中收到CUSTS1_VAL_NTF_CFM消息。如果使用Read Long特征值方法,只需发送消息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), length, 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个字段,但是当我运行项目时,我得到了wrap_platform_reset函数中的错误:RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)。它能被修复吗?还是我已经达到极限了?
谢谢你!
拥有100个特征的想法似乎很糟糕。服务发现时间将花费很长时间,所有数据结构所需的内存分配可能会占用相当大的RAM。
你想做什么?
如果您需要能够远程设置多个变量,您应该使用一个特征来实现一些简单的协议,因为您有自己的自定义服务。
一种解决方案是,当您从中心写入特征时,使用第一个字节来指示您想写入哪个变量。其余的字节由实际值组成。然后在gatt特征写处理程序中,您只需检查第一个字节是什么并对其进行操作。
如果您还需要能够读取您的变量,您将不能直接使用gatt读取过程。取而代之的是启用通知,并且有一种方式,如果一个写命令发送了一个特定的值(这将表明您想要读取),您将向包含该值的中央发送一个通知(该值还应该包括正在发送的变量)。或者,如果您希望在中央请求的情况下发送通知,可以通过在特征值中包含变量id和数据来实现相同的操作。要确保通知和写入不会在一个特征上相互干扰,请确保在写入命令处理程序中实际上从未使用attmdb_att_set_value。
谢谢你!
我已经想过这个想法,但问题是,我想把大约100值我的智能手机应用程序,该应用程序将显示这些数据,如果我只用一个特点,我应该让100发送操作之前所有值的智能手机应用程序,所以它将需要很长时间,将会更加复杂。
但是这里只有20个特征,我得到内存分配失败,所以我想我没有那么多的选择。
你的价值有多大?也许你可以把它们打包在一起,在一个通知中发送许多值?
如果您多次发送同一个特征的通知,或者如果您有多个特征并且每个特征发送一个通知,则不会有任何性能变化。它一次仍然只能发送一个数据包。
假设每个变量有2字节,我认为特征的最大大小是16字节,对吧?所以如果这是真的,我需要超过10个特征…
嗨。
一个通知可以发送20个字节。
这意味着如果你打包了所有东西,你将不得不发送10个通知。
大多数智能手机允许每个连接事件接收3-4个数据包。这意味着您将需要大约3个连接事件来发送所有内容。如果连接间隔是50毫秒(Android的默认设置),那么这将需要150毫秒。
嗨bensalemsaif,
正如Joacimwe建议的那样,拥有100个特征不是一个好主意,您应该按照建议使用某种协议,并将您的值合并到一个或多个特征中。
您得到这个指示(平台重置)的事实意味着您已经耗尽了为数据库分配的内存。数据库的大小取决于580如何分配用于数据库目的的内存。请查看下面的帖子如何使你的bd堆更大http://support.dialog-semiconductor.com/increasing-dbheapsz,但是将数据打包成一个或更多的特征仍然是更好的选择。
由于MT_dialog
你好,
谢谢两位的回答,我想合并我的价值观是最好的选择,但是你能给我解释一下怎么做吗?直到现在,让我们说这是我拥有的:
—字段UUID: 128位
-字段char Len
—字段User description
——att_char128_desc
-和在我的数据库:field_char, field_val,和field_user_desc
我知道这个函数将更新数据库,因为我的数据将动态改变(我将使用uart得到它):
Attmdb_att_update_value(句柄,长度,偏移量,值)
如果我想合并一个字段中的值,我是否应该调用一个包含所有值的缓冲区的update函数?我这么做了,我可以放超过20个字节怎么可能呢?
这里附上了一个截图,读取了一个40字节的缓冲区
谢谢你!
属性本身可以大于20个字节,但是通知只能是20个字节(除非增加MTU)。
你的中心最有可能使用GATT的“读取长特征值”功能。(更多信息参见蓝牙规范。)
该过程重复使用ATT Read Blob请求来检索特征的所有部分。在每个请求-响应对中,只能传输22个字节。这个程序的缺点是它是无效的。每部分大约需要两次往返。如果这对你没有问题,你可以这样做。有了通知,你可以一次发送所有的通知(一个连接事件可以容纳多少通知)。
如果您的中央支持,我还建议您增加您的MTU,以能够发送更大的数据包。
您还可以查看蓝牙规范的GATT部分,以查看所有可用的选项。
你使用什么SDK ?如果使用SDK5和自定义服务,则使用CUSTS1_VAL_NTF_REQ消息发送通知。当它被处理并准备接收下一个时,您将在user_peripheral.c中收到CUSTS1_VAL_NTF_CFM消息。如果使用Read Long特征值方法,只需发送消息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), length, 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