你好,
希望有人能澄清这两个功能的使用区别,以及它们应该在何时/何地使用。
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分区中进行连接/重新连接等。后者API用于应用数据处理,而第一,则用于直接操纵数据库。
快速示例在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中获取),并且我们也使用它来执行“Sanity”检查之前的BAS的级别。示例,我们轮询电池值,然后转到通知 - 我们检查存储在BLE_Storage.c中的先前值,以查看是否需要通知。如果需要通知,因为级别已更改 - BLE_STOREAGE以后续读取的新值更新。
这是它背后的一般想法。
啊,现在我更困惑了!
我可以看到您正在使用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功能需要BLE_GATTS_SET / GET,然后您可以使用BLE_STORAGE以获取应用原因。
感谢乔恩。
这是有意义的。
嗨,亚历克斯,
ble_gatts_set / get()是用于访问本地BLE数据库的API。例如。在连接期间读取和设置数据库中的值。BLE_STORAGE_PUT_UXX()API在闪存设备中创建值的持久副本 - 在NVMS分区中进行连接/重新连接等。后者API用于应用数据处理,而第一,则用于直接操纵数据库。
快速示例在SDK中的电池服务中:
/ Jon.
嗨乔恩,
感谢您的解释。
这将解释为什么通知/指示(xxx_ccc_h)存储为flash。
我猜连接中心的MAC地址是和数据一起存储的?
嗨,亚历克斯,
我对上面的混乱道歉。连接/重新连接是误导性的。在此实例(BAS示例)中,应使用此特定API存储在连接期间的稍后访问的本地值。
如果您查看此示例,请在断开连接时调用清理以删除所有存储。这样做是这样的,因此值只能与Conn_IDX相关联,并且只能通过一个连接确保CONN_IDX。
因此,在这种情况下,我们使用BLE存储来存储CCC的本地副本(不必每次从DB中获取),并且我们也使用它来执行“Sanity”检查之前的BAS的级别。示例,我们轮询电池值,然后转到通知 - 我们检查存储在BLE_Storage.c中的先前值,以查看是否需要通知。如果需要通知,因为级别已更改 - BLE_STOREAGE以后续读取的新值更新。
这是它背后的一般想法。
嗨乔恩,
啊,现在我更困惑了!
我可以看到您正在使用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功能需要BLE_GATTS_SET / GET,然后您可以使用BLE_STORAGE以获取应用原因。
感谢乔恩。
这是有意义的。