我在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配对失败,服务器/外围设备需要输入引脚。
我期望和想要发生的是:
Pin显示在服务器/外围设备上,必须插入客户端/中央
有没有办法配置这种行为?
提前致谢!
修改
这是我的设置:
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);
答案 0 :(得分:3)
摘要:将客户端的I / O功能设置为"仅限键盘"。
说明:
我不完全确定会发生什么事情"引擎盖下#34;你的系统。但是根据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 Secure Connections(根据蓝牙V4.2进行配对)时,才能实现此目的。
对于案例3,我不知道发生了什么,但是Android系统和iOS系统之间可能存在一个问题,但它们并不能很好地运行(但我不知道为什么)。
由于配对似乎在这里完全自动化,因此改变事物的唯一可能性是改变I / O功能。应该有一个功能来改变这些功能,检查你的手册。如果您不想在客户端上使用显示器,请将其I / O功能设置为"仅限键盘"它会表现出你期望的行为。(*)
(*)仅在您使用传统配对时才有效。如果两个设备都支持LE Secure Connections,则建议您使用此新配对协议,因为它消除了旧协议的安全问题。 (但我会假设在这种情况下,无论如何都会自动使用较新的协议。)