ble_gatts_set_value VS ble_storage_put_u32

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

你好,

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

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在闪存设备中创建一个值的持久副本——在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;如果(level > 100){返回;} ble_gatts_get_value(bas->bl_val_h, &prev_level_len, &prev_level);If (level == prev_level){返回;} ble_gatts_set_value(bas->bl_val_h, sizeof(level), &level);/* *对于每个连接的设备,我们需要:* -通知新值,如果调用者请求* -将新值存入存储,当设备重新连接时使用*/ 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存储本地值,以便稍后在连接期间访问。

如果您看一下这个示例,就会发现在断开连接时调用清理操作来删除所有存储。之所以这样做,是因为这些值只能与conn_idx关联,而且只能通过一个连接来确保conn_idx。

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

这是它背后的总体思想。

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

嗨,乔恩,

啊,现在我更困惑了!

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

并使用传递的值作为参数进行测试,只有在更改时才更新DB,使用:ble_gatts_set_value

但是我不知道为什么有必要使用: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
感谢乔恩。这是有意义的。

感谢乔恩。

这是有意义的。