Coder Social home page Coder Social logo

alt236 / bluetooth-le-library---android Goto Github PK

View Code? Open in Web Editor NEW
856.0 83.0 307.0 13.65 MB

This library allows for easy access to a Bluetooth LE device's AdRecord and RSSI value. It offers additional functionality for iBeacons.

Java 78.25% HTML 4.53% Shell 0.38% Kotlin 16.85%

bluetooth-le-library---android's Introduction

Bluetooth LE Library for Android

This library allows for easy access to a Bluetooth LE device's Advertisement Records. It also offers:

  • A simple running average RSSI reading keeping.
  • For iBeacons: Manufacturer data record parser.
  • For iBeacons: Distance indicators (Near, Far, Immediate, Unknown).
  • For iBeacons: A decently inaccurate (due to real world issues) distance approximation.
  • All the new object types are Parcelable.

This will only work on devices with Android 4.3 (API Level 18) and above.

Get it on Google Play

Including the Library in Your Project

This project is available as an artifact for use with Gradle. To use that, add the following blocks to your build.gradle file:

	repositories {
		maven {
			url "https://dl.bintray.com/alt236/maven"
		}
	}

	dependencies {
		compile 'uk.co.alt236:bluetooth-le-library-android:1.0.0'
	}

If you really need a Jar file, fork the project and execute ./gradlew clean build generateRelease at the root of the project. This will create a zip file under <PROJECT_ROOT>/library/build/ the Jar can be found inside.

Using the Library

In the onLeScan() method of your BluetoothAdapter.LeScanCallback() create a new BluetoothLeDevice with the given information.

For example:

	private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {

		@Override
		public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

			final BluetoothLeDevice deviceLe = new BluetoothLeDevice(device, rssi, scanRecord, System.currentTimeMillis());

			runOnUiThread(new Runnable() {
				@Override
				public void run() {
					mDeviceStore.addDevice(deviceLe);
					mLeDeviceListAdapter.replaceData(mDeviceStore.getDeviceList());
				}

			});
		}
	};

Device Properties

Once you have created a device, you can access the following methods:

  • getAddress() : Gets the MAC Address of the device
  • getAdRecordStore(): Gives access to a device's Ad Records
  • getDevice(): Gives access to the standard BluetoothDevice object
  • getFirstRssi(): Retrieves the RSSI value which was used when the object was created
  • getFirstTimestamp() Retrieves the timestamp (in millis) which was used when the object was created
  • getRssi() Gets the current RSSI measurement (see note below).
  • getScanRecord() Retrieves the RAW scan record array
  • getTimestamp() Gets the timestamp of the last RSSI measurement
  • getRunningAverageRssi() Retrieves the internally calculated running average RSSI value (see note below).

Note: The Running Average RSSI is not updated automatically (i.e. the library does not monitor on its own in the background). To add another measurement, you need to call updateRssiReading(long timestamp, int rssiReading).

Accessing the Advertisement (Ad) Records

Once you've created a BluetoothLe device, you can access the AdRecord store via the leDevice.getAdRecordStore(). Once you have the AdRecordStore you can use the following methods:

  • getRecord(int recordNo): Gets the AdRecord object corresponding to the recordNumber.
  • getRecordDataAsString(int recordNo) : Gets the AdRecord contents as a String (expect non printable characters in most cases).
  • isRecordPresent(int recordNo): Checks to see if a record exists.

Note: Record numbers are declared in the Bluetooth 4 spec which can be found here. They are also declared as constants in AdRecord.java.

Fun with iBeacons

You can check if a device is an iBeacon by using BeaconUtils.getBeaconType(BluetootLeDevice device). Once you have confirmed that it is, you can create a new IBeaconDevice via the IBeaconDevice constructor.

Example Flow:

	final BluetoothLeDevice device = ... // A generic BLE device

	if (BeaconUtils.getBeaconType(device) == BeaconType.IBEACON) {
		final IBeaconDevice iBeacon = new IBeaconDevice(device);
		// DO STUFF
	}

An IBeaconDevice extends BluetoothLeDevice, so you still have access to the same methods as before. In addition you can do the following:

  • getAccuracy(): Gets the estimated Accuracy of the reading in meters based on a simple running average calculation
  • getCalibratedTxPower(): Gets the calibrated TX power of the iBeacon device as reported
  • getCompanyIdentifier(): Gets the iBeacon company identifier (this should always be 0x004C for Apple)
  • getDistanceDescriptor(): Gets the estimated Distance descriptor (an enum)
  • getIBeaconData(): Gets the raw IBeaconManufacturerData object.
  • getUUID(): Gets the device's UUID
  • getMajor(): Gets the device's Major value
  • getMinor(): Gets the device's Minor value

Lookup Functions

You can also lookup values and convert them to human friendly strings:

  • BluetoothClassResolver.resolveDeviceClass(int btClass): Will try to resolve a Blueotooth Device class
  • CompanyIdentifierResolver.getCompanyName(int companyId, String fallback): Will try to resolve a Company identifier to the company name
  • GattAttributeResolver.getAttributeName(String uuid, String fallback): Will try to convert a UUID to its name.

Note: The data can be found as ODS (Open Office Spreadsheets) in the documents folder.

Library Changelog

  • v0.0.1
    • First public release
  • v0.0.2:
    • Attempting to create an iBeaconDevice from a device which is not an iBeacon will now throw an IllegalArgumentException exception.
    • Fixed a ConcurrentModificationException on getRunningAverageRssi()
    • Added some Estimote UUIDs
  • v1.0.0:
    • Migrated project to Android Studio/ gradle
    • Note that the API has slightly changed in this version.
    • We now use the more generic BeaconUtils.getBeaconType() method instead of IBeaconUtils.isThisAnIBeacon()
    • Fix for issue 5
    • Fix for issue 9

Sample Application Changelog

  • v0.0.1
    • First public release
  • v0.0.2:
    • Can now export scanned devices as a CSV file.
  • v0.0.3:
    • UI Refresh.
  • v1.0.0:
    • Migrated project to Android Studio/ gradle
    • Using version v1.0.0 of the library project
  • v1.1.0:
    • App refactor and materialisation.
    • Added runtime permissions.
  • v1.1.1:

Permission Explanation

You will need the following permissions to access the Bluetooth Hardware

  • android.permission.BLUETOOTH
  • android.permission.BLUETOOTH_ADMIN

In addition one of the following is needed from API 23 and above to scan for BT LE devices:

  • android.permission.ACCESS_COARSE_LOCATION
  • android.permission.ACCESS_FINE_LOCATION

TODO

  • Tidy up Javadoc. There is quite a lot of it that is template
  • Add parsers for common Ad Records.

Links

Credits

Author: Alexandros Schillings.

All logos are the property of their respective owners.

The code in this project is licensed under the Apache Software License 2.0.

Copyright (c) 2014-2017 Alexandros Schillings.

bluetooth-le-library---android's People

Contributors

alt236 avatar orthographic-pedant avatar ravidsrk avatar xrmx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

bluetooth-le-library---android's Issues

When removing batteries from the beacon device, the list doesnt get refreshed

Hi

I am using the sample here with the library, and i came across a situation where in, the beacon gets detected when the cell is put into it, but when removed, the list is not refreshed until i press the scan button. is there a way i could be able to track that a beacon device is no longer part of the list? Please assist?

i notice that onScanResult log also stops when the beacon is not detected,but i could not track the log anywhere in the code.

Thanks

Some issue in GattAttributeResolver

The service or characteristic id may have some error, for example:
public static final String LINK_LOSS = "00001804-0000-1000-8000-00805f9b34fb";
it should be 1803 for LINK_LOSS

what kind of beacon format (ibeacon)

hi all,
in my beacon device , can't assert as BeaconType.IBEACON.
how to revise it ?

02,0x1 04,no connected
1A,data len
FF,Manufacture
uuid ,major and minor id .
590002150112233445566778899AABBCCDDEEFF001020304

beacon raw data:
0x0201041AFF590002150112233445566778899AABBCCDDEEFF001020304C3

android ,6.0
android studio 3.01

Meaning of these values in the accurancy calculation

...in this method:

protected 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 {
    double accuracy =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;    //these
    return accuracy;
  }
}   

thanks

Bluetooth

It says critical batteries but its not dead help

Multiple devices connectivity in android

Hi,
I am trying to make this sample supportable for multiple devices but not able to successfully connect with multiple ones.
I read some where to create Multiple Gatt instances to support multiple devices but still got random disconnect.
Can you help me for this assignment, i am not expecting code but guidance will be more precious.

Android 6.0 not in LeScanCallback

In Android 6.0 appear information log below:
D/BluetoothAdapter: startLeScan(): null
And the program not in LeScanCallback (onLeScan), what's wrong with it ?
thanks~

Unable to include Library to my project

I am new to this android development. I am making an app to detect the BLE attributes of my Eddystone beacon.
screen shot 2018-04-04 at 4 34 42 pm

It is showing an error in onLeScan method. I would really appreciate if someone can help.

Thanks

Distance

How would you compute the distance if there's no txPower?

scanning the ble of ibeacon, Glide+okhttp3 load image very slow from server.

When the application starts, I first open the intentservice to download the audio, then opened the service to scan the Bluetooth equipment ibeacon. At this point, I found the picture from the server to download very slowly, in the local load is not affected.

I think the child thread may be blocked, how to solve it.

android os: huawei 6.0 and xiaomi 5.0

service

please can the device scan work as a service? so it can detect devices when the phone is not in use.

Bluetooth-LE-Library---Android Crashes

05-11 10:54:58.546 26445-26445/uk.co.alt236.btlescan E/libc++abi: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc
05-11 10:54:58.546 26445-26445/uk.co.alt236.btlescan A/libc: Fatal signal 6 (SIGABRT), code -6 in tid 26445 (alt236.btlescan)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.