蓝牙ble tips3-MAC地址

和计算机网络IP地址类似,BLE也会有属于自己的一个地址

BLE设备地址

蓝牙地址,也称作 Bluetooth MAC (Media Access Control) 地址,是一个48位的唯一硬件标识符,用于在蓝牙设备之间建立连接和通信。它由全球唯一的组织,即 IEEE(Institute of Electrical and Electronics Engineers)负责管理分配。

蓝牙地址通常表示为 12 个十六进制数(例如:00:11:22:33:44:55),其中前6个数字代表蓝牙适配器的厂商 ID,后6个数字是该适配器的独特序列号。蓝牙地址不同于 IP 地址,它们只在网络层次结构上唯一标识设备,而蓝牙地址则更加接近于物理层面上的设备地址。

需要注意的是,在蓝牙通讯过程中,设备不是直接使用蓝牙地址相互通信,而是通过蓝牙协议栈上的 L2CAP(Logical Link Control and Adaption Protocol)层进行通信,L2CAP 层使用其自己的 Channel ID 和 Connection Handle 来标识正在交换数据的蓝牙设备。

公共设备地址

公共设备地址由电气和电子工程师学会(IEEE)分配。

随机设备地址

随机设备地址是随机分配的,但其值必须满足《蓝牙核心规范》中规定的规则。有三个子类型的随机设备地址,即静态地址私有可解决地址私有不可解决地址。 随机设备地址的子类型可以通过检查其地址的两个最高有效位来确定。

0b00:不可解析的私有地址 (Non-resolvable private address)

不可解析的私有地址是随机生成的,并且通常在每次重新连接时更改。它可以用于提供隐私保护,但无需处理可解析的私有地址以检查是否包含在过滤器接受列表中等成本。请参见7.5.3过滤器接受列表。 例如:2C:C1:EE:7B:71:96是一个不可解析的私有地址。通过将最高位字节值(0x2C)转换为二进制,可得到0b00101100。最高的两位bit位的值为0b00,这表明它是一个不可解析的私有地址,根据7.5.2随机设备地址中的表格。

0b01:可解析的私有地址 (Resolvable private address)

RPA(可解析私有地址)是周期性变化的。蓝牙核心规范建议间隔大约15分钟,但最终控制RPA更改的时间是一个实现决策。

示例4C:C1:EE:7B:71:96为可解析的私网地址。这可以通过将最高字节值(0x4C)转换为二进制来验证,得到0b01001100。根据随机设备地址表,最高两位的值为0b01,表示这是一个可解析的私有地址。

生成RPA的过程涉及一个称为身份解析密钥(IRK)的安全密钥,该密钥在绑定设备和应用哈希函数时在设备之间交换。绑定的对等设备可以对接收到的数据包中的每个IRK值应用相同的哈希函数来解析RPA,每次一个。当进程与接收到的RPA匹配时,对等端就知道它已经解析了远程设备的地址和真实身份。未与发送设备绑定的设备无法解析RPA。

示例5A:C1:EE:7B:71:96为可解析私网地址。可以通过转换最高有效字节值(0x5A)转换为二进制,得到0b010111010。最高两位值为0b01,表示这是一个可解析的私有地址,

0b11:静态设备地址(Static device address)

静态设备地址是随机生成的,但并没有以任何方式加密,以保护设备的隐私。使用静态地址的设备允许在每次重启时重新生成地址,但不需要这样做。它不允许在其他任何时候更改其地址。

例如:CC:C1:EE:7B:71:96是一个静态地址。通过将最高位字节值(0xCC)转换为二进制,可得到0b11001100。最高的两位bit位的值为0b11,这表明它是一个静态设备地址。

0b10:保留以备将来使用 (Reserved for future use)

过滤接受列表

蓝牙链路层具有一种称为“过滤器接受列表”的功能。此列表可以填充主机感兴趣的设备地址以接收数据包。在蓝牙核心规范中定义了一系列不同的过滤器策略,描述了如何处理设备地址在此列表中的存在或不存在。

过滤器接受列表的一个好处是,它允许控制器有效地选择需要传递到主机上的数据包,并丢弃不需要的数据包。

可解析私有地址可以添加到过滤器接受列表中,但由控制器处理会产生一定成本。由于可解析的私有地址会定期更改,因此必要时在过滤器接受列表中存储已解析的地址,并且为了检查列表中是否存在可解析的私有地址,控制器必须首先解析接收到的可解析私有地址。

更加详细的干货可以访问这个地址,大佬讲的更好:http://www.wowotech.net/bluetooth/ble_address_type.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android系统中,获取蓝牙MAC地址有多种方法,其中最常见的方法是使用BluetoothAdapter类中的getAddress()方法。该方法返回一个String类型的字符串,表示设备的蓝牙MAC地址。 使用该方法需要先获取BluetoothAdapter实例,可以通过调用getDefaultAdapter()静态方法来获得,如下所示: BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 接着,使用getAddress()方法获取设备的蓝牙MAC地址: String bluetoothMacAddress = bluetoothAdapter.getAddress(); 获得蓝牙MAC地址后,可以根据需要进行后续操作,例如在蓝牙设备发现和连接时使用。 需要注意的是,在一些设备上,蓝牙MAC地址可能无法获取或者该方法返回一个固定的值,这是由于硬件或者系统限制所导致的。因此,在应用程序中获取蓝牙MAC地址时需要谨慎,特别是对于涉及到隐私的应用场景。 ### 回答2: Android获取蓝牙MAC地址的方案: 1.使用BluetoothAdapter类获取MAC地址 首先,使用getSystemService方法获取BluetoothAdapter对象: BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); 然后,使用getAddress方法得到MAC地址: String macAddress = bluetoothAdapter.getAddress(); 注意:这种方法只能在蓝牙处于开启状态时才能获取到MAC地址。 2.使用BluetoothDevice类获取MAC地址 如果想获取已经配对的蓝牙设备的MAC地址,可以使用BluetoothDevice类。 首先,使用getBondedDevices方法获取已配对的蓝牙设备集合: Set<BluetoothDevice> bondedDevices = bluetoothAdapter.getBondedDevices(); 然后,遍历集合,使用getAddress方法获取MAC地址: for (BluetoothDevice device : bondedDevices) { String macAddress = device.getAddress(); } 注意:这种方法只能获取到已经配对的蓝牙设备的MAC地址。 3.使用反射获取MAC地址 如果以上两种方式都无法获取到MAC地址,可以尝试使用反射的方式获取。 首先,获取BluetoothAdapter的Class对象: Class<?> bluetoothAdapterClass = BluetoothAdapter.class; 然后,使用getMethod方法获取getAddress方法: Method getAddressMethod = bluetoothAdapterClass.getMethod("getAddress"); 接下来,使用invoke方法执行方法: String macAddress = (String) getAddressMethod.invoke(bluetoothAdapter); 注意:使用反射可能存在风险,因为某些手机厂商可能会修改了BluetoothAdapter类的实现。 总之,以上三种方法都可以用于获取蓝牙MAC地址,具体应该根据实际情况选择使用哪种方式。 ### 回答3: Android获取蓝牙MAC地址,可以通过BluetoothAdapter的方法来进行操作。步骤如下: 1. 获取BluetoothAdapter对象 首先需要获取BluetoothAdapter对象,可以使用以下代码: ``` BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ``` 2. 获取设备的蓝牙MAC地址 获取到BluetoothAdapter对象后,可以使用getAddress()方法获取设备的蓝牙MAC地址: ``` String bluetoothAddress = bluetoothAdapter.getAddress(); ``` 值得注意的是,getAddress()方法获取到的是设备的本地蓝牙MAC地址,而不是连接到该设备的蓝牙设备的MAC地址。 3. 权限声明 在进行蓝牙操作时,需要在AndroidManifest.xml中声明相应的权限,否则无法进行蓝牙相关操作。以下是需要声明的权限: ``` <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` 以上是获取蓝牙MAC地址的基本步骤,需要注意:在Android 6.0系统及以上版本中,Android强制要求应用程序在运行时动态申请权限。因此,需要在代码中加入动态权限申请的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值