ble_gatts_set_value vs ble_storage_put_u32.

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
7个帖子/ 0新
最后一篇
alexedge.
离线
最后看到:1年1星期前
加入:2016-12-14 17:12
ble_gatts_set_value vs ble_storage_put_u32.

你好,

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

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是每个连接的吗?

谢谢,

亚历克斯。

设备:
JK_DIALOG.
离线
最后看到:6个月3天前
职员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

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); } }

alexedge.
离线
最后看到:1年1星期前
加入:2016-12-14 17:12
嗨乔恩,

嗨乔恩,

感谢您的解释。

这将解释为什么通知/指示(xxx_ccc_h)存储为flash。

我猜连接中心的MAC地址是和数据一起存储的?

JK_DIALOG.
离线
最后看到:6个月3天前
职员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

我对上面的混乱道歉。连接/重新连接是误导性的。在此实例(BAS示例)中,应使用此特定API存储在连接期间的稍后访问的本地值。

如果您查看此示例,请在断开连接时调用清理以删除所有存储。这样做是这样的,因此值只能与Conn_IDX相关联,并且只能通过一个连接确保CONN_IDX。

因此,在这种情况下,我们使用BLE存储来存储CCC的本地副本(不必每次从DB中获取),并且我们也使用它来执行“Sanity”检查之前的BAS的级别。示例,我们轮询电池值,然后转到通知 - 我们检查存储在BLE_Storage.c中的先前值,以查看是否需要通知。如果需要通知,因为级别已更改 - BLE_STOREAGE以后续读取的新值更新。

这是它背后的一般想法。

alexedge.
离线
最后看到:1年1星期前
加入:2016-12-14 17:12
嗨乔恩,

嗨乔恩,

啊,现在我更困惑了!

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

并使用作为参数传递的值并仅更新DB(如果使用:BLE_GATTS_SET_VALUE)的值

但我没有看到为什么需要使用:ble_storage_put_u32

特别是如果在不同连接中的相同中央的值并不持久。

请你能为我打开灯!?

JK_DIALOG.
离线
最后看到:6个月3天前
职员
加入: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功能需要BLE_GATTS_SET / GET,然后您可以使用BLE_STORAGE以获取应用原因。

alexedge.
离线
最后看到:1年1星期前
加入:2016-12-14 17:12
感谢乔恩。这是有意义的。

感谢乔恩。

这是有意义的。