目标设备是基于蓝牙5.0的,并向外以扩展广播的形式向外发送。网上流行的扫描方式我都基本验证过,均未能实现扫描扩展广播
初始化:
BluetoothManager manager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = manager.getAdapter();
mBLEScanner = mBluetoothAdapter.getBluetoothLeScanner();
回调:
private ScanCallback litsenCallback =new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
try {
BluetoothDevice bluetooth_Device = result.getDevice();
int rssi = result.getRssi();
System.out.println(bluetooth_Device);
byte[] scanRecord = result.getScanRecord().getBytes();
System.out.println(bluetooth_Device);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
回调:
private ScanCallback litsenCallback =new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
try {
BluetoothDevice bluetooth_Device = result.getDevice();
int rssi = result.getRssi();
System.out.println(bluetooth_Device);
byte[] scanRecord = result.getScanRecord().getBytes();
System.out.println(bluetooth_Device);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onBatchScanResults(List<ScanResult> results) {
super.onBatchScanResults(results);
}
@Override
public void onScanFailed(int errorCode) {
super.onScanFailed(errorCode);
}
};
扫描参数:
private ScanSettings scanSettings = new ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY ) //lowpower balanced lowlatency opportunistic
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES )
.setPhy(ScanSettings.PHY_LE_ALL_SUPPORTED)
.build();
在某个按键下触发扫描 mBLEScanner.startScan(null,scanSettings,litsenCallback);
这个方法是我经过多次尝试过后,简化过来的。但是并未能扫到周围扩展广播。基于java和kotlin的demo都看过,基本都一样,现在不知道怎么整改了
之前使用的是比较旧的startLeScan,再后来 mBLEScanner.startScan(litsenCallback);在使用startScan后,能偶尔扫描到广播二三十字节的扩展广播,但取得数据内容有丢失,此外超出100字节后依然扫描不到。后来有人提了一句需要设置扫描参数,就是上述的代码贴出部分。
开启蓝牙扫描后,能够实现扫描扩展广播(扩展广播最大能向外广播200多字节)与一般的BLE广播。nordic的nrf connecct安卓APP旧可以,我想扫描效果与改APP一致,如果后续扩展广播通信部分有一些不同,请一并告知,没有的话就不用了
参数好象不对。
你看看你是否满足:
数据部分的第一个字节表示数据的类型 AD Type ,剩下的 Len - 1 个字节是真正的数据 AD data 。其中 AD type 非常关键,决定了 AD Data 的数据代表的是什么和怎么解析。无效数据部分 :因为广播包的长度必须是 31 个 byte,如果有效数据部 分不到 31 自己,剩下的就用 0 补全。这部分的数据是无效的,解释的时候,忽略即可。在 Android 中,系统会把这两个数据拼接在一起,返回一个 62 字节的数组。