Android BLE。是否可以在扫描时将数据发送到设备?

时间:2020-01-22 13:24:07

标签: java android bluetooth-lowenergy

我正在开发一个具有BLE设备的应用程序,该设备仅在扫描时发送某些参数时才在扫描时显示。

App nrf Connect可以很好地完成此任务(按原始数据过滤时,请使用0x02010612435542原始数据参数)。

该设备将不会显示其名称,UUID或制造商数据。 在nrf Connect上,它唯一共享的是原始回报,例如:0X020106124355420000080390BECB49400400CB500CF(这正是我现在所需要的)。 并且通过Mac Address扫描(在设备的一个单元上进行测试),它只能得到我的rssi)

我的问题是,就像nrfConnect一样,我该如何编码过滤器或类似的东西,这些东西将在扫描时作为参数发送,这样我才能找到我的设备?这些设备没有名称(扫描时显示N / A),并且我无法添加Mac地址过滤器列表,因为当我的应用程序完成时,会有成千上万的同类设备。

private List<ScanFilter> scanFilters() {
    List<ScanFilter> list = new ArrayList<ScanFilter>();

        ScanFilter scanFilter = new ScanFilter.Builder().build();
        list.add(scanFilter);

        //What kind of filter do I use to send that data on scanning?

    return list;
}

2 个答案:

答案 0 :(得分:1)

在BLE扫描器中,您收到ScanResult,其中包含BluetoothDevice的实例,即扫描的设备。至少,您应该能够读取设备的BLE地址,即其硬件地址。使用方法:

BluetoothDevice.getAddress(); 

此硬件地址应具有预定义的范围,例如以“ A3:B4”开头,这可以过滤scanRecords。向您的设备制造商询问如何生成这些硬件地址。

此外,如果您知道所支持设备的制造商ID,则可以根据制造商数据设置过滤器:

ScanFilter scanFilter = new ScanFilter.Builder()
                                .setManufacturerData(manufacturerId, manufacturerData)
                                .build();

请注意,ManufacturerData数组的前两个字节是ManufacturerId。

编辑:制造商数据是返回的字节数组的一部分

scanResult.getScanRecord().getBytes()

scanResult会传递到您赋予ScanCallback的{​​{1}}

答案 1 :(得分:0)

我终于找到了解决问题的方法。

这不是我的想法,但是由于@matdev,我设法以某种方式弄清楚了。并且它不能回答主要问题,即是否可以将数据发送到正在扫描的设备,但是该解决方案对我有用。

首先,我按名称过滤了设备name == null

private List<ScanFilter> scanFilters() {
    List<ScanFilter> list = new ArrayList<ScanFilter>();

    ScanFilter scanFilterName = new ScanFilter.Builder().setDeviceName(null).build();

    list.add(scanFilterName);

    return list;
}

它给了我大量的设备清单。因此,我在scanResult()上添加了另一个过滤器。正如@matdev所指出的那样,该其他过滤器的后缀为MAC Address,与我的设备相同。

private Set<String> btDeviceData = new LinkedHashSet<String>();
private ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {

        BluetoothDevice device = result.getDevice();

        ScanRecord record = result.getScanRecord();
        byte[] dataByteArray = record.getBytes();

        if (device.getAddress().startsWith("F8:36:9B")) {

            btDeviceData.add(device.getAddress());
        }
    }
};

这样做,我得到了一个列表(具体来说是Set),其中仅包含我要查找的设备。