GATT之前, createRfcommSocketToServiceRecord, createInsecureRfcommSocketToServiceRecordAndroid的,怎樣才能讓BLE裝置配對設備(保稅)
方法可以使配對設備,
但關貿總協定只沒有關於配對設備選項, 使用BluetoothDevice.connectGatt(...)
如果已經連接,我想配對設備。
thx。
GATT之前, createRfcommSocketToServiceRecord, createInsecureRfcommSocketToServiceRecordAndroid的,怎樣才能讓BLE裝置配對設備(保稅)
方法可以使配對設備,
但關貿總協定只沒有關於配對設備選項, 使用BluetoothDevice.connectGatt(...)
如果已經連接,我想配對設備。
thx。
據我所知,以啓動BLE配對過程有兩種方式:
1)從19 API和高達你可以通過調用mBluetoothDevice.createBond()
開始配對。您無需連接遠程BLE設備即可開始配對過程。
2)當試圖做蓋特操作,讓我們例如該方法
mBluetoothGatt.readCharacteristic(characteristic)
如果遠程BLE設備需要被結合做任何通信然後回調時
onCharacteristicRead( BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status)
被稱爲其status
參數值將等於GATT_INSUFFICIENT_AUTHENTICATION
或GATT_INSUFFICIENT_ENCRYPTION
,而不等於GATT_SUCCESS
。如果發生這種情況,配對程序將自動開始。
這裏是要找出失敗時一旦onCharacteristicRead
回調函數被調用
@Override
public void onCharacteristicRead(
BluetoothGatt gatt,
BluetoothGattCharacteristic characteristic,
int status)
{
if(BluetoothGatt.GATT_SUCCESS == status)
{
// characteristic was read successful
}
else if(BluetoothGatt.GATT_INSUFFICIENT_AUTHENTICATION == status ||
BluetoothGatt.GATT_INSUFFICIENT_ENCRYPTION == status)
{
/*
* failed to complete the operation because of encryption issues,
* this means we need to bond with the device
*/
/*
* registering Bluetooth BroadcastReceiver to be notified
* for any bonding messages
*/
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
mActivity.registerReceiver(mReceiver, filter);
}
else
{
// operation failed for some other reason
}
}
其他人提的是,該操作將自動啓動配對過程爲例: Android Bluetooth Low Energy Pairing
這是怎麼了接收器可以實現
private final BroadcastReceiver mReceiver = new BroadcastReceiver()
{
@Override
public void onReceive(Context context, Intent intent)
{
final String action = intent.getAction();
if (action.equals(BluetoothDevice.ACTION_BOND_STATE_CHANGED))
{
final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
switch(state){
case BluetoothDevice.BOND_BONDING:
// Bonding...
break;
case BluetoothDevice.BOND_BONDED:
// Bonded...
mActivity.unregisterReceiver(mReceiver);
break;
case BluetoothDevice.BOND_NONE:
// Not bonded...
break;
}
}
}
};
這個答案對我來說幫了大忙!我在使用Android 6.0+進行配對通知時遇到了問題,用戶甚至不會看到這些通知(較舊的Android做了很好的對話,這是我想要的所有情況)。有一件事我做得比你更不同,就是從開始就調用createBond()(即使在連接到設備之前),如果device.getBondState()== BluetoothDevice.BOND_NONE。這是因爲在閱讀特徵時我沒有得到「GATT_INSUFFICIENT_AUTHENTICATION」;操作系統會在它發送通知來配對設備時保留它。 – cclogg
如果我的** onCharacteristicRead()**永遠不會被調用? –
@IgorGanapolsky如果您100%確定您正在調用此方法mBluetoothGatt.readCharacteristic(特性),那麼將調用回調,除非可能存在與遠程設備有關的問題,無論它是代碼相關還是連接丟失(如果這是你應該得到一個不同的回調,但我不記得這個名字)。如果有人知道不同,請告訴我們。 – Kiki