BLE 定向广播和privacy mode的纠缠

2023-12-17 11:50

本文主要是介绍BLE 定向广播和privacy mode的纠缠,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BLE 定向广播和privacy mode的解析

1. 问题

近两年来,安卓客户经常在bug系统上碰到客户提问,BLE蓝牙遥控器无法回连。对策下起来好说,如下:

diff --git a/internal_include/bt_target.h b/internal_include/bt_target.h
index dd8c74e..18cbcba 100644
--- a/internal_include/bt_target.h
+++ b/internal_include/bt_target.h
@@ -548,8 +548,9 @@/** Enables or disables support for local privacy (ex. address rotation)*/
+#undef BLE_LOCAL_PRIVACY_ENABLED#ifndef BLE_LOCAL_PRIVACY_ENABLED
-#define BLE_LOCAL_PRIVACY_ENABLED TRUE
+#define BLE_LOCAL_PRIVACY_ENABLED FALSE#endif/*
diff --git a/stack/btm/btm_ble_bgconn.cc b/stack/btm/btm_ble_bgconn.cc
index 3607cda..3f459b1 100644
--- a/stack/btm/btm_ble_bgconn.cc
+++ b/stack/btm/btm_ble_bgconn.cc
@@ -364,7 +364,9 @@ static bool btm_ble_start_auto_conn() {btm_ble_enable_resolving_list_for_platform(BTM_BLE_RL_INIT);if (btm_cb.ble_ctr_cb.rl_state != BTM_BLE_RL_IDLE &&controller_get_interface()->supports_ble_privacy()) {
+    #if ( BLE_LOCAL_PRIVACY_ENABLED == TRUE)own_addr_type |= BLE_ADDR_TYPE_ID_BIT;
+    #endifpeer_addr_type |= BLE_ADDR_TYPE_ID_BIT;}

好了,问题解决了。但这是什么原因呢?
前面一个对策意思是不使用privacy mode, 后面一个对策意思是本地Device不生成RPA地址(参考4.10节),具体见HCI规格7.8.12.
BLE_LOCAL_PRIVACY_ENABLED默认TRUE是google写的,应该问题不大。同时,观察市面上安卓手机行为,设置的是TRUE。这些遥控器也没办法回连其他手机。而对比其他蓝牙HID LE设备,例如鼠标,是可以回连的。由此可见,这个对策只是规避对策,不是解决对策, 问题还是出在遥控器身上。

2. 原因分析

通过空中抓包,发现这台HID设备回连的时候一直发定向广播,定向广播回连理论上更快,这原则上没问题。那为什么默认情况下回连失败呢?

经过调查,是因为TargetA地址(外围设备广播消息,221030说明)给的是公有地址,而蓝牙4.2以上规范,定向回连中,规定如果Host使用了可解析私有地址(RPA)时,Device(中央设备端,221030说明)不响应TargetA公有地址和静态私有地址(两个合起来叫做identity address)。所以回连失败。此种情况下,TargetA只能给RPA地址.
在这里插入图片描述

图1

那熟悉协议的同学可能会说,定向回连本来就是要用静态私有地址或者公有地址,因为定向回连只接受白名单地址,白名单只可能是静态地址或者公有地址,并且是由控制器完成自动回连的。那不是和上面冲突了?

好吧,直接说答案吧:

  1. 确实,在蓝牙4.1以下(含,下同)时,定向回连就是这样的,只接受白名单地址(外围设备地址AdvA)。大家知道,白名单只能是静态地址或者公有地址(才有意义)。在使用白名单情况+蓝牙4.1之前,控制器是不支持reslove list的。也就是说,控制器并不知道对方IRK,4.1之前这些信息是保存在蓝牙Host协议栈的。所以,广播设备的控制器想填充TargetA 地址,只可能是白名单中的地址,不可能填写PRA地址,因为他根本没记录过这个,也不会自己生成(只能Host才有IRK来生成)。
    在这里插入图片描述

    图2
  2. 蓝牙4.2(含,下同)以后,就有了Device Privacy Mode。而大家知道,Privacy Mode是基于RPA地址的。安卓作为一个通用OS系统,肯定默认要打开Device Privacy Mode, 用来达成最强的隐私特性。此种情况下,定向回连也是可以支持的,是因为Device Privacy Mode增加的同时,新增了reslove list功能。reslove list中每一组数据中会含有本地IRK,对端IRK和Identity Address。这样,在Device Privacy Mode情况下,即使广播设备使用RPA地址,也可以使用IRK先核对定向广播中的AdvA地址,找到对应的Identity Address在reslove list的记录,并和白名单地址比对,如果一致,Device就接受AdvA地址,同时查看TargetA地址是否符合图1要求,并决定链连接是否继续。
    图1 INITIATING STATE代表中心设备的初始状态. 对于外围设备, 对应状态叫做广播状态(221030新增说明).

3. 定向广播和privacy mode历史的纠缠

这里,我们可以分析下为什么遥控器厂为什么一直使用公有地址,然后让安卓厂一直忙于应付,不断发开头所示的补丁?

(1) 相信大家也猜到了,基本上是因为遥控器厂在蓝牙4.0/4.1时代的遗产,那时候使用公有地址+定向广播真香;
(2) 但是到了蓝牙4.2以后,遥控器厂可能疏忽了Device Privacy Mode的变更,并延续了此前设置。然后客户觉得遥控器啥也没动,只有安卓厂升级SDK了。于是把问题扔给安卓厂,安卓厂关闭安卓端本身的Device Privacy Mode特性,这样privacy mode同蓝牙4.1一致, 问题解决。
(3) 相反,鼠标厂没有这个问题,可能基本上是他们意识到,规格变了,手机适配起来了。
所以,现在对策是联系遥控器厂,说明此情况,请他们改正。

4. 定向广播和privacy mode其他想说的

  1. 蓝牙4.0/4.1也是有Privacy Mode的,但是这个只定义在Host,而Device里是没有的。蓝牙4.1的Privacy Mode叫做1.1版本。蓝牙4.2新增的Device Privacy Mode叫做1.2版本。
  2. 蓝牙4.2以上的Device Privacy Mode中,定向广播数据中,AdvA是可以用Identity Address的。但能使用RPA,还是建议用RPA。
  3. 再强调下,蓝牙4.2以上的Device Privacy Mode中,定向广播数据中,TargetA必须使用RPA。原因如图1所示。
  4. 关闭安卓本地Device Privacy Mode(即文章开头的对策),定向广播仍然是可以工作的。
  5. 假如不关闭安卓本地Device Privacy Mode,而遥控器使用非定向广播,那即使继续用公有地址,也是没有问题的(最终遥控器对策)。
  6. 中心设备中, 打开Device Privacy Mode情况下, device是可以解析Identity地址和RPA地址. 只是在Directed Advertising中, device无法解析Identity地址.
  7. 安卓中, 只有打开BLE_LOCAL_PRIVACY_ENABLED情况下, 才会设置私有地址. 可以以这个来区分代码是否打开了这个宏定义. 具体代码在:btm_gen_resolvable_private_addr(base::Bind(&btm_gen_resolve_paddr_low));
  8. 安卓代码的实际上不支持BLE 4.0/4.1 privacy mode. 原本代码打算基于静态的random address做的, 实际没实现, 见BTM_BleConfigPrivacy.
  9. BLE 4.2以上privacy mode实际分为两种, 一种是Device Privacy Mode, 另外一种是network privacy mode. 前一种支持Identy Addr和私有地址. 而后一种只支持RPA地址. 协议上说后一种其实是默认的. 但是google的实现只支持前一种.
    10.RPA地址, 传统是Host周期生成的. Privacy Mode base on Host时, 也是Host周期产生. 但是Privacy Mode base on Controler时, 控制器可以自己产生(还待进一步考证… 搜索resolvable private adddress).

5. 鼠标厂怎么做的

  1. 鼠标厂看了几个,即使他们宣称支持4.2,5.0或者5.1,无论他们使用Nordical芯片,还是国产小博通芯片,Feature特性都是不支持Device Privacy Mode的,并且只支持特性中的LE Encryption。其他你能想到的,都没有的(实际上也确实不需要,徒增成本)。

  2. 所以,鼠标厂的做法,其实就是面对蓝牙4.2以上系统时,使用上面的(5)所说明; 面对蓝牙4.1芯片时,google只支持公有地址. 使用Identity蓝牙地址+定向或非定向广播都可以。

  3. 定向广播时,鼠标厂广播使用的TargetA地址,和CONNECT_IND指示的intiator地址应该是一样的。

6. 关于定向广播TargetA地址蓝牙芯片厂的说明

  1. Nordical
    http://www.wowotech.net/bluetooth/ble_address_type.html#comment-6910
    这里是网友“虎妞”的说明,我没Nordical的SDK,所以不知道是不是真的,大家如果有,发我一份。
    在这里插入图片描述

  2. Dialog
    https://www.dialog-semiconductor.com/forums/post/dialog-smartbond-bluetooth-low-energy-%E2%80%93-software/directed-advertise
    在这里插入图片描述

如果以上真的代表两个大厂官方立场,他们想要说的应该只是蓝牙4.0/4.1的情况。N厂说只能用静态随机地址,D厂说只能用公有地址, 都不完整, 实际上应该是Identy address, 而Identy addr包括Public addrss和static random address。可能是他们的实现只支持他们说的那样
不过, 使用静态随机地址时, 一定要follow N厂的说法. 即使开关机, 你的静态随机地址也不要改变. 不然, 肯定无法回连了.

总的来说, 4.0/4.1定向回连还是只支持白名单蓝牙地址, 只能是公有地址和不会变化的静态随机地址. 如上第二节第1个原因所述。但google的蓝牙协议栈, 也只支持公有地址.

4.2及以上, 定向回连只支持RPA地址, 不支持Identy address.

大家如有不同意见,欢迎拍砖。

这篇关于BLE 定向广播和privacy mode的纠缠的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504271

相关文章

理解分类器(linear)为什么可以做语义方向的指导?(解纠缠)

Attribute Manipulation(属性编辑)、disentanglement(解纠缠)常用的两种做法:线性探针和PCA_disentanglement和alignment-CSDN博客 在解纠缠的过程中,有一种非常简单的方法来引导G向某个方向进行生成,然后我们通过向不同的方向进行行走,那么就会得到这个属性上的图像。那么你利用多个方向进行生成,便得到了各种方向的图像,每个方向对应了很多

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

android面试:如何理解 Android 中的广播?

在 Android 中,广播是一种用于在应用程序之间传递消息的机制。它允许应用程序发送和接收全局消息,通常用于通知其他应用或组件某些事件的发生。广播可以是系统广播(由系统发送)或自定义广播(由应用程序发送)。 广播的主要特点: 异步通信:广播是一种异步的通信方式,发送广播的应用不需要等待接收应用的响应。 全局可见:广播可以被系统中的任何应用程序接收,适合用于跨应用的消息传递。 轻量级:广播

Anroid BLE蓝牙(手机分别作为中心设备和外围设备)

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙。  BLE蓝牙模块主要应用领域     1、移动扩展设备     2、汽车电子设备     3、健康医疗用品:心跳带、血压计等     4、定位应用:室内定位、井下定位等     5、近距离数据采集:无线

BLE 数据传输的一些名词

 1、 Profile Profile 可以理解为一种规范,一个标准的通信协议,Profile 存在于从机中。蓝牙组织规定了一些列的标准 Profile, 例如 HID OVER GATT、 防丢器、 心率计等。 每个 Profile 中会包含多个 Service,每个 Service 代表从机的一种能力。 2、 Service Service 可以理解为一个服务,在 ble 从机中,通

两个 BLE实现数据传输

 通过TI BLE 1.3.2 协议栈安装后的主从通信实验,实现两个 BLE节点的通信,主机向 BLE 从机发送一个字节,然后再把写入的字节读回来,以测试主从之间的通信。 SimpleBLECentral 主机编程: 在 Bluetooth-LE 低功耗蓝牙中有四种设备类型:Central 主机、Peripheral 从机、Observer 观察者、Broadcaster 广播者。通

BLE协议栈安装和目录简介

首先在TI官网上下载BLE协议栈。  目前最新的协议栈版本已经升级到1.4.0, 并且此协议栈版本配套的 IAR 软件版本为 8.20.2。安装方法很简单,建议安装在C盘上,安装好后,你会在c盘上发现有Texas Instruments目录。 下面看看Texas Instruments下都有什么文件。 \Accessories\Drivers 里 面 存 放 的 是 烧 写 了

BLE协议栈简介

         协议定义的是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据收发;协议栈是协议的具体实现形式,通俗的理解就是用代码实现的函数库,以便于开发人 员调用。        BLE 协议栈将各个层定义的协议都集合在一起,以函数库的形式实现,并给用户提供 一些应用层 API,供用户调用。 使用 BLE 协议栈进行开发的基本思路可以概括为如下三点:        用户

Android 接收系统广播,开机启动Service,SMS,Battery

本文内容摘自《疯狂Android讲义 第3版》李刚 著 自动开启的Service: package shortcut.song.com.myapplication;import android.app.Service;import android.content.Intent;import android.os.Binder;import android.os.IBinder;im

Android Ordered Broadcast 有序广播

代码设置IntentFilter: IntentFilter intentFilter = new IntentFilter();intentFilter.setPriority(15);intentFilter.addAction("shortcut.song.com.myapplication.MY_BROADCAST");intentFilter.addCategory