package uk.co.alt236.bluetoothlelib.device.beacon;
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
import uk.co.alt236.bluetoothlelib.device.adrecord.AdRecord;
import uk.co.alt236.bluetoothlelib.device.beacon.ibeacon.IBeaconConstants;
import uk.co.alt236.bluetoothlelib.util.ByteUtils;
/**
*
*/
public final class BeaconUtils {
private BeaconUtils(){
// TO AVOID INSTANTIATION
}
/**
* Ascertains whether a Manufacturer Data byte array belongs to a known Beacon type;
*
* @param manufacturerData a Bluetooth LE device's raw manufacturerData.
* @return the {@link BeaconType}
*/
public static BeaconType getBeaconType(final byte[] manufacturerData) {
if (manufacturerData == null || manufacturerData.length == 0) {
return BeaconType.NOT_A_BEACON;
}
if(isIBeacon(manufacturerData)){
return BeaconType.IBEACON;
} else {
return BeaconType.NOT_A_BEACON;
}
}
/**
* Ascertains whether a {@link uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice} is an iBeacon;
*
* @param device a {@link uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice} device.
* @return the {@link BeaconType}
*/
public static BeaconType getBeaconType(final BluetoothLeDevice device) {
final int key = AdRecord.TYPE_MANUFACTURER_SPECIFIC_DATA;
return getBeaconType(device.getAdRecordStore().getRecordDataAsString(key).getBytes());
}
private static boolean isIBeacon(final byte[] manufacturerData){
// An iBeacon record must be at least 25 chars long
if (!(manufacturerData.length >= 25)) {
return false;
}
if (ByteUtils.doesArrayBeginWith(manufacturerData, IBeaconConstants.MANUFACTURER_DATA_IBEACON_PREFIX)) {
return true;
}
return false;
}
}