我正在开发一个具有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;
}
答案 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
),其中仅包含我要查找的设备。