创建许多海关服务

12个职位/ 0个新职位
最后发表
bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
创建许多海关服务

你好mt_dialog,

我已经使用了模板项目Yith Cust1和Cust2服务,现在我想有100个字段,所以什么可能是最好的方法?

我应该只有100个字段的一个服务,还是为Exemple 5服务创建和每项服务20个字段?

否则,是否有更好的解决方案?因为我需要在连接模式下发送100个变量到我的BLE应用程序。

谢谢你!

关键词:
设备:
bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
你好,

你好,

我尝试在cust1服务中创建20个字段,但是当我运行项目时,我得到了错误:在wrap_platform_reset函数中RESET_MEM_ALLOC_FAIL (0xF2F2F2F2)。它能被修复吗?还是我已经达到极限了?

谢谢你!

Joacimwe.
离线
最后一次露面:10个月前1年
格鲁鲁
加入:2014-01-14 06:45
拥有100的想法

拥有100个特征的想法似乎很糟糕。服务发现时间将花费很长时间,所有数据结构所需的内存分配可能会占用相当大的RAM。

你想做什么?
如果您需要能够远程设置多个变量,那么您应该使用一个特征实现一些简单的协议,因为无论如何您都有自定义服务。
一种解决方案是,当您从中心写入特征时,使用第一个字节来表示您想要写入的变量。其余的字节由实际值组成。然后在gatt特征写处理程序中,您只需检查第一个字节是什么,并对其进行操作。

如果您还需要能够读取变量,您将无法直接使用GATT读取过程。而是使通知能够启用通知,并且如果使用特定值发送写命令(这将指示您想要读取),则会向包含该值的中央发送通知(哪些应该包括正在发送哪个变量)。或者如果您有通知,您希望在没有中央请求的情况下发送,通过包括可变ID和在特征值中的数据。为了确保通知并写入不会在一个特征上相互干扰,请确保您实际上从未在WRITE命令处理程序中使用ATTMDB_ATT_SET_VALUE。

bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
谢谢你!

谢谢你!

我已经想过这个想法,但问题是,我想把大约100值我的智能手机应用程序,该应用程序将显示这些数据,如果我只用一个特点,我应该让100发送操作之前所有值的智能手机应用程序,所以它将需要很长时间,将会更加复杂。

但是这里只有20个特征,我得到了内存分配失败,所以我想我没有这么多选择..

Joacimwe.
离线
最后一次露面:10个月前1年
格鲁鲁
加入:2014-01-14 06:45
你的价值观有多大?

你的价值观有多大?也许您可以将它们打包在一起,并在一个通知中发送多个值?

如果你多次发送相同特征的通知,或者如果你有许多特征,并且每个发送一个通知,它不会有任何性能变化。它一次仍然只能发送一个包。

bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
让我们说2个字节

让我们说每变量2个字节,我认为特征的最大大小是16字节的右边?因此,如果它是真的,我需要超过10个特点..

Joacimwe.
离线
最后一次露面:10个月前1年
格鲁鲁
加入:2014-01-14 06:45
嗨。

嗨。

你可以在一个通知发送20个字节。

这意味着如果你打包了所有东西,你将不得不发送10个通知。

大多数智能手机每个连接事件都能容忍3-4个报文。这意味着您需要大约3个连接事件来发送所有内容。使用50 ms(Android默认值)的连接间隔,这将需要150毫秒。

mt_dialog.
离线
最后一次露面:6个月4周前
工作人员
加入:2015-06-08 11:34
嗨bensalemsaif,

嗨bensalemsaif,

正如Joacimwe建议的那样,拥有100个特征并不是一个好主意,您应该尝试按照建议使用某种协议,并将您的值合并到一个或多个特征中。

您得到这个指示(平台重置)的事实意味着您已经耗尽了为数据库分配的内存。数据库的大小取决于580可以为数据库分配多少内存。请检查下面的帖子如何使你的bd堆更大http://support.dialog-semiconductor.com/increasing-dbheapsz,但将数据打包成一个或多一点的特征仍然是更好的选择。

谢谢mt_dialog.

bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
你好,

你好,

感谢你们答案的答案,我认为合并我的价值观将是最好的选择,但是你能向我解释如何做到这一点?直到现在,让我们说这是我有的:

- 字段UUID:128位
- 领域Char Len
- 现场用户描述
- ATT_CHAR128_DESC.
- 在我的数据库中:field_char,field_val和field_user_desc
我知道这个函数将更新数据库,因为我的数据将动态更改(我将使用uart获得它):
attmdb_att_update_value(句柄,长度,偏移,值)

现在,如果我想合并我的值,就像你建议的,在一个字段,我应该调用update函数与一个包含我所有值的缓冲区?我这样做了,我可以放超过20个字节怎么可能呢?
这里有一个屏幕截图,读取40字节的缓冲区

谢谢你!

Joacimwe.
离线
最后一次露面:10个月前1年
格鲁鲁
加入:2014-01-14 06:45
属性本身可以

属性本身可以大于20字节,但是通知只能是20字节(除非增加MTU)。
您的中心最有可能使用称为“读取长特征值”的GATT功能。(有关详细信息,请参阅蓝牙规范。)

该过程反复使用ATT Read Blob Requests来检索特征的所有部分。在每个请求-响应对中,只能传输22个字节。这种方法的缺点是无效。每个部件大约需要两次往返。如果这对你没有问题的话,你可以这样做。通过通知,您可以一次发送所有通知(在一个连接事件中可以容纳尽可能多的通知)。

如果您的中央支持,我还建议您增加MTU以便能够发送更大的数据包。
您还可以查看蓝牙规范的GATT部分,以查看所有可用选项。

您使用的是什么SDK ?如果使用SDK5和自定义服务,则使用CUSTS1_VAL_NTF_REQ消息发送通知。当它被处理并准备接收下一个时,您将在user_peripheral.c中收到CUSTS1_VAL_NTF_CFM消息。如果使用Read Long Characteristic Values方法,只需发送消息CUSTS1_VAL_SET_REQ并设置较大的特征值。然后堆栈自动处理来自中心的读请求。

bensalemsaif
离线
最后一次露面:4年1个月前
加入:2016-02-02 12:42
你好,

你好,

我使用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),长度,偏移量,new_value)
prf_server_send_event((prf_env_struct *)&custs1_env,0,(custs1_env.shdl + cust1_idx_field1_val))

如果我在智能手机应用程序中启用通知,我可以看到我的新值是动态更新的,它是正确的吗?

谢谢,

mt_dialog.
离线
最后一次露面:6个月4周前
工作人员
加入:2015-06-08 11:34
嗨bensalemsaif,

嗨bensalemsaif,

是的,只有在手机上启用通知时,您只能在客户端上接收数据。关于您使用要发送数据的代码,为什么您没有消息并让自定义配置文件句柄其余的,您只能分配custs1_val_ntf_req和相应的处理程序(custs1_val_ntf_req_handler)将使用与您的相同代码更新值正在使用。

谢谢mt_dialog.

主题锁定