你好,
希望有人可以澄清使用这两个功能的差异以及应使用它们的时间/地点。
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是每个连接吗?
谢谢,
亚历克斯。
嗨,亚历克斯,
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); } }
嗨,乔恩,
谢谢你的解释。
这就解释了为什么通知/指示(xxx_ccc_h)被存储到flash中。
我认为连接中心的MAC地址与数据一起存储?
我为上面的混乱道歉。连接/重新连接具有误导性。在这个实例中(BAS示例),应该使用这个特定的API来存储本地值,以便在连接期间进行后续访问。
如果您看一下这个示例,就会在disconnect时调用cleanup来删除所有存储。之所以这样做,是因为值只能与conn_idx关联,而conn_idx只能通过一个连接确定。
因此,在本例中,我们使用ble存储来存储CCC的本地副本(不必每次都从DB中获取它),我们还使用它来对BAS的以前级别进行“完整性”检查。例如,我们轮询电池值,然后去notify -我们检查之前存储在ble_storage.c中的值,看看是否需要通知。如果通知是必要的,因为级别已经改变- ble_storage被更新为新的值,以便后续读取。
这就是它背后的大意。
啊,现在我更困惑!
我可以看到您使用以下方式获取DB的值:BLE_GATTS_GET_VALUE
使用ble_gatts_set_value作为参数传递值并进行测试,并且仅在使用更改时更新DB
但是我不明白为什么有必要使用: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在flash设备中创建一个值的持久副本——在NVMS分区中,用于跨连接/重连接等访问。后一个API用于应用程序数据处理,而第一个API用于直接操作数据库。
一个简单的例子是SDK中的Battery服务:
/乔恩
嗨,乔恩,
谢谢你的解释。
这就解释了为什么通知/指示(xxx_ccc_h)被存储到flash中。
我认为连接中心的MAC地址与数据一起存储?
嗨,亚历克斯,
我为上面的混乱道歉。连接/重新连接具有误导性。在这个实例中(BAS示例),应该使用这个特定的API来存储本地值,以便在连接期间进行后续访问。
如果您看一下这个示例,就会在disconnect时调用cleanup来删除所有存储。之所以这样做,是因为值只能与conn_idx关联,而conn_idx只能通过一个连接确定。
因此,在本例中,我们使用ble存储来存储CCC的本地副本(不必每次都从DB中获取它),我们还使用它来对BAS的以前级别进行“完整性”检查。例如,我们轮询电池值,然后去notify -我们检查之前存储在ble_storage.c中的值,看看是否需要通知。如果通知是必要的,因为级别已经改变- ble_storage被更新为新的值,以便后续读取。
这就是它背后的大意。
嗨,乔恩,
啊,现在我更困惑!
我可以看到您使用以下方式获取DB的值:BLE_GATTS_GET_VALUE
使用ble_gatts_set_value作为参数传递值并进行测试,并且仅在使用更改时更新DB
但是我不明白为什么有必要使用: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。
感谢乔恩。
这是有道理的。