Contact Us

Contact Us



Pleas confirm by checkbox


Technical

Scanning iBeacon and Eddystone Using Android BLE Scanner

Author_img
By Dinkar Kumar November 18, 2020

Introduction

This blog will introduce you to Bluetooth Low Energy and will cover all the end-use application areas where it is used. Furthermore, the blog will also walk you through different kinds of BLE beacons and popular beacon protocols.

In the latter half of the article, we will create a demo android application to test out 2 BLE Beacon protocol, one from Apple and one from Google. But, let us first go through some basic definitions and an overview of BLE and Beacons before jumping onto the coding part.

Bluetooth Low Energy

Bluetooth Low Energy is a wireless personal area network technology designed by Bluetooth SIG. The Bluetooth SIG identifies different markets for low energy technology, particularly in the field of smart home, health, sport, and fitness sectors. Some of the key advantages include:

  • low power requirements can run for months/years on a button cell
  • small size and low cost
  • compatibility with mobile phones, tablets, and computers

Bluetooth Low Energy (BLE), available from Android API 18(4.3 — Jelly Bean), and later creates short connections between devices to transfer bursts of data. BLE when not connected it remains in sleep mode. This is because as compared to Classic Bluetooth it utilizes less power by providing lower bandwidth. It is ideal for applications such as a heart-rate monitor or a wireless keyboard. To use BLE, devices need to have a chipset that supports BLE. Talking about BLE Beacons, Bluetooth Beacons are physical transmitters – a class of BLE devices that broadcast their identifiers on nearby electronic devices.

Use Cases of BLE Beacons

These beacons can be used for many proximity-related applications such as –

  • Proximity Alerts: These beacons can be used to get alerts in-app when they are in the vicinity
  • Indoor Navigation/ Location: By using a proper number of beacons placed in the room and utilizing the signal strength of all the beacons properly, we can create a working solution for indoor navigation or indoor location.
  • Interactions: These beacons can be placed on the poster/banner of a movie in a movie theatre and as soon as the device comes in proximity of it app can launch its trailer or teaser, the same can be done for museums where these can be placed on the art piece and people can the details of these painting as notification and also get video/audio/text info for the art piece.
  • Healthcare: it can be used for tracking patient movement and activities

It can be used for many other use cases as well. For instance, you can place a BLE tag in your key and then can use your mobile phone to search for it if it’s inside a cupboard or just lying under the sofa.

Beacon Protocols

  • iBeacon: Apple’s standard for Bluetooth beacon
  • AltBeacon: It is an open-source alternative to iBeacon created by Radius Networks
  • URIBeacon: It directly broadcast URL which can be understood immediately
  • Eddystone: Google’s standard for Bluetooth beacons, It supports three types of packets, Eddystone-UID, Eddystone-URL, and Eddystone-TLM.

Now, we will see how we can scan for Apple’s iBeacon and Google’s Eddystone-UID by creating a demo android application.

Getting Started

Create a new project and choose the template of your choice.

I chose “Empty Activity”.

BLE Dependency

There is no extra BLE library dependency as such for scanning for BLE beacons.

Open AndroidManifest.xml and add the following in the manifest element.

<uses-feature> tag with required as “true” means that this app requires BLE hardware to work with hence Google play will make sure that this app is only visible to devices that have the BLE hardware Available.

<uses-permission> tag is required to get the permission to use the Bluetooth hardware with Coarse location in Low energy mode.

Check for Permission

Coarse location permission is needed for Bluetooth low energy scanning mode. Hence we should make sure that we have the required permission provided by the user.

Check whether got the permission else to show the dialog letting the user know why we need this permission.

Setting up Bluetooth API

Initialize the BluetoothManager to get the instance of BluetoothAdapter for getting BluetoothLeScanner, which is required to perform scan related operations for Bluetooth LE devices.

  • BluetoothManager: High-level manager used to obtain an instance of a BluetoothAdapter and to conduct overall Bluetooth Management.
  • BluetoothAdapter: Represents the local device Bluetooth adapter. The BluetoothAdapter lets you perform fundamental Bluetooth tasks, such as initiate device discovery, query a list of bonded (paired) devices, instantiate a BluetoothDevice using a known MAC address, and create BluetoothServerSocket to listen for connection requests from other devices and start a scan for Bluetooth LE devices.
  • BluetoothLeScanner: This class provides methods to perform scan related operations for Bluetooth LE devices.

BLE Scan Callbacks

BLE Start/Stop Scanner

We can have the button to control the start and stop of the BLE scanner.

Parse ScanResult to Get Relevant Data

We should create a Beacon class to hold the different info we will be parsing from ScanResult from onScanResult callback.

Extracting Eddystone UID packet info if there is any.

Eddystone UID: A unique, static ID with a 10-byte Namespace component and a 6-byte Instance component.

  • scanRecord: a combination of advertisement and scan response
  • device.address: hardware address of this Bluetooth device. For example, “00:11:22:AA:BB:CC”.
  • rssi: received signal strength in dBm. The valid range is [-127, 126].
  • serviceUuids: list of service UUIDs within the advertisement that are used to identify the Bluetooth GATT services.
  • eddystoneServiceId : Service UUID for Eddystone UID which is “0000FEAA-0000–1000–8000–00805F9B34FB”
  • serviceData: the service data byte array associated with the serviceUuid, in our case eddystoneServiceId
  • eddystoneUID packet info is there in serviceData from index 2 to 18, we need to convert this byte array to Hex string using the utility method.

  • namespace is of 10 bytes which are starting 20 characters of eddystoneUID
  • instanceId is of 6 bytes which are the remaining 12 characters of eddystoneUID

Extracting iBeacon packet info if there is any.

iBeacon: A unique, static ID with a 16-byte Proximity UUID component and a 2-byte Major component, and a 2-byte Minor component.

  • iBeaconManufactureData: the manufacturer specific data associated with the manufacturer id, for iBeacon manufacturer id is “0X004c” (Apple).
  • iBeacon UUID or Proximity UUID is of 16 bytes and extracted from iBeaconManufactureData from index 2 to 18, we need to convert this byte array to Hex string using the utility method
  • major is of 2 bytes, range between 1 and 65535 and extracted from iBeaconManufactureData from index 18 to 20, we need to convert this byte array to Hex string using the utility method and then convert it to Integer
  • minor is of 2 bytes, range between 1 and 65535 and extracted from iBeaconManufactureData from index 20 to 22, we need to convert this byte array to Hex string using the utility method and then convert it to Integer

Let’s see the code in Action

Figure- Start screen

Figure- Start screen with the options

Figure- Result screen with Eddystone UID, iBeacon, generic BLE devices

BLE beacons iBeacon and Eddystone-UID are different from each other, however can be used for any of the proximity-related applications. It is because, at the application level, both of them solve similar problems using different Bluetooth profiles.

Eddystone do have a different type of packets to solve a different problem like-

  • Eddystone-URL : for broadcasting URL
  • Eddystone-TLM: broadcasts information about the beacon. This can include battery level, sensor data, battery voltage, beacon temperature, number of packets sent since the last startup, and beacon uptime, or other relevant information to beacon administrators

For more details and an in-depth view, you can find the code here

 

Related posts
3 Crucial Ways of Inserting Code into a Running Application without Creating Bottlenecks
Technical

3 Crucial Ways of Inserting Code into a Running Application without Creating Bottlenecks

By namrata.gupta January 28, 2022
Apache Spark Standalone Setup On Linux/macOS
Technical

Apache Spark Standalone Setup On Linux/macOS

By namrata.gupta October 20, 2021
Apache Flink Standalone Setup on Linux/macOS
Technical

Apache Flink Standalone Setup on Linux/macOS

By namrata.gupta October 13, 2021
Identity, Authentication, And Access Management Using Azure Active Directory  
Technical

Identity, Authentication, And Access Management Using Azure Active Directory  

By namrata.gupta September 22, 2021
Things to Know Before You Select A Crypto Wallet
Blockchain

Things to Know Before You Select A Crypto Wallet

By namrata.gupta September 20, 2021
Solve 3 Most Irritating Outlook Email Rendering Issues.
Technical

Solve 3 Most Irritating Outlook Email Rendering Issues.

By namrata.gupta September 15, 2021
Intuit Wasabi – A Scalable A/B Testing Solution
Technical

Intuit Wasabi – A Scalable A/B Testing Solution

By namrata.gupta September 01, 2021
How To Pick The Right Data Analytics Strategy For Serverless Systems?
Big Data

How To Pick The Right Data Analytics Strategy For Serverless Systems?

By namrata.gupta August 25, 2021
Change Notifications and Named Options using Options pattern in .NET Core
Technical

Change Notifications and Named Options using Options pattern in .NET Core

By namrata.gupta August 18, 2021
Create Strongly Typed Configurations in .NET Core
Technical

Create Strongly Typed Configurations in .NET Core

By namrata.gupta August 13, 2021

Stay updated

Get the latest creative news from Fubiz about art, design and pop-culture.