Created an iBeaconDevice object

This commit is contained in:
Alexandros Schillings
2014-03-15 23:39:19 +00:00
parent 7546813f1b
commit 3f333df497
3 changed files with 69 additions and 64 deletions
@@ -53,7 +53,7 @@ public class BluetoothLeDevice implements Parcelable{
mTimestamp = timestamp;
}
private BluetoothLeDevice(Parcel in) {
protected BluetoothLeDevice(Parcel in) {
final Bundle b = in.readBundle(getClass().getClassLoader());
mDevice = b.getParcelable(PARCEL_EXTRA_BLUETOOTH_DEVICE);
@@ -56,11 +56,9 @@ public final class IBeaconManufacturerData {
public IBeaconManufacturerData(byte[] data){
mData = data;
//Log.d("TAG", "~ Reading iBeacon Data: " + ByteUtils.byteArrayToHexString(data));
mCompanyIdentidier = ByteUtils.getIntFrom2ByteArray(
ByteUtils.invertArray(
Arrays.copyOfRange(mData, 0, 2)));
ByteUtils.invertArray(Arrays.copyOfRange(mData, 0, 2)));
mIBeaconAdvertisment = ByteUtils.getIntFrom2ByteArray(Arrays.copyOfRange(mData, 2, 4));
mUUID = calculateUUIDString(Arrays.copyOfRange(mData, 4, 20));
@@ -69,28 +67,6 @@ public final class IBeaconManufacturerData {
mCalibratedTxPower = data[24];
}
private String calculateUUIDString(final byte[] uuid){
final StringBuffer sb = new StringBuffer();
for(int i = 0 ; i< uuid.length; i++){
if(i == 4){sb.append('-');}
if(i == 6){sb.append('-');}
if(i == 8){sb.append('-');}
if(i == 10){sb.append('-');}
sb.append(
Integer.toHexString(ByteUtils.getIntFromByte(uuid[i])));
}
return sb.toString();
}
public double getAccuracy(double rssi){
return calculateAccuracy(mCalibratedTxPower, rssi);
}
public int getCalibratedTxPower(){
return mCalibratedTxPower;
}
@@ -99,22 +75,6 @@ public final class IBeaconManufacturerData {
return mCompanyIdentidier;
}
public String getDistanceDescriptor(double accuracy){
if(accuracy < 0){
return "WTF";
}
if(accuracy < 0.5){
return "IMMEDIATE";
}
if(accuracy < 3.0){
return "NEAR";
}
return "FAR";
}
public int getIBeaconAdvertisement(){
return mIBeaconAdvertisment;
}
@@ -131,19 +91,20 @@ public final class IBeaconManufacturerData {
return mUUID;
}
// Code taken from: http://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing
private static double calculateAccuracy(int txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine accuracy, return -1.
private static String calculateUUIDString(final byte[] uuid){
final StringBuffer sb = new StringBuffer();
for(int i = 0 ; i< uuid.length; i++){
if(i == 4){sb.append('-');}
if(i == 6){sb.append('-');}
if(i == 8){sb.append('-');}
if(i == 10){sb.append('-');}
sb.append(
Integer.toHexString(ByteUtils.getIntFromByte(uuid[i])));
}
double ratio = rssi*1.0/txPower;
if (ratio < 1.0) {
return Math.pow(ratio,10);
}
else {
final double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111;
return accuracy;
}
return sb.toString();
}
}
@@ -3,9 +3,58 @@ package uk.co.alt236.bluetoothlelib.util;
import uk.co.alt236.bluetoothlelib.device.BluetoothLeDevice;
public class IBeaconUtils {
private static final double DISTANCE_THRESHOLD_WTF = 0.0;
private static final double DISTANCE_THRESHOLD_IMMEDIATE = 0.5;
private static final double DISTANCE_THRESHOLD_NEAR = 0.5;
private static final byte[] SCAN_RECORD_PREFIX_IBEACON_1 = new byte[]{0x02, 0x01, 0x1A, 0x1A, (byte) 0xFF, 0x4C, 0x00, 0x02, 0x15};
private static final byte[] SCAN_RECORD_PREFIX_IBEACON_2 = new byte[]{0x02, 0x01, 0x06, 0x1A, (byte) 0xFF, 0x4C, 0x00, 0x02, 0x15};
public static IBeaconDistanceDescriptor getDistanceDescriptor(double accuracy){
if(accuracy < DISTANCE_THRESHOLD_WTF){
return IBeaconDistanceDescriptor.UNKNOWN;
}
if(accuracy < DISTANCE_THRESHOLD_IMMEDIATE){
return IBeaconDistanceDescriptor.IMMEDIATE;
}
if(accuracy < DISTANCE_THRESHOLD_NEAR){
return IBeaconDistanceDescriptor.NEAR;
}
return IBeaconDistanceDescriptor.FAR;
}
// Code taken from: http://stackoverflow.com/questions/20416218/understanding-ibeacon-distancing
public static double calculateAccuracy(int txPower, double rssi) {
if (rssi == 0) {
return -1.0; // if we cannot determine accuracy, return -1.
}
double ratio = rssi*1.0/txPower;
if (ratio < 1.0) {
return Math.pow(ratio,10);
}
else {
final double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111;
return accuracy;
}
}
private static boolean doesArrayBeginWith(byte[] array, byte[] prefix){
if(array.length < prefix.length){return false;}
for(int i = 0; i < prefix.length; i++){
if(array[i] != prefix[i]){
return false;
}
}
return true;
}
public static boolean isThisAnIBeacon(BluetoothLeDevice device){
return isThisAnIBeacon(device.getScanRecord());
}
@@ -22,15 +71,10 @@ public class IBeaconUtils {
return false;
}
private static boolean doesArrayBeginWith(byte[] array, byte[] prefix){
if(array.length < prefix.length){return false;}
for(int i = 0; i < prefix.length; i++){
if(array[i] != prefix[i]){
return false;
}
}
return true;
public enum IBeaconDistanceDescriptor{
IMMEDIATE,
NEAR,
FAR,
UNKNOWN,
}
}