你好,
希望有人能澄清这两个功能的使用区别,以及它们应该在何时/何地使用。
UINT32_T YYY = 0x12345678;
ble_gatts_set_value(xxx_val_h,sizeof(yyy),&yyy);
或
ble_storage_put_u32(conn_idx,xxx_val_h,yyy,true);//使用param conn_idx是每个连接的吗?
谢谢,
亚历克斯。
嗨,亚历克斯,
ble_gatts_set / get()是用于访问本地BLE数据库的API。例如。在连接期间读取和设置数据库中的值。BLE_STORAGE_PUT_UXX()API在闪存设备中创建持久性副本 - 在NVMS分区中的NVMS分区中进行连接/重新连接等。后者API用于应用数据处理,而第一个AP是用于直接操纵的应用程序数据处理数据库。
快速示例是SDK中的电池服务:
/ Jon.
void bas_set_level(ble_service_t * svc,uint8_t级别,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(级别> 100){返回;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(级)和级别);/ * *对于每个连接的设备,我们需要:* - 通知新值,如果呼叫者请求* - 将新值放入存储器以在设备重新连接* / ble_gap_get_connected(&num_conn,&conn_idx)时使用; 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之前的级别进行“Sanity”检查。示例,我们轮询电池值,然后转到通知 - 我们检查存储在BLE_STorage.c中的先前值,以查看是否需要通知。如果必须执行通知,因为级别已更改 - BLE_STOREAGE将更新为后续读取的新值。
这是它背后的一般想法。
啊,现在我更困惑了!
我可以看到您正在使用ble_gatts_get_value从DB中获取值
并使用作为参数传递的值并仅更新DB(如果更改)(如果使用)(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功能需要BLE_GATTS_SET / GET,然后您可以使用BLE_STorage以获取应用原因。
感谢乔恩。
这是有意义的。
嗨,亚历克斯,
ble_gatts_set / get()是用于访问本地BLE数据库的API。例如。在连接期间读取和设置数据库中的值。BLE_STORAGE_PUT_UXX()API在闪存设备中创建持久性副本 - 在NVMS分区中的NVMS分区中进行连接/重新连接等。后者API用于应用数据处理,而第一个AP是用于直接操纵的应用程序数据处理数据库。
快速示例是SDK中的电池服务:
/ Jon.
嗨乔恩,
感谢您的解释。
这将解释为什么通知/指示(xxx_ccc_h)存储为flash。
我猜连接中心的MAC地址是和数据一起存储的?
嗨,亚历克斯,
我为上面的混乱道歉。连接/重新连接是误导性的。在此实例(BAS示例)中,该特定API应用于存储在连接期间的稍后访问的本地值。
如果您查看此示例,请在断开连接时调用清理以删除所有存储。这是为了完成,因为值只能与CONN_IDX相关联,并且只能通过一个连接确保CONN_IDX。
因此,在这种情况下,我们使用BLE存储来存储CCC的本地副本(每次不必从DB获取),并且我们还将其用于对BAS之前的级别进行“Sanity”检查。示例,我们轮询电池值,然后转到通知 - 我们检查存储在BLE_STorage.c中的先前值,以查看是否需要通知。如果必须执行通知,因为级别已更改 - BLE_STOREAGE将更新为后续读取的新值。
这是它背后的一般想法。
嗨乔恩,
啊,现在我更困惑了!
我可以看到您正在使用ble_gatts_get_value从DB中获取值
并使用作为参数传递的值并仅更新DB(如果更改)(如果使用)(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功能需要BLE_GATTS_SET / GET,然后您可以使用BLE_STorage以获取应用原因。
感谢乔恩。
这是有意义的。