我想使用类似的东西 beacon-transmitter sample code 以自定义LocationBeacon 传输位置信息。
从示例代码中,我似乎还必须使用BeaconParser
创建自定义BeaconParser.setBeaconLayout
,以便能够解析我要传输的其他位置信息。
我应该如何编写beaconLayout字符串来解析我的LocationBeacon
的位置信息?
假设我想做的事情是可能的,但是,这是使用信标的推荐/正确方法吗? (我希望手机能够使用信标“广播”我的位置)
答案 0 :(得分:1)
这当然是可能的。
只有26个字节的广告空间可供使用,其中5个需要为公司代码(2个字节)和自定义信标标识符(2个字节)和发射机功率校准值(1个字节)保留。这使您可以使用21个字节来存储纬度,经度和您要传输的任何其他信息。您可能还想传输设备标识符,因此如果多个电话正在广播其位置,您就知道哪个是哪个。
这是一个建议的布局:
BeaconParser p = new BeaconParser().
setBeaconLayout("m:2-3=10ca,i:4-9,i:10-13,i:14-17,p:18-18");
这由以下内容组成:
两个字节的信标类型代码0x10ca(读作" loca" tion,聪明呃?)
六字节移动设备标识符。您可以将其设为简单的序号,或使用移动设备的mac地址。
纬度的4字节标识符字段。
经度的4字节标识符字段。
1字节发射机功率校准常数。
然后您可以像这样发送这个灯塔。请注意,您必须将浮点纬度和经度数转换为无符号整数,以使它们作为标识符使用:
double latitude = 38.93;
double longitude = -77.23;
Beacon beacon = new Beacon.Builder()
.setManufacturer(0x0118) // Radius Networks
.setId1("1") // device sequence number
.setId2(String.format("0x%X", (long)((latitude+90)*10000.0)))
.setId3(String.format("0x%X", (long)((longitude+180)*10000.0)))
.setTxPower(-59) // The measured transmitter power at one meter in dBm
.build();
BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
beaconTransmitter.startAdvertising(beacon);
然后你可以检测这样的信标并读出这样的值:
double latitude = Long.parseLong(beacon.getId2().toString().substring(2), 16) / 10000.0 - 90.0;
double longitude = Long.parseLong(beacon.getId3().toString().substring(2), 16) / 10000.0 - 180.0;
有些人可能会注意到,在50米范围的蓝牙上传输设备的经度和经度是显而易见的,因为所有接收设备基本上都处于相同的纬度和经度。但是,展示信标解析器的工作方式仍然是一个很好的练习。