【BLE】蓝牙设备地址

1. 前言

为什么有些蓝牙设备的地址是固定的,但是有些每次开机起来是不一样的,又有些设备地址在正常运行过程中会变化呢。

蓝牙设备通过地址和地址类型来标识自己,地址类型指示是public device address(公共地址)或者random device address(随机地址),两种设备地址都是48bit的。

一个设备至少包含一种地址类型,可以同时包含两种。

当两个设备地址进行比较时,该比较应包括设备地址类型(如果两个地址类型不同,即使两个48bit未地址相同也不同)。

2. Public device address

设备唯一地址,不会变化。正常情况下,该地址是需要向IEEE申请的。企业交钱,IEEE保证地址的唯一性。

3. Random device address

在BLE时代,只有Public Device Address还不够,因为:

  1. 需要购买
  2. 安全因素。BLE很大一部分的应用是广播通信,这意味着主要知道了设备的地址,就可以获取所以的信息,这是不安全的。

随机地址可以细分为三种地址类型,通过48bit地址的最高2位决定。

Address[47:46]Sub-Type
0b00Non-resolvable private address
0b01Resolvable private address
0b10Reserved for future use
0b11Static device address

3.1 Static device address

Static device address 是随机生成的,需满足以下两个条件:

  1. 最高两位为1
  2. 不能全为0或1
    在这里插入图片描述
    如果使用的是静态随机地址,则每次开机的时候地址随机生成后不会再改变。下一次上电的时候可以改变,但不是强制的,因此可以保持变。

如果设备的静态地址发生变化,则存储在对端设备的配对信息将无效,并且使用旧地址重连会失败。

3.2 Non-resolvable private address

Non-resolvable private address 是随机生成的,需满足以下三个条件:

  1. 最高两位为0
  2. 不能全为0或1
  3. 不能和 Public device address 相同
    在这里插入图片描述

3.3 Resolvable private address

不可解析私密地址需满足以下条件:

  1. 高24bit为随机数,且最高 2bits 为 “10”
  2. 低 24bits 是随机数和 IRK 通过 hash 运算得到 hash 值,hash=ah(IRK,prand)
    在这里插入图片描述
    对端BLE设备扫描到该类型地址后,用本地 IRK 和该地址的 prand 进行 ah 运算,如果得到值和该类型地址低 24bits 一致才进行后续操作。

4. 总结

蓝牙设备地址可分为4种:

  1. Public device address
  2. Static device address
  3. Non-resolvable private address
  4. Resolvable private address

Public device address 是唯一不变的,相当于是设备的MAC地址。

Static device address在初始化后不会改变。

Static Device Address通过地址随机生成的方式,解决了部分问题,Private Device Address则更进一步,通过定时更新和地址加密两种方法,提高蓝牙地址的可靠性和安全性。

Non-resolvable private address 和 Resolvable private address在系统运行中可以指定周期更新(广播、扫描、已连接等过程中都有可能更新),更新的周期由GAP规定,称作T_GAP(private_addr_int),建议值是15分钟,不能大于1小时。

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要在安卓中获取BLE蓝牙设备,你需要使用Android提供的BluetoothLeScanner类和BluetoothAdapter类。下面是获取BLE设备的基本步骤: 1. 检查设备是否支持BLE蓝牙 在你的应用程序中,你需要检查设备是否支持BLE蓝牙。你可以使用BluetoothManager类和BluetoothAdapter类来完成此操作。你可以使用以下代码检查设备是否支持BLE: ``` // 初始化BluetoothManager BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); // 获取BluetoothAdapter BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter(); // 检查设备是否支持BLE蓝牙 if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, "设备不支持BLE蓝牙", Toast.LENGTH_SHORT).show(); finish(); } ``` 2. 开启蓝牙 在你的应用程序中,你需要确保蓝牙已经开启并且可以被发现。你可以使用以下代码开启蓝牙: ``` // 检查蓝牙是否已经开启,如果没有开启,则开启蓝牙 if (!bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } // 延长蓝牙可见性时间 Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent); ``` 3. 扫描BLE设备 使用BluetoothLeScanner类扫描BLE设备。你可以使用以下代码扫描BLE设备: ``` // 初始化BluetoothLeScanner BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner(); // 设置扫描回调接口 ScanCallback scanCallback = new ScanCallback() { @Override public void onScanResult(int callbackType, ScanResult result) { BluetoothDevice device = result.getDevice(); // 处理扫描到的设备 } @Override public void onScanFailed(int errorCode) { // 处理扫描失败事件 } }; // 开始扫描BLE设备 ScanFilter scanFilter = new ScanFilter.Builder() .setServiceUuid(ParcelUuid.fromString(YOUR_SERVICE_UUID)) .build(); ScanSettings scanSettings = new ScanSettings.Builder() .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY) .build(); bluetoothLeScanner.startScan(Arrays.asList(scanFilter), scanSettings, scanCallback); ``` 以上是获取BLE设备的基本步骤。在实际开发中,你需要根据实际情况对代码进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

强人电子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值