ble_gatts_set_value VS ble_storage_put_u32

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
7个职位/ 0个新职位
最后发表
alexedge
离线
最后看到:10个月2天前
加入:2016-12-14十七12
ble_gatts_set_value VS ble_storage_put_u32

你好,

希望有人能澄清这两个功能的使用区别,以及它们应该在何时/何地使用。

Uint32_t yyy = 0x12345678;

ble_gatts_set_value (xxx_val_h sizeof(多),多);

Ble_storage_put_u32 (conn_idx, xxx_val_h, yyy, true);//使用参数conn_idx是每个连接吗?

谢谢,

亚历克斯。

设备:
JK_Dialog
离线
最后看到:三个月三个星期前
工作人员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

ble_gatts_set/get()是用于访问本地BLE数据库的api。例如,在连接过程中读取和设置数据库中的值。ble_storage_put_uXX() API在flash设备中创建一个值的持久副本——在NVMS分区中,用于跨连接/重连接等访问。后一个API用于应用程序数据处理,而第一个API用于直接操作数据库。

一个简单的例子是SDK中的Battery服务:

/乔恩

Void bas_set_level(ble_service_t *svc, uint8_t level, bool notify) {bat_service_t *bas = (bat_service_t *) svc;Uint8_t prev_level = 0x00;Uint16_t prev_level_len = sizeof(prev_level);uint8_t num_conn;uint16_t * conn_idx;If (level > 100) {return;} ble_gatts_get_value(bas->bl_val_h, &prev_level_len, &prev_level);If (level == prev_level) {return;} ble_gatts_set_value(bas->bl_val_h, sizeof(level), &level);/* *对于每个连接的设备,我们需要:* - notify新值,如果被调用者请求* -当设备重新连接时,将新值放入存储中使用*/ while (num_conn--) { if (notify) { notify_level(svc, conn_idx[num_conn], level); } ble_storage_put_u32(conn_idx[num_conn], bas->bl_val_h, level, true); } if (conn_idx) { OS_FREE(conn_idx); } }

alexedge
离线
最后看到:10个月2天前
加入:2016-12-14十七12
嗨,乔恩,

嗨,乔恩,

谢谢你的解释。

这就解释了为什么通知/指示(xxx_ccc_h)被存储到flash中。

我猜连接中心的MAC地址是和数据一起存储的?

JK_Dialog
离线
最后看到:三个月三个星期前
工作人员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

我为上面的混乱道歉。连接/重新连接具有误导性。在这个实例中(BAS示例),应该使用这个特定的API来存储本地值,以便在连接期间进行后续访问。

如果您看一下这个示例,就会在disconnect时调用cleanup来删除所有存储。之所以这样做,是因为值只能与conn_idx关联,而conn_idx只能通过一个连接确定。

因此,在本例中,我们使用ble存储来存储CCC的本地副本(不必每次都从DB中获取它),我们还使用它来对BAS的以前级别进行“完整性”检查。例如,我们轮询电池值,然后去notify -我们检查之前存储在ble_storage.c中的值,看看是否需要通知。如果通知是必要的,因为级别已经改变- ble_storage被更新为新的值,以便后续读取。

这就是它背后的大意。

alexedge
离线
最后看到:10个月2天前
加入:2016-12-14十七12
嗨,乔恩,

嗨,乔恩,

啊,现在我更困惑了!

我可以看到您正在使用ble_gatts_get_value从DB中获取值

使用ble_gatts_set_value作为参数传递值并进行测试,并且仅在使用更改时更新DB

但是我不明白为什么有必要使用:ble_storage_put_u32

特别是如果该值不是跨不同连接的相同中心的持久值。

你能帮我把灯打开吗?

JK_Dialog
离线
最后看到:三个月三个星期前
工作人员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

你不会感到困惑:)。我认为我用了一个糟糕的例子来说明这个概念,但我认为你们已经有了大概的想法。

存储主要只是用于本地副本,而不是访问数据库。在大多数情况下,您应该能够只使用ble_gatts_get_value和ble_gatts_set_value来访问最新的数据库值。如果您希望存储本地副本(我们在大多数示例中都是这样做的),则使用存储。如果您希望获得最新的数据库值,请使用ble_gatts API。

在我们的例子中有两种形式,我同意这有点让人困惑。对于ble_gatts_set/get,在bas_notify_level中以简单的方式说明了这一点。我们已经使用bas_set_level设置了级别,所以我们可以使用ble_gatts_get_value,然后在它后面加上notify_level。现在使用ble_storage_put_32在flash中存储它的本地副本。

因此,如果您想要读取和修改数据库,ble_gatts_set/get是适当的BLE功能所必需的,然后您可以出于应用程序的原因使用ble_storage。

alexedge
离线
最后看到:10个月2天前
加入:2016-12-14十七12
感谢乔恩。这是有意义的。

感谢乔恩。

这是有意义的。