如何使用Android Beacon Library传输位置信息

时间:2015-04-23 23:10:13

标签: ibeacon-android

我想使用类似的东西 beacon-transmitter sample code 以自定义LocationBeacon 传输位置信息。

从示例代码中,我似乎还必须使用BeaconParser创建自定义BeaconParser.setBeaconLayout,以便能够解析我要传输的其他位置信息。

我应该如何编写beaconLayout字符串来解析我的LocationBeacon的位置信息?

假设我想做的事情是可能的,但是,这是使用信标的推荐/正确方法吗? (我希望手机能够使用信标“广播”我的位置)

1 个答案:

答案 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");

这由以下内容组成:

  1. 两个字节的信标类型代码0x10ca(读作" loca" tion,聪明呃?)

  2. 六字节移动设备标识符。您可以将其设为简单的序号,或使用移动设备的mac地址。

  3. 纬度的4字节标识符字段。

  4. 经度的4字节标识符字段。

  5. 1字节发射机功率校准常数。

  6. 然后您可以像这样发送这个灯塔。请注意,您必须将浮点纬度和经度数转换为无符号整数,以使它们作为标识符使用:

    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米范围的蓝牙上传输设备的经度和经度是显而易见的,因为所有接收设备基本上都处于相同的纬度和经度。但是,展示信标解析器的工作方式仍然是一个很好的练习。