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.
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:
finalBluetoothLeDevicedevice = ... // A generic BLE deviceif (BeaconUtils.getBeaconType(device) == BeaconType.IBEACON) {
finalIBeaconDeviceiBeacon = newIBeaconDevice(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()
请发表评论