我参与了一个Android APP,它与我们公司的Bt芯片进行BLE连接和配对。 APP作为BLE核心角色,而Bt芯片则作为BLE外设角色。
当APP在Android 4.4或5.0智能手机上运行时,BLE连接和配对效果很好。当APP在Android 5.1或最新版本6.0上运行时,BLE配对由错误代码(错误代码:13)终止,而BLE连接成功。这是空气日志:
4,148 0x50654c1d 0x0000 1 LL_VERSION_IND 24 2015/12/3 14:13:39.600368
4,160 0x50654c1d 0x0001 2 LL_VERSION_IND 24 00:00:00.048473 2015/12/3 14:13:39.648841
4,163 0x50654c1d 0x0002 1 LL_FEATURE_REQ 27 00:00:00.048522 2015/12/3 14:13:39.697363
4,169 0x50654c1d 0x0003 2 LL_FEATURE_RSP 27 00:00:00.049066 2015/12/3 14:13:39.746429
4,179 0x50654c1d 0x0004 1 LL_CONNECTION_UPDATE_REQ 0x000a 30 00:00:00.048436 2015/12/3 14:13:39.794865
4,234 0x50654c1d 0x000b 1 LL_ENC_REQ 41 00:00:00.303755 2015/12/3 14:13:40.098620
4,237 0x50654c1d 0x000c 2 LL_ENC_RSP 31 00:00:00.007727 2015/12/3 14:13:40.106347
4,244 0x50654c1d 0x000d 2 LL_START_ENC_REQ 19 00:00:00.007500 2015/12/3 14:13:40.113847
4,245 0x50654c1d 0x000e M LL_START_ENC_RSP 23 00:00:00.007273 2015/12/3 14:13:40.121120
4,248 0x50654c1d 0x000f S LL_START_ENC_RSP 23 00:00:00.007726 2015/12/3 14:13:40.128846
4,392 0x50654c1d 0x004a M LL_CONNECTION_UPDATE_REQ 0x0050 34 00:00:00.442275 2015/12/3 14:13:40.571121
4,794 0x50654c1d 0x008c M LL_CHANNEL_MAP_REQ 0x0093 30 00:00:03.002545 2015/12/3 14:13:43.573666
7,168 0x50654c1d 0x0131 M LL_CHANNEL_MAP_REQ 0x0138 30 00:00:08.043797 2015/12/3 14:13:51.617463
10,065 0x50654c1d 0x0261 M LL_CHANNEL_MAP_REQ 0x0268 30 00:00:14.820121 2015/12/3 14:14:06.437584
10,449 0x50654c1d 0x029d M LL_TERMINATE_IND 24 00:00:02.925044 2015/12/3 14:14:09.362628
我的Bt主机程序(基于Bt芯片)收到CONNECTION_PARAMETER_UPDATE_COMP_IND
事件,然后收到LE_DEVICE_DISCONNECT_COMP_IND
事件。我想断开BLE
的操作是由Android Bt堆栈完成的。
在Android 4.4或5.0中,没有收到CONNECTION_PARAMETER_UPDATE_COMP_IND
个事件,那么问题是什么,我怎样才能在Android 5.1或6.0上成功配置BLE。任何帮助将不胜感激。
答案 0 :(得分:2)
对于蓝牙低功耗设备的查找和配对,支持两种方式
kitkat版及以下
startLeScan()
此方法将 BluetoothAdapter.LeScanCallback 作为参数
棒棒糖版及以上
mBluetoothLeScanner = mBluetoothAdapter.getBluetoothLeScanner();
mBluetoothLeScanner.startScan(filters, settings, mScanCallback);
您需要将回调定义为获取响应的流程
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
}
@Override
public void onScanFailed(int errorCode) {
}
};
答案 1 :(得分:0)
感谢您的回复。我尝试使用startScan方法而不是startLeScan,但问题仍然存在。以下是代码的一部分:
mBluetoothScanner = mBluetoothAdapter.getBluetoothLeScanner();
mBluetoothScanner.startScan(mScanCallback);
private ScanCallback mScanCallback = new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
final byte[] scanRecord = result.getScanRecord().getBytes();
final int rssi = result.getRssi();
final BluetoothDevice device = result.getDevice();
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//Application analyzes data in received packet.
AdvertisingData adData = new AdvertisingData(scanRecord);
byte[] adManufacturerData = adData.getAdManufacturerData();
if (adManufacturerData.length < 2) {return;}
byte[] carBrand = Arrays.copyOf(adManufacturerData, adManufacturerData.length - 2);
byte[] carModel = Arrays.copyOfRange(adManufacturerData, adManufacturerData.length - 2, adManufacturerData.length);
if (!Arrays.equals(carBrand, mManufacturerData)) {return;}
mScanningFrame.setRssiInfo(rssi);
if (rssi >= mRssi) {
mConnectingFrame.setCarImage(carModel);
mConnectedFrame.setCarImage(carModel);
mDisconnectedFrame.setCarImage(carModel);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
showFrame(mConnectingFrame);
mBleDevice = device;
mBluetoothGatt = mBleDevice.connectGatt(getApplicationContext(), false, mGattCallback);
mBluetoothAdapter.stopLeScan(mLeScanCallback);
}
}
});
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
}
@Override
public void onScanFailed(int errorCode) {
}
};
还有其他方法可以解决这个问题,或者我错过了什么?谢谢
答案 2 :(得分:0)
如果您已经有了一个搜索设备的arrayList(ArrayList<Bluetoothdevice> scannedDevice
),则可以选择其中之一并创建绑定。
scannedDevice.get(position).createBond();