Always On, Always Connected Week 8

Bluetooth Low Energy

Sample Scanning: Using Don Coleman's great BLE Central Cordova Plugin, scanning for peripherals is easy:

Install the plugin in your phonegap project: phonegap -d cordova plugin add com.megster.cordova.ble

and here is a quick example

function onPageLoad() {
	document.addEventListener("deviceready", onDeviceReady, false);
}

function onDeviceReady() {
	ble.scan([], 10, scanSuccess, scanFailure);
}

function scanSuccess(peripheral) {
	console.log(peripheral);
}

function scanFailure(err) {
	console.log(err);
}

window.addEventListener('load', onPageLoad);
			

The TI SensorTag is a great BLE device for experimenting. It's capabilities are detailed online in the SensorTag User Guide.

Here is an example using the above library to read data from the SensorTag's accelerometer:
<!DOCTYPE html>
<html>
    <head>
 <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript">

				var accelerometer = {
					service: "F000AA10-0451-4000-B000-000000000000",
					data: "F000AA11-0451-4000-B000-000000000000", // read/notify 3 bytes X : Y : Z
					configuration: "F000AA12-0451-4000-B000-000000000000", // read/write 1 byte
					period: "F000AA13-0451-4000-B000-000000000000" // read/write 1 byte Period = [Input*10]ms
				};
				
				var peripheralId = null;

                function onPageLoad() {
                        document.addEventListener("deviceready", onDeviceReady, false);
                }

                function onDeviceReady() {
                        ble.scan([], 10, scanSuccess, scanFailure);
                }

                function scanSuccess(peripheral) {
                        //console.log(peripheral);
						//document.body.innerHTML = document.innerHTML + peripheral.name;
							
						if (peripheral.name == "SensorTag") {
							ble.stopScan(stopScanSuccess, stopScanFailure);
							console.log(peripheral);
							console.log("Connecting");
							ble.connect(peripheral.id, connectSuccess, connectFailure);
						}
                }

                function scanFailure(err) {
                        console.log(err);
                }
                
                function stopScanSuccess() {
                		console.log("Stop Scan Success");
                }
                
                function stopScanFailure() {
                		console.log("Stop Scan Failure");
                }
                
                function connectSuccess(peripheral) {
                		console.log("Connected");
                		console.log(peripheral);
                		
                		peripheralId = peripheral.id;
                		//console.log(foundPeripheral);

						// Turn the accelerometer on
						var configData = new Uint8Array(1);
						configData[0] = 0x01;
						ble.write(peripheral.id, accelerometer.service, accelerometer.configuration, configData.buffer, 
						function() { console.log("Started accelerometer."); },function() { console.log("Start accelerometer error");});

						// Do a read
						//ble.read(peripheral.id, accelerometer.service, accelerometer.data, readSuccess, readFailure);

						// We want to be notified
						ble.startNotification(peripheral.id, accelerometer.service, accelerometer.data, notifySuccess, notifyError);

                }
                
                function connectFailure() {
                		console.log("Connection Failed");
                }
                
                
                function readSuccess(data) {
					console.log(data)
	                var a = new Uint8Array(data);

    			    var message = "X: " + a[0]/64 + "<br/>" +
                			  "Y: " + a[1]/64 + "<br/>" +
			                  "Z: " + a[2]/64 * -1;

			        document.body.innerHTML = message;
			        
			        setTimeout(readAccel, 1000);
			    }
			    
			    function readAccel() {
					ble.read(peripheralId, accelerometer.service, accelerometer.data, readSuccess, readFailure);			    
			    }
                
                function readFailure(err) {
                	console.log(err);
                }
                
                function notifySuccess(data) {
                	console.log(data)
	                var a = new Uint8Array(data);

    			    var message = "X: " + a[0]/64 + "<br/>" +
                			  "Y: " + a[1]/64 + "<br/>" +
			                  "Z: " + a[2]/64 * -1;

			        document.body.innerHTML = message;
				}
				
				function notifyError(err) {
					console.log(err);
				}
        </script>

    </head>
    <body onload="onPageLoad()">
    </body>
</html>