ScanFilter如何基于MAC地址工作?

时间:2016-01-28 21:39:48

标签: android bluetooth bluetooth-lowenergy mac-address

ScanFilter android手册页提到您可以根据远程设备的MAC地址进行过滤 "支持以下字段的当前过滤:远程设备的Mac地址" 即可。 AFAIK,广告中播出的地址是一个私人可解析地址"这是一个定期更改的地址,以避免设备跟踪攻击。那么,ScanFilter如何知道远程设备的mac地址来进行过滤。我已将远程设备的蓝牙mac地址添加为过滤器,如下面的代码段所示,但扫描没有产生任何结果:

List<ScanFilter> listFilter = new ArrayList<>();
ScanFilter scanFilterMac = new ScanFilter.Builder().setDeviceAddress("88:88:88:B0:03:DB").build();
listFilter.add(scanFilterMac);
bluetoothLeScanner.startScan(listFilter, scanSettings, scanCallback);

但是,当我按照以下代码段扫描基于UUID的服务时,过滤有效:

 List<ScanFilter> listFilter = new ArrayList<>();
 ScanFilter scanFilterService = new ScanFilter.Builder().setServiceUuid(SERVICE_ID).build();
 listFilter.add(scanFilterService);
 bluetoothLeScanner.startScan(listFilter, scanSettings, scanCallback);

知道如何根据远程设备MAC地址生成ScanFilter吗?手册页中提到的MAC地址是否与您使用以下代码以编程方式在其他设备上打印的蓝牙MAC地址相同:

 BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
 BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
 Log.i(TAG, "MAC: "+bluetoothAdapter.getAddress());

1 个答案:

答案 0 :(得分:0)

扫描设备时可以获得的地址是不会更改的BT设备的mac地址。在过滤中,您使用格式为12:34:56:78:9A:BC的相同地址。 你的代码:

var start = moment().subtract(1, 'days');
var end = moment().subtract(1, 'days');
var start2 =moment().subtract(2, 'days');
var end2 =moment().subtract(2, 'days');

function cb(start, end, start2, end2) {
    console.log(start2);
    $('#reportrange3 span').html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
    $('#reportrange4 span').html(start2.format('MMMM D, YYYY') + ' - ' + end2.format('MMMM D, YYYY'));
    retrievedata(start.format('YYYY-MM-DD'), end.format('YYYY-MM-DD'),start2.format('YYYY-MM-DD'), end2.format('YYYY-MM-DD') );
}

$('#reportrange3').daterangepicker({
    startDate: start,
    endDate: end,
    ranges: {
        'Today': [moment(), moment()],
        'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
        'Last 7 Days': [moment().subtract(6, 'days'), moment()],
        'Last 30 Days': [moment().subtract(29, 'days'), moment()],
        'This Month': [moment().startOf('month'), moment().endOf('month')],
        'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
    }
}, cb);

$('#reportrange4').daterangepicker({
    startDate: start2,
    endDate: end2,
    ranges: {
        'Today': [moment(), moment()],
        'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
        'Last 7 Days': [moment().subtract(6, 'days'), moment()],
        'Last 30 Days': [moment().subtract(29, 'days'), moment()],
        'This Month': [moment().startOf('month'), moment().endOf('month')],
        'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]
    }
}, cb);

cb(start, end, start2, end2);

是对的。

您遇到的问题很可能是过滤后的扫描没有给出任何结果,因为在某些Android设备中存在MAC地址过滤不起作用的错误。我不确切知道有多少百分比的Android设备无法正常工作,因为我只能访问大约10种不同的设备型号。如果您想验证代码是否有效,我建议您使用任何具有最新固件更新的Nexus设备。

摘要

我建议不要使用此mac地址过滤,并在onScanResult函数上自行制作过滤代码,以支持所有Android 5.0+设备。