Here是显示如何使用它进行发送和接收的库。我使用以下内容进行传输
Beacon beacon = new Beacon.Builder()
.setId1("2f234454-cf6d-4a0f-adf2-f4911ba9ffa6")
.setId2("1")
.setId3("2")
.setManufacturer(0x0118)
.setTxPower(-59)
.setDataFields(Arrays.asList(new Long[] {0l}))
.build();
BeaconParser beaconParser = new BeaconParser()
.setBeaconLayout("m:2-3=beac,i:4-19,i:20-21,i:22-23,p:24-24,d:25-25");
BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
beaconTransmitter.startAdvertising(beacon);
它对我来说成功工作,我也可以从另一个开源应用程序中看到它。
在接收中,我使用BeaconConsumer接口,并且在日志中可以看到成功调用了onBeaconServiceConnect,但是如网络示例或以下示例所示,Region函数存在问题
beaconManager.startRangingBeaconsInRegion(new Region("myRangingUniqueId", null, null, null));
由于接下来的三部分分别是用于传输的id1,id2,id3,所以什么是“ myRangingUniqueId”,所以该参数是什么?
[我的理解是,该Region函数将过滤出与给定参数匹配的某些id,对于蓝牙altbeacon,UUID由id1,id2,id3三部分组成。因此,“ myRangingUniqueId”真的使我感到困惑。根据我的实验,此参数与UUID不同,因为我将其设置为目标UUID无效。
我无法解释什么是“ myRangingUniqueId”。
如果我错了,请纠正我。预先感谢您的帮助。
Region的字符串标识符用作识别用于启动和停止目的的区域的键。
示例:
Region region1 = Region("abc123", null, null, null));
beaconManager.startRangingBeaconsInRegion(region1);
以上代码开始对所有信标进行测距,而与标识符无关。
如果您随后运行此代码:
Region region2 = Region("abc123", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6"), null, null));
beaconManager.startRangingBeaconsInRegion(region1);
对于上面显示的第一个区域,这将停止测距,并将其替换为仅与显示的第一个标识符的信标匹配的新区域。第一个参数匹配是触发此行为的原因。
如果您希望同时对两个区域进行测距,则可以这样做:
Region region1 = Region("abc123", null, null, null));
beaconManager.startRangingBeaconsInRegion(region1);
Region region2 = Region("def456", Identifier.parse("2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6")
beaconManager.startRangingBeaconsInRegion(region2);
因为这两个区域具有不同的密钥,所以可以同时使用它们。
调用stopRangingBeaconsInRegion(region)
时使用相同的键匹配过程>
API之所以如此工作,是因为它们的设计与iOS CoreLocation API相似,具有互操作性。在iOS上,API使用相同的技术。这使构建跨平台应用程序变得容易。