对于使用Xamarin(Android API 21及更高版本)的蓝牙项目,我想知道是否通常与蓝牙设备建立联系。目前的要求是:
是否应该与此设备建立绑定以“更好”识别(作为某种缓存)或“从头开始”重新连接到设备。 在这种情况下常见的是什么?所以这不是“我可以保持联系”的问题,而是必须保持联系,甚至更好:什么是一个协调,有效,可靠的场景。
目前我使用这样的代码(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);
}
}
}
答案 0 :(得分:16)
简短回答:正确,普通和可靠的情况是结合。绑定意味着连接是安全的,链接是可信的。这意味着您的本地设备通常会找到远程设备,即使其地址正在发生变化。出于安全和隐私原因,建议在蓝牙中进行配对/绑定。
答案很长:自推出以来,蓝牙规范的增量版本增加了一些功能,以提高蓝牙设备的安全性和隐私性。除非您已配对/绑定,否则许多设备将不允许您交换数据或正确跟踪它们(绑定和配对之间的区别在于绑定,交换的密钥存储在数据库中。)
在低功耗蓝牙中,配对/绑定过程包括三个阶段: -
第1阶段 - 配对功能交换
两个连接的设备交换其IO功能(例如,设备是否具有键盘),身份验证要求(例如,绑定或不绑定)和支持的密钥大小。
第2阶段 - 身份验证和加密
使用加密算法生成一个密钥并用于加密链接(这与传统和LESC配对不同,但它超出了本问题的范围。)
阶段3 - 密钥分发
设备之间交换了几个密钥,包括CSRK(连接签名解析密钥),IRK(身份解析密钥)和静态地址。
对你的问题特别重要的是IRK和地址。自蓝牙v4.0起,称为LE Privacy的功能允许设备不断更改其地址以降低其跟踪能力。恶意设备无法跟踪实现此功能的设备,因为它实际上看起来像是一系列不同的设备。 为了解析地址,设备需要先配对/绑定。如果远程设备包含IRK,则可以使用该设备和随机可解析地址来获取蓝牙设备的原始地址。
所以,超越你的标准: -
如果您要经常断开/重新连接,您可以与设备配对并存储密钥(即绑定)。之后不再需要配对,因为在断开连接/重新连接时将使用相同的密钥来加密连接。
连接和绑定是两回事。无论是否实施绑定,重新连接都需要相同的时间。但是,一旦重新连接设备,重新加密连接将需要一些时间。
这意味着该设备正在使用LE隐私功能。因此,您的设备应与其绑定,以便解析私有的可解析地址。
这通常是BLE的情况。这些设备通常可通过其地址识别。因此,如果您的设备之前已经绑定,您将能够解析更改的地址并识别远程设备。
如果没有先配对,您就无法实现加密连接(按照上述3个阶段)。通过绑定,您可以将密钥存储在数据库中,从而确保将来可以使用它们来重新加密连接,而无需经过配对阶段。
我不确定这意味着什么,但与粘接的要求无关。
有关此主题的进一步阅读,建议您访问蓝牙规范版本5.0,第3卷,第H部分,第2部分安全管理器(第2295页)