This page show some code samples to retrieve the real-time location of a BLE device using the Accuware Bluetooth Beacon Tracker API. To run these examples you need:

  • a set of Accuware credentials (username and password).
  • the SiteID.
  • the pMAC of the BLE device registered with your Accuware site.

Objective-C

Source code

NSString *site_id = @"0000";
NSString *station_mac = @"00:00:00:00:00:00";

NSURLCredential *credential = [NSURLCredential credentialWithUser: @"username"
														 password: @"password"
													  persistence: NSURLCredentialPersistenceForSession];

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] initWithHost: @"its.accuware.com" 
																			  port: 80 
																		  protocol: @"http" 
																			 realm: @"Accuware Bluetooth Beacon Tracker" 
															  authenticationMethod: NSURLAuthenticationMethodHTTPBasic];


[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential: credential
													forProtectionSpace: protectionSpace];
[protectionSpace release];

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat: @"https://its.accuware.com/api/v1/sites/%@/stations/%@/",
								   site_id,
								   station_mac]];

NSURLRequest *urlRequest = [NSURLRequest requestWithURL: url];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];
NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &error];

NSLog(@"Station: %@", [jsonObj objectForKey:@"mac"]);
NSLog(@"loc.lat: %.6f", [[[jsonObj objectForKey: @"loc"] objectForKey: @"lat"] doubleValue]);
NSLog(@"loc.lng: %.6f", [[[jsonObj objectForKey: @"loc"] objectForKey: @"lng"] doubleValue]);

Java

The Restlet framework provides a convenient access the API from Java. Download the Java SE edition archive and extracts the files in a directory of your choice.

Locate and add to your CLASSPATH the following JAR files:

org.restlet.jar
org.restlet.ext.json.jar
org.json.jar

Source Code

import org.json.JSONObject;
import org.restlet.data.ChallengeScheme;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.resource.ClientResource;

public class ItsClient {

    private final static String BASE_URL = "https://its.accuware.com/api/v1/";

    private final static String SITE_ID = "0000";                       // Your site ID here
    private final static String STATION_MAC = "00:00:00:00:00:00";      // The station's MAC address
    private final static String USERNAME = "username";                  // Your username
    private final static String PASSWORD = "password";                  // Your password

    public static void main(String[] args) throws Exception {

        // Set the request parameters
        String url = BASE_URL + "sites/" + SITE_ID + "/stations/" + STATION_MAC + "/";
        ClientResource itsClient = new ClientResource(url);
        itsClient.setChallengeResponse(ChallengeScheme.HTTP_BASIC, USERNAME, PASSWORD);

        // Retrieve and parse the JSON representation
        JsonRepresentation jsonRep = new JsonRepresentation(itsClient.get());
        JSONObject jsonObj = jsonRep.getJsonObject();

        // Output results
        System.out.printf("Station: %s\n", jsonObj.getString("mac"));
        System.out.printf("loc.lat: %.6f\n", jsonObj.getJSONObject("loc").getDouble("lat"));
        System.out.printf("loc.lng: %.6f\n", jsonObj.getJSONObject("loc").getDouble("lng"));
    }
}

C#

The C# example uses JSON.NET to parse the response. The library is available at json.codeplex.com.

Source Code

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using Newtonsoft.Json.Linq;

namespace ItsClient
{
    class Program
    {
        private const string BASE_URL = "https://its.accuware.com/api/v1/";

        private const string SITE_ID = "0000";                       // Your site ID here
        private const string STATION_MAC = "00:00:00:00:00:00";      // The station's MAC address
        private const string USERNAME = "username";                  // Your username
        private const string PASSWORD = "password";                  // Your password

        static void Main(string[] args)
        {
            // Set the request parameters
            string url = BASE_URL + "sites/" + SITE_ID + "/stations/" + STATION_MAC + "/";
            HttpWebRequest webreq = (HttpWebRequest)System.Net.HttpWebRequest.Create(url);
            string authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(USERNAME + ":" + PASSWORD));
            webreq.Headers["Authorization"] = "Basic " + authInfo;

            // Retrieve and parse the JSON representation
            StreamReader strReader = new StreamReader(webreq.GetResponse().GetResponseStream());
            String response = strReader.ReadToEnd();
            JObject jsonObj = JObject.Parse(response);

            // Output results
            Console.Out.WriteLine("Station: " + (string) jsonObj["mac"]);
            Console.Out.WriteLine("loc.lat: " + (double) (jsonObj["loc"])["lat"]);
            Console.Out.WriteLine("loc.lng: " + (double) (jsonObj["loc"])["lng"]);
        }
    }
}

Ruby

This example uses the JSON library for Ruby available as a gem:

gem install json

Source Code

require 'rubygems'
require 'json'
require 'net/http'

SERVER = 'its.accuware.com'
SITE_ID = '0000'                       # Your site ID here
STATION_MAC = '00:00:00:00:00:00'      # The station's MAC address
USERNAME = 'username'                  # Your username
PASSWORD = 'password'                  # Your password

Net::HTTP.start(SERVER) {|http|

    # Set the request parameters
    req = Net::HTTP::Get.new("/api/v1/sites/#{SITE_ID}/stations/#{STATION_MAC}/")
    req.basic_auth USERNAME, PASSWORD

    # Retrieve and parse the JSON representation
    response = http.request(req)
    obj = JSON.parse(response.body)

    # Output the results
    puts "Station: #{obj['mac']}"
    puts "loc.lat: #{obj['loc']['lat']}"
    puts "loc.lng: #{obj['loc']['lng']}"
}

HTML/Javascript

The source code for the Base 64 library is available at this page. To run this example save the code in a file named Base64.js in the same directory as the HTML file below.

Source Code

<!DOCTYPE html>
<html>
<head>
    <title>Accuware Bluetooth Beacon Tracker Javascript Example</title>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script type="text/javascript" src="Base64.js"></script>
</head>

<body>
    <h1>Accuware Bluetooth Beacon Tracker Javascript Example</h1>

    <div id="results"></div>

    <script type="text/javascript">

        $(document).ready(function() {

            var BASE_URL = "https://its.accuware.com/api/v1/",
                SITE_ID = "0000",                       // Your site ID here
                STATION_MAC = "00:00:00:00:00:00",      // The station's MAC address
                USERNAME = "username",                  // Your username
                PASSWORD = "password";                  // Your password

            // Send the request
            jQuery.support.cors = true;     // enable cross-site scripting

            $.ajax({
                type: "GET",
                url: BASE_URL + "sites/" + SITE_ID + "/stations/" + STATION_MAC + "/",
                beforeSend: function(jqXHR) {
                    jqXHR.setRequestHeader("Authorization", "Basic " + Base64.encode(USERNAME + ":" + PASSWORD));
                },
                success: function(station) {
                    // Output the results
                    if (typeof station === "string") {
                        station = JSON.parse(station);
                    }
                    $("#results").html(
                            "Station: " + station.mac + "<br />" +
                            "loc.lat: " + station.loc.lat + "<br />" +
                            "loc.lng: " + station.loc.lng + "<br />"
                    );
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    alert('Error');
                }
            });
        });

    </script>
</body>
</html>