summaryrefslogtreecommitdiffstats
path: root/examples/java/HelloTinyB.java
blob: 84656581ac814c4891714113263c2868cefbe916 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import tinyb.*;
import java.util.*;

public class HelloTinyB {
    private static final float SCALE_LSB = 0.03125f;

    static void printDevice(BluetoothDevice device) {
        System.out.print("Address = " + device.getAddress());
        System.out.print("Name = " + device.getName());
        System.out.print("Connected = " + device.getConnected());
        System.out.println("");
    }

    /*
     * After discovery is started, new devices will be detected. We can
     * get a list of all devices through the manager's getDevices
     * method.
     * We can the look through the list of devices to find the device
     * with the MAC which we provided as a parameter.
     * We continue looking until we find it, or we try 15 times (1 minutes).
     */
    static BluetoothDevice getDevice(String address) throws InterruptedException {
        BluetoothManager manager = BluetoothManager.getBluetoothManager();
        BluetoothDevice sensor = null;
        for (int i = 0; i < 15; ++i) {
                List<BluetoothDevice> list = manager.getDevices();

                for (BluetoothDevice device : list) {
                    printDevice(device);
                    /*
                     * Here we check if the address matches.
                     */
                    if (device.getAddress().equals(address))
                        sensor = device;
                }

                if (sensor != null) {
                    return sensor;
                }
                Thread.sleep(4000);
            }
            return null;
    }

    /*
     * Our device should expose a temperature service, which has a UUID
     * we can find out from the data sheet.
     * The service description of the SensorTag can be found here:
     * http://processors.wiki.ti.com/images/a/a8/BLE_SensorTag_GATT_Server.pdf
     * The service we are looking for has the short UUID AA00 which we insert into
     * the TI Base UUID: f000XXXX-0451-4000-b000-000000000000
     */
    static BluetoothGattService getService (BluetoothDevice device, String UUID) throws InterruptedException {
        System.out.println("Services exposed by device:");
        BluetoothGattService tempService = null;
        List<BluetoothGattService> bluetoothServices = null;
        do {
            bluetoothServices = device.getServices();

            for (BluetoothGattService service : bluetoothServices) {
                System.out.println("UUID: " + service.getUuid());
		if (service.getUuid().equals(UUID))
			tempService = service;
            }
            Thread.sleep(4000);
        } while (bluetoothServices != null && bluetoothServices.isEmpty());
        return tempService;
    }

    /*
     * This program connects to a TI SensorTag 2.0 and reads the temperature
     * characteristic exposed by the device over Bluetooth Low Energy.
     * The parameter provided to the program should be the MAC address of
     * the device.
     *
     * A wiki describing the sensor is found here:
     * http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User's_Guide
     *
     * The API used in this example is based on TinyB v0.3, which only supports
     * polling, but v0.4 will introduce a simplied API for discovering devices
     * and services.
     */
    public static void main(String[] args) throws InterruptedException {

        if (args.length < 1) {
            System.err.println("Run with <device_address> argument");
            System.exit(-1);
        }

        /*
         * To start looking of the device, we first must initialize the TinyB
         * library. The way of interacting with the library is through
         * the BluetoothManager. There can be only one BluetoothManager at one
         * time, and the reference to it is obtained through the
         * getBluetoothManager method.
         */
        BluetoothManager manager = BluetoothManager.getBluetoothManager();

        /*
         * The manager will try to initialize a BluetoothAdapter if any adapter
         * is present in the system. To initialize discovery we can call
         * startDiscovery, which will put the default adapter in discovery mode.
         */
        boolean discoveryStarted = manager.startDiscovery();

        System.out.println("The discovery started: " + (discoveryStarted ? "true" : "false"));
        BluetoothDevice sensor = getDevice(args[0]);

        /*
         * After we find the device we can stop looking for other devices.
         */
        manager.stopDiscovery();

        if (sensor == null) {
            System.err.println("No sensor found with the provided address.");
            System.exit(-1);
        }

        System.out.print("Found device: ");
        printDevice(sensor);

        if (sensor.connect())
            System.out.println("Sensor with the provided address connected");
        else {
            System.out.println("Could not connect device.");
            System.exit(-1);
        }

        BluetoothGattService tempService =
            getService(sensor, "f000aa00-0451-4000-b000-000000000000");

        if (tempService == null) {
            /*
             * This device does not have the temperature service we are looking for.
             */
            sensor.disconnect();
            System.exit(-1);
        }

        List<BluetoothGattCharacteristic> temperatureCharacteristics =
            tempService.getCharacteristics();

    }
}