应该与蓝牙LE设备建立联系

时间:2017-03-17 16:24:53

标签: android xamarin bluetooth bluetooth-lowenergy

对于使用Xamarin(Android API 21及更高版本)的蓝牙项目,我想知道是否通常与蓝牙设备建立联系。目前的要求是:

  • 蓝牙设备经常使用,但不是连续使用。
  • 重新连接应该尽快发生
  • 蓝牙地址在设备断电时随机变化
  • 设备名称未知,空或随机
  • 连接已加密
  • 该连接使用覆盖API,该API需要蓝牙设备作为连接参数。

是否应该与此设备建立绑定以“更好”识别(作为某种缓存)或“从头开始”重新连接到设备。 在这种情况下常见的是什么?所以这不是“我可以保持联系”的问题,而是必须保持联系,甚至更好:什么是一个协调,有效,可靠的场景。

目前我使用这样的代码(result.Device.Name用于开发目的):

  public override void OnScanResult([GeneratedEnum] ScanCallbackType callbackType, ScanResult result)
    {

        if (result.Device.Name == "��" &&

            !_discovered &&
          result.ScanRecord != null &&
          result.ScanRecord.ServiceUuids != null &&
          result.ScanRecord.ServiceUuids.Any(x => x.Uuid.ToString().ToUpper() == uuid))
        {
            lock (_locker)
            {
                _discovered = true;
                _deviceList.Add(result.Device);
                BluetoothDiscoverySucces?.Invoke(result.Device);
            }
        }
    }

1 个答案:

答案 0 :(得分:16)

简短回答:正确,普通和可靠的情况是结合。绑定意味着连接是安全的,链接是可信的。这意味着您的本地设备通常会找到远程设备,即使其地址正在发生变化。出于安全和隐私原因,建议在蓝牙中进行配对/绑定。

答案很长:自推出以来,蓝牙规范的增量版本增加了一些功能,以提高蓝牙设备的安全性和隐私性。除非您已配对/绑定,否则许多设备将不允许您交换数据或正确跟踪它们(绑定和配对之间的区别在于绑定,交换的密钥存储在数据库中。)

在低功耗蓝牙中,配对/绑定过程包括三个阶段: -

第1阶段 - 配对功能交换

两个连接的设备交换其IO功能(例如,设备是否具有键盘),身份验证要求(例如,绑定或不绑定)和支持的密钥大小。

第2阶段 - 身份验证和加密

使用加密算法生成一个密钥并用于加密链接(这与传统和LESC配对不同,但它超出了本问题的范围。)

阶段3 - 密钥分发

设备之间交换了几个密钥,包括CSRK(连接签名解析密钥),IRK(身份解析密钥)和静态地址。

对你的问题特别重要的是IRK和地址。自蓝牙v4.0起,称为LE Privacy的功能允许设备不断更改其地址以降低其跟踪能力。恶意设备无法跟踪实现此功能的设备,因为它实际上看起来像是一系列不同的设备。 为了解析地址,设备需要先配对/绑定。如果远程设备包含IRK,则可以使用该设备和随机可解析地址来获取蓝牙设备的原始地址。

所以,超越你的标准: -

  • 蓝牙设备经常使用,但不是连续使用。

如果您要经常断开/重新连接,您可以与设备配对并存储密钥(即绑定)。之后不再需要配对,因为在断开连接/重新连接时将使用相同的密钥来加密连接。

  • 重新连接应该尽快发生

连接和绑定是两回事。无论是否实施绑定,重新连接都需要相同的时间。但是,一旦重新连接设备,重新加密连接将需要一些时间。

  • 蓝牙地址在设备断电时随机变化

这意味着该设备正在使用LE隐私功能。因此,您的设备应与其绑定,以便解析私有的可解析地址。

  • 设备名称未知,空或随机

这通常是BLE的情况。这些设备通常可通过其地址识别。因此,如果您的设备之前已经绑定,您将能够解析更改的地址并识别远程设备。

  • 连接已加密

如果没有先配对,您就无法实现加密连接(按照上述3个阶段)。通过绑定,您可以将密钥存储在数据库中,从而确保将来可以使用它们来重新加密连接,而无需经过配对阶段。

  • 该连接使用需要蓝牙设备的上层API 作为连接参数。

我不确定这意味着什么,但与粘接的要求无关。

有关此主题的进一步阅读,建议您访问蓝牙规范版本5.0,第3卷,第H部分,第2部分安全管理器(第2295页)