你好,
希望有人能澄清这两个功能的使用之间的区别,以及何时何地应该使用它们。
yyy = 0x12345678;
ble_gatts_set_value (xxx_val_h sizeof(多),多);
或
Ble_storage_put_u32 (conn_idx, xxx_val_h, yyy, true);//与参数conn_idx这是每个连接?
谢谢,
亚历克斯。
嗨,亚历克斯,
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); } }
嗨,乔恩,
谢谢你的解释。
这就解释了为什么通知/指示(xxx_ccc_h)被存储到flash中。
我猜连接中心的MAC地址是和数据一起存储的吧?
我为上面的困惑道歉。连接/重新连接是误导性的。在本例中(BAS示例),应该使用这个特定的API存储本地值,以便稍后在连接期间访问。
如果您看一下这个示例,就会发现在断开连接时调用清理操作来删除所有存储。之所以这样做,是因为这些值只能与conn_idx关联,而且只能通过一个连接来确保conn_idx。
因此,在本例中,我们使用ble存储来存储CCC的本地副本(不必每次都从DB获取它),我们还使用它来对BAS的先前级别进行“完整性”检查。例如,我们轮询电池的值,然后去通知-我们检查之前存储在ble_storage.c中的值,看看是否需要通知。如果通知是必要的,因为级别已经改变了——ble_storage会被更新为后续读取的新值。
这是它背后的总体思想。
啊,现在我更困惑了!
我可以看到您正在使用:ble_gatts_get_value从DB中获取值
并使用传递的值作为参数进行测试,只有在更改时才更新DB,使用:ble_gatts_set_value
但是我不知道为什么有必要使用:ble_storage_put_u32
特别是在不同连接的同一中心上,该值不是持久的。
你能帮我把灯打开吗?
你不困惑:)。我认为我用了一个糟糕的例子来说明这个概念,但我认为你已经有了大致的想法。
存储主要是作为本地副本使用,而不是访问数据库。在大多数情况下,应该能够仅使用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。
感谢乔恩。
这是有意义的。
嗨,亚历克斯,
ble_gatts_set/get()是用于访问本地BLE数据库的api。例如,在连接期间在数据库中读取和设置一个值。ble_storage_put_uXX() API在闪存设备中创建一个值的持久副本——在NVMS分区中,用于跨连接/重新连接等访问。后一个API用于应用程序数据处理,而第一个API用于直接操作数据库。
一个简单的例子是SDK中的Battery服务:
/乔恩
嗨,乔恩,
谢谢你的解释。
这就解释了为什么通知/指示(xxx_ccc_h)被存储到flash中。
我猜连接中心的MAC地址是和数据一起存储的吧?
嗨,亚历克斯,
我为上面的困惑道歉。连接/重新连接是误导性的。在本例中(BAS示例),应该使用这个特定的API存储本地值,以便稍后在连接期间访问。
如果您看一下这个示例,就会发现在断开连接时调用清理操作来删除所有存储。之所以这样做,是因为这些值只能与conn_idx关联,而且只能通过一个连接来确保conn_idx。
因此,在本例中,我们使用ble存储来存储CCC的本地副本(不必每次都从DB获取它),我们还使用它来对BAS的先前级别进行“完整性”检查。例如,我们轮询电池的值,然后去通知-我们检查之前存储在ble_storage.c中的值,看看是否需要通知。如果通知是必要的,因为级别已经改变了——ble_storage会被更新为后续读取的新值。
这是它背后的总体思想。
嗨,乔恩,
啊,现在我更困惑了!
我可以看到您正在使用:ble_gatts_get_value从DB中获取值
并使用传递的值作为参数进行测试,只有在更改时才更新DB,使用:ble_gatts_set_value
但是我不知道为什么有必要使用:ble_storage_put_u32
特别是在不同连接的同一中心上,该值不是持久的。
你能帮我把灯打开吗?
嗨,亚历克斯,
你不困惑:)。我认为我用了一个糟糕的例子来说明这个概念,但我认为你已经有了大致的想法。
存储主要是作为本地副本使用,而不是访问数据库。在大多数情况下,应该能够仅使用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。
感谢乔恩。
这是有意义的。