Java 安卓系统是一个很好的平台。是否可以在扫描时向设备发送数据?

Java 安卓系统是一个很好的平台。是否可以在扫描时向设备发送数据?,java,android,bluetooth-lowenergy,Java,Android,Bluetooth Lowenergy,我正在开发一个应用程序,它有一个BLE设备,只有在扫描时发送一些参数时才会在扫描时显示 App nrf Connect可以很好地完成这项任务(当按原始数据过滤时,使用0x0201062435542raw data参数) 设备不会显示其名称、UUID或制造商数据。 在nrf Connect上,它唯一共享的是这样的原始回报:0x0201062435542000008390BECB49400CB500CF(这正是我现在需要的)。 在通过Mac地址扫描时(在设备的一个单元上测试),它只能得到它的rssi

我正在开发一个应用程序,它有一个BLE设备,只有在扫描时发送一些参数时才会在扫描时显示

App nrf Connect可以很好地完成这项任务(当按原始数据过滤时,使用
0x0201062435542
raw data参数)

设备不会显示其名称、UUID或制造商数据。 在nrf Connect上,它唯一共享的是这样的原始回报:
0x0201062435542000008390BECB49400CB500CF
(这正是我现在需要的)。 在通过Mac地址扫描时(在设备的一个单元上测试),它只能得到它的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;
}
私有列表扫描过滤器(){
列表=新的ArrayList();
ScanFilter ScanFilter=new ScanFilter.Builder().build();
添加(扫描过滤器);
//我在扫描时使用什么样的过滤器发送数据?
退货清单;
}

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

BluetoothDevice.getAddress(); 
这个硬件地址应该有一个预定义的范围,例如以“A3:B4”开始,它可以过滤扫描记录。询问设备制造商这些硬件地址是如何生成的

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

ScanFilter scanFilter = new ScanFilter.Builder()
                                .setManufacturerData(manufacturerId, manufacturerData)
                                .build();
注意,manufacturerData数组的前两个字节是manufacturerId

编辑:manufacturerData是返回的字节数组的一部分

scanResult.getScanRecord().getBytes()

scanResult
被传递给您提供给
BluetoothLESCanner.startScan(…)

ScanCallback
,我终于找到了问题的解决方案

这不是我当时的想法,但多亏了@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;
}

通过这样做,我得到了一个列表(
Set
,具体来说),其中只有我正在寻找的设备。

感谢您的回复!但事情是这样的。。。。在包含所有制造商ID的官方蓝牙公司ID网站[link]上,没有开发我的设备的公司的ID(公司):当我基于MacAddress执行扫描时,扫描记录结果如下:
[scanRecord[mAdvertiseFlags=6,mServiceUuids=null,MmanufacturerSpecificATA={},mServiceData={},mTxPowerLevel=-2147483648,mDeviceName=null]]
。有没有可能该公司没有制造商ID?只需向Bluetooth SIG发送一条消息,告诉他们您需要一个公司标识符。您的另一个选项是使用“服务数据”,但由于服务uuid为16字节(128位),因此您将获得更多开销。包含制造商数据的字节数组由scanResult返回。getScanRecord()。getBytes()在扫描记录的字节数组中,制造商数据部分以0xFF开始,即-1(后跟数据长度)。因为我在你的扫描记录中没有看到-1,所以你的制造商似乎没有遵循标准惯例:谢谢。如果我能投你一票,我会的。一旦我想好了,我会把它贴在这里。
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());
        }
    }
};