首页 文章

Android上的BLE外设配对引脚

提问于
浏览
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配对失败,服务器/外围设备需要输入引脚 .

我期望和想要发生的是:

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

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

提前致谢!

EDIT

这是我的设置:

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);

1 回答

  • 3

    摘要: Set the I/O Capabilites of your client to "Keyboard Only".

    说明:

    我不完全确定你的系统“幕后”会发生什么 . 但是根据BLE CoreSpec,我可以告诉你应该发生什么 . 首先看CoreSpec V4.2,Vol . 3,H部分,第二章 . 2.3.5.1,表2.7和2.8 . 在那里定义了使用哪种配对,具体取决于认证要求和设备的I / O能力 .

    您想要的是“密码输入:响应者显示,启动器输入” . 如果使用传统配对(根据蓝牙V4.0配对),并且如果:

    • 服务器(响应者)有一个显示AND

    • 客户端(发起者)有一个键盘AND

    • 服务器和客户端都没有显示和键盘 .

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

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

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

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

    (*)仅在使用传统配对时才有效 . 如果两个设备都支持LE Secure Connections,则建议您使用此新配对协议,因为它消除了旧协议的安全问题 . (但我会假设在这种情况下,无论如何都会自动使用更新的协议 . )

相关问题