1

我在 Android 上实现了 GATT 服务器和客户端应用程序。连接正常,我通过将 PERMISSION_READ/WRITE_ENCRYPTED_MITM 添加到所有 GattCharacteristics 来强制配对。

但是不同客户端的配对行为不同:

1) Pin 显示在客户端/中央(Samsung Galaxy S3 上的 Android 5)上,应插入服务器/外围设备(Nexus 5 上的 Android 7)。

2) 密钥显示在客户端/中央设备(Samsung Galaxy S3 上的 Android 5)和服务器/外围设备(Nexus 7 上的 Android 6)上

3) 与 Windows 或 iOS 配对失败,服务器/外围设备需要输入引脚。

我期望并希望发生的是:

引脚显示在服务器/外围设备上,必须插入客户端/中央

有没有办法配置这种行为?

提前致谢!

编辑

这是我的设置:

BluetoothGattService gattService = new BluetoothGattService(
    serviceUUID, BluetoothGattService.SERVICE_TYPE_PRIMARY);
gattService.addCharacteristic(new BluetoothGattCharacteristic(
    charReadUUID,
    BluetoothGattCharacteristic.PROPERTY_READ,
    BluetoothGattCharacteristic.PERMISSION_READ_ENCRYPTED_MITM
));
gattService.addCharacteristic(new BluetoothGattCharacteristic(
    charWriteUUID,
    BluetoothGattCharacteristic.PROPERTY_WRITE,
    BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED_MITM
));
gattServer.addService(gattService);

...

AdvertiseSettings settings = new AdvertiseSettings.Builder()
    .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
    .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
    .setConnectable(true)
    .build();

AdvertiseData data = new AdvertiseData.Builder()
    .setIncludeTxPowerLevel(false)
    .addServiceUuid(serviceUUID)
    .build();

BluetoothLeAdvertiser advertiser = adaper.getBluetoothLeAdvertiser()
advertiser.startAdvertising(settings, data, callback);
4

1 回答 1

4

摘要:将客户端的 I/O 功能设置为“仅键盘”。

解释:

我不完全确定您系统的“幕后”会发生什么。但我可以告诉你根据 BLE CoreSpec 应该发生什么。首先参见 CoreSpec V4.2,Vol。3,H 部分,第一章。2.3.5.1,表 2.7 和 2.8。根据身份验证要求和设备的 I/O 功能,定义了使用哪种配对。

您想要的被描述为“密码输入:响应者显示,发起者输入”。如果使用传统配对(根据蓝牙 V4.0 配对),并且如果:

  • 服务器(响应者)有一个显示器和
  • 客户端(发起者)有一个键盘和
  • 服务器和客户端都没有显示器和键盘。

(如果不使用 OOB 数据并且强制执行 MITM,但我假设这是给定的。)请注意,如果客户端和服务器都有显示器和键盘,则默认情况是客户端显示和服务器输入。看起来如果你的协议自动处理配对,它也会自动选择 CoreSpec 中定义的配对方法。

所以你看到的是对应不同服务器的不同I/O能力。您的客户端似乎有显示器和键盘,因此如果您使用带有显示器和键盘的服务器,客户端将显示密码,响应者将等待输入(适合您的情况 1)。对于案例 2,我们有数值比较;这只有在客户端和服务器都支持 LE 安全连接(根据蓝牙 V4.2 配对)时才有可能。

对于案例 3,我不知道发生了什么,但可能是 Android 系统和 iOS 系统之间不能很好地一起运行的问题(但我不知道为什么)。

由于这里的配对似乎是完全自动化的,唯一的改变就是改变 I/O 能力。应该有一个功能可以更改这些功能,请查看您的手册。如果您不想在客户端上使用显示器,请将其 I/O 功能设置为“仅限键盘”,它将显示您期望的行为。(*)

(*) 这仅在您使用旧版配对时成立。如果两个设备都支持 LE 安全连接,建议您使用这个较新的配对协议,因为它消除了旧协议的安全问题。(但我会假设在这种情况下,无论如何都会自动使用较新的协议。)

于 2017-03-09T13:01:32.263 回答