Search code examples
androidibeacon-android

Getting packet data transferred from iBeacon android


I have the below code used for transmitting iBeacon from an Android app.

Beacon beacon = new Beacon.Builder()
                        .setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
                        .setId2(Integer.toString(minor1))
                        .setId3(Integer.toString(minor2))
                        .setManufacturer(0x0000)
                        .setTxPower(-59)
                        .setDataFields(Arrays.asList(new Long[] {0l}))
                        .build();
                BeaconParser beaconParser = new BeaconParser()
                        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
                BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser);
                beaconTransmitter.startAdvertising(beacon);
            }
        });

Would it be possible for me to get the transmitted data in packets?How do i get those data? Thanks!


Solution

  • If you simply want to get the bytes of the packet to be transmitted, you can do so like this:

    Beacon beacon = new Beacon.Builder()
                        .setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2")
                        .setId2(Integer.toString(minor1))
                        .setId3(Integer.toString(minor2))
                        .setManufacturer(0x0000)
                        .setTxPower(-59)
                        .setDataFields(Arrays.asList(new Long[] {0l}))
                        .build();
    BeaconParser beaconParser = new BeaconParser()
                        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24");
    byte[] bytes = p.getBeaconAdvertisementData(beacon);
    

    Using the code above, the array of bytes will look like this:

    02 15 6f b0 e0 e9 2a e6 49 d3 bb a3 3c b7 69 8c 77 e2 ...
    

    Note that this byte array isn't the full packet that is transmitted over the air, just the manufacturer data part of it. The packet transmitted over the air is prefixed with a PDU type byte and a length byte, and is also prefixed with a flags PDU. These prefixes, however, are the same for every packet transmitted, and are added automatically by Androids BLE transmission APIs, so they are not included in the bytes returned by getBeaconAdvertisementData().