ble_gatts_set_value vs ble_storage_put_u32.

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在进入我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-semicondiondiondumon.com/support.。我们将在未来几天修复错误/优化搜索和标记。
7个帖子/ 0新
最后一篇文章
alexedge.
离线
最后看到:8个月3天前
加入: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.
离线
最后看到:3个星期前1个月
职员
加入:2016-08-22 23:07
嗨,亚历克斯,

嗨,亚历克斯,

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

alexedge.
离线
最后看到:8个月3天前
加入:2016-12-14 17:12
嗨乔恩,

嗨乔恩,

感谢您的解释。

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

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

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

嗨,亚历克斯,

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

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

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

这是它背后的一般想法。

alexedge.
离线
最后看到:8个月3天前
加入:2016-12-14 17:12
嗨乔恩,

嗨乔恩,

啊,现在我更困惑了!

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

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

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

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

请你能让我打开灯!?

JK_DIALOG.
离线
最后看到:3个星期前1个月
职员
加入: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.
离线
最后看到:8个月3天前
加入:2016-12-14 17:12
感谢乔恩。这是有意义的。

感谢乔恩。

这是有意义的。