如何使用“服务已更改”特性使属性缓存失效?

问题描述 投票:0回答:2

我正在微控制器上编写一个小型 BT 应用程序(在

aioble
上使用
Micropython
),但我的问题更笼统地涉及 BT 规范本身。

由于我仍在开发设备,所以我一直在添加/更改服务和特性,并发现 Chrome 似乎缓存了旧服务和从以前的运行中找到的字符 UUID。我知道这样做是出于性能和资源原因,但我想在每次启动时使此缓存无效。

我发现通用属性服务(0x1801)和服务更改特征(0x2A05)应该正是这样做的。我在官方 BT 网站中找不到官方规格(例如此链接似乎已损坏),但找到了其他一些资源,基本上说服务器应该发送一个通知,其中包含代表范围的值应无效的句柄。

这听起来完全像我想要的,但没有任何描述我如何表示“处理范围”..我基本上想删除所有。

有什么帮助吗?另外 - 我是否可以在启动时向字符写入一次值,或者可以在整个设备的生命周期中发送通知?

bluetooth bluetooth-lowenergy micropython
2个回答
2
投票

蓝牙核心规范 v5.3 在第 1532 页描述了服务更改特征:

服务改变的特征值为两个16位属性句柄 连接在一起指示开始和结束属性句柄 受基于 GATT 的服务的添加、删除或修改的影响 服务器。对特征值的更改不被视为修改 的服务。如果对任何 GATT 服务定义进行了更改 除服务更改特征值之外的特征值和 Client Supported Features特征值,范围还应包括 GATT 服务定义的开始和结束属性句柄。

此表描述了服务更改特性所需的值减减:


0
投票

此回答是为了完成官方回答。希望能避免其他不熟悉 bt 堆栈的人(像我这样的菜鸟)度过痛苦的日子。

在 iOS 上,即使广告数据具有不同的名称和服务,它仍然会在连接时获取缓存的数据。使用 nRF connect 连接和断开设备,日志将如下所示

    00:09:38.902 > connected status 1
    00:09:39.204 > get_service pdu_type=E, attOpcode=10, st_hd=1, end_hd=FFFF, att_type=2800
    00:09:39.264 > get_service pdu_type=E, attOpcode=10, st_hd=6, end_hd=FFFF, att_type=2800
    00:09:39.324 > get_service pdu_type=E, attOpcode=10, st_hd=9, end_hd=FFFF, att_type=2800
    00:09:39.384 > get_service pdu_type=E, attOpcode=10, st_hd=1A, end_hd=FFFF, att_type=2800
    00:09:44.605 > connected status 0
    00:09:46.233 > connected status 1 // NOTICE NO SUBSEQUENT SERVICE REQUESTED
    00:09:58.525 > connected status 0

但是你希望日志看起来像这样:

00:09:38.902 > connected status 1
00:09:39.204 > get_service pdu_type=E, attOpcode=10, st_hd=1, end_hd=FFFF, att_type=2800
00:09:39.264 > get_service pdu_type=E, attOpcode=10, st_hd=6, end_hd=FFFF, att_type=2800
00:09:39.324 > get_service pdu_type=E, attOpcode=10, st_hd=9, end_hd=FFFF, att_type=2800
00:09:39.384 > get_service pdu_type=E, attOpcode=10, st_hd=1A, end_hd=FFFF, att_type=2800
00:09:44.605 > connected status 0
00:09:46.233 > connected status 1
00:09:46.494 > get_service pdu_type=E, attOpcode=10, st_hd=1, end_hd=FFFF, att_type=2800
00:09:46.554 > get_service pdu_type=E, attOpcode=10, st_hd=6, end_hd=FFFF, att_type=2800
00:09:46.614 > get_service pdu_type=E, attOpcode=10, st_hd=9, end_hd=FFFF, att_type=2800
00:09:46.674 > get_service pdu_type=E, attOpcode=10, st_hd=1A, end_hd=FFFF, att_type=2800
00:09:58.525 > connected status 0

就我而言,解决此问题的唯一方法是添加服务更改为 0x1801 并将特征更改为 0x2A05。

为了让您了解BT specifications,这里有重要的魔法数字

您可能会猜到,我对 bt 堆栈仍然不够熟练,所以如果术语不正确,请原谅。关键点是服务 0x1801 应该位于句柄 6 上,特征 0x2A05 应该位于 7,8 上,并且具有指示标志。 nRF 上的结果应如下所示:

© www.soinside.com 2019 - 2024. All rights reserved.