如何使用altbeacon android库使用UUID搜索信标?

如何使用altbeacon android库使用UUID搜索信标?,android,beacon,altbeacon,Android,Beacon,Altbeacon,alt beacon库提供了许多基于信标布局的示例。没有关于如何使用uuid查找信标的文档 用代码进行测试 try { beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null)); Identifier identifier = Identifier.parse("XXXXXXXX-XXXX-XXXXX-XXXX-XXXXXXXXXXXX")

alt beacon库提供了许多基于信标布局的示例。没有关于如何使用uuid查找信标的文档

用代码进行测试

try {
    beaconManager.startMonitoringBeaconsInRegion(new Region("myMonitoringUniqueId", null, null, null));

    Identifier identifier = Identifier.parse("XXXXXXXX-XXXX-XXXXX-XXXX-XXXXXXXXXXXX"); //beacon 1
    beaconManager.startMonitoringBeaconsInRegion(new Region("identifier", identifier, null, null));
} catch (RemoteException e) {    }
它不起作用。但是,使用本机API的等效方法可以很好地工作

List<ScanFilter> scanFilters = new ArrayList<>();
ParcelUuid uid = ParcelUuid.fromString(J_UUID);
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(uid).build();
scanFilters.add(filter);

List<ScanFilter> filters = scanFilters;
BluetoothManager bluetoothManager =
                (BluetoothManager) getApplicationContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
Intent intent = new Intent(getApplicationContext(), MyBroadcastReceiver.class);
intent.putExtra("o-scan", true);
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, pendingIntent);
List scanFilters=new ArrayList();
parceluid=parceluid.fromString(J_UUID);
ScanFilter filter=new ScanFilter.Builder().setServiceUuid(uid.build();
扫描过滤器。添加(过滤器);
列表过滤器=扫描过滤器;
蓝牙管理器蓝牙管理器=
(BluetoothManager)getApplicationContext().getSystemService(Context.BLUETOOTH_服务);
BluetoothAdapter=bluetoothManager.getAdapter();
Intent Intent=新的Intent(getApplicationContext(),MyBroadcastReceiver.class);
意图。putExtra(“o-scan”,真);
PendingEvent PendingEvent=PendingEvent.getBroadcast(getApplicationContext(),0,intent,PendingEvent.FLAG_UPDATE_CURRENT);
bluetoothAdapter.getBluetoothLeScanner().startScan(过滤器、设置、挂起内容);

使用alt beacon库实现同样的功能,我将不胜感激,这样我就不必反复担心作业的调度。

不要将128位蓝牙GATT服务UUID与信标的接近UUID混淆。当表示为用破折号分隔的十六进制数字时,两者表面上看起来很相似,和具有相同的字节数,但两者在不同的API中有根本不同的用途和使用方式:

邻近UUID是一个可扩展的信标概念。它是第一个信标标识符,代表组织对信标的所有权,通常用于筛选属于您的信标。它与iBeacon和AltBeacon格式一起使用(在AltBeacon中通常称为ID1)。此字段在BLE制造商广告中编码

GATT服务UUID是一个较低级别的BLE概念,表示BLE外围设备执行的特定功能(如心率监测器)。定制服务通常使用编码在GATT服务广告中的128位GATT服务UUID进行广告,该广告与上述制造广告完全不同类型的BLE广告包。虽然这些服务广告包用于Eddystone信标,但Eddystone格式使用更短的16位GATT服务UUID进行广告,并且实际的信标标识符位于其数据有效负载内

问题中的第二个代码示例显示了如何使用Android内置的BLEAPI查找一个宣传128位GATT服务UUID的设备。标准信标格式不使用这种结构,这就是为什么安卓信标库不能轻松搜索这些数据包的原因。它是一个专门用于使用BLE信标的库,而不是一个更通用的BLE库。这就是第一个代码示例不起作用的原因

标准信标格式不适用于128位GATT服务UUID有几个原因:

  • 数据包的大小非常有限,128位GATT服务UUID占用的空间非常大,几乎没有剩余空间
  • 信标格式必须具有前导字节模式,以标识数据包使用该格式。如果128位GATT服务UUID用作信标标识符,则在此之前没有可用于标识信标格式的可配置前导码

  • 一些使用标准格式(如iBeacon、AltBeacon或Eddystone)的信标交织多个播发,其中一个可以包括128位GATT服务UUID,通常用于播发用于配置信标的专有服务。如果您有一个硬件信标可以做到这一点,请不要将此广告与实际的信标数据包混淆。此广告应仅用于访问专有配置服务。

    我想知道是否可以使用它扫描BLE设备,这样就不必担心调度等问题。感谢您的澄清。您完全可以这样做,但这有点麻烦。您必须设置自定义信标格式(类似于Eddystone UID)以匹配服务UUID的开始。匹配表达式限制为2个字节,因此您必须使用信标格式来匹配服务UUID的前两个字节,然后将剩余字节放入标识符字段,并监视与服务UUID的剩余字节匹配的区域谢谢您的建议。代码的第二部分在除S9之外的许多8.0设备中运行良好。你有没有遇到过类似的问题?虽然我在S9上测试了Android Beacon库,但我没有做明确的测试来验证你问题的后半部分中显示的等效代码是否实际返回结果。我不知道有什么问题,但没有去找。