Bluetooth Serial Plugin for PhoneGap
This plugin enables serial communication over Bluetooth. It was written for communicating between Android or iOS and an Arduino.
Android uses Classic Bluetooth. iOS uses Bluetooth Low Energy.
Supported Platforms
- Android
- iOS with BLEMini or BLEShield v1 or v2
Limitations
- The phone must initiate the Bluetooth connection
- Data sent over the connection is assumed to be Strings
- iOS Bluetooth Low Energy requires iPhone 4S, iPhone5, iPod 5, or iPad3+
Installing
Install with Cordova cli
$ cordova plugin add https://github.com/don/BluetoothSerial.git
This plugin is also available for PhoneGap Build
Examples
There are some sample projects included with the plugin.
API
Methods
- bluetoothSerial.connect
- bluetoothSerial.connectInsecure
- bluetoothSerial.disconnect
- bluetoothSerial.write
- bluetoothSerial.available
- bluetoothSerial.read
- bluetoothSerial.readUntil
- bluetoothSerial.subscribe
- bluetoothSerial.unsubscribe
- bluetoothSerial.clear
- bluetoothSerial.list
- bluetoothSerial.isEnabled
- bluetoothSerial.isConnected
- bluetoothSerial.readRSSI
connect
Connect to a Bluetooth device.
bluetoothSerial.connect(macAddress_or_uuid, connectSuccess, connectFailure);
Description
Function connect
connects to a Bluetooth device. The callback is long running. Success will be called when the connection is successful. Failure is called if the connection fails, or later if the connection disconnects. An error message is passed to the failure callback.
Android
For Android, connect
takes a macAddress of the remote device.
iOS
For iOS, connect
takes the UUID of the remote device. Optionally, you can pass an empty string and the plugin will connect to the first BLE peripheral.
Parameters
- macAddress_or_uuid: Identifier of the remote device.
- connectSuccess: Success callback function that is invoked when the connection is successful.
- connectFailure: Error callback function, invoked when error occurs or the connection disconnects.
connectInsecure
Connect insecurely to a Bluetooth device.
bluetoothSerial.connectInsecure(macAddress, connectSuccess, connectFailure);
Description
Function connectInsecure
works like connect, but creates an insecure connection to a Bluetooth device. See the Android docs for more information.
Android
For Android, connectInsecure
takes a macAddress of the remote device.
iOS
connectInsecure
is not supported on iOS.
Parameters
- macAddress: Identifier of the remote device.
- connectSuccess: Success callback function that is invoked when the connection is successful.
- connectFailure: Error callback function, invoked when error occurs or the connection disconnects.
disconnect
Disconnect.
bluetoothSerial.disconnect([success], [failure]);
Description
Function disconnect
disconnects the current connection.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
write
Writes data to the serial port.
bluetoothSerial.write(data, success, failure);
Description
Function write
data to the serial port. Data must be a String.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
available
Gets the number of bytes of data available.
bluetoothSerial.available(success, failure);
Description
Function available
gets the number of bytes of data available. The bytes are passed as a parameter to the success callback.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.available(function (numBytes) {
console.log("There are " + numBytes + " available to read.");
}, failure);
read
Reads data from the buffer.
bluetoothSerial.read(success, failure);
Description
Function read
reads the data from the buffer. The data is passed to the success callback as a String. Calling read
when no data is available will pass an empty String to the callback.
Parameters
- success: Success callback function that is invoked with the number of bytes available to be read.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.read(function (data) {
console.log(data);
}, failure);
readUntil
Reads data from the buffer until it reaches a delimiter.
bluetoothSerial.readUntil('\n', success, failure);
Description
Function readUntil
reads the data from the buffer until it reaches a delimiter. The data is passed to the success callback as a String. If the buffer does not contain the delimiter, an empty String is passed to the callback. Calling read
when no data is available will pass an empty String to the callback.
Parameters
- delimiter: delimiter
- success: Success callback function that is invoked with the data.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.readUntil('\n', function (data) {
console.log(data);
}, failure);
subscribe
Subscribe to be notified when data is received.
bluetoothSerial.subscribe('\n', success, failure);
Description
Function subscribe
registers a callback that is called when data is received. A delimiter must be specified. The callback is called with the data as soon as the delimiter string is read. The callback is a long running callback and will exist until unsubscribe
is called.
Parameters
- delimiter: delimiter
- success: Success callback function that is invoked with the data.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
// the success callback is called whenever data is received
bluetoothSerial.subscribe('\n', function (data) {
console.log(data);
}, failure);
unsubscribe
Unsubscribe from a subscription.
bluetoothSerial.unsubscribe(success, failure);
Description
Function unsubscribe
removes any notification added by subscribe
and kills the callback.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.unsubscribe();
clear
Clears data in the buffer.
bluetoothSerial.clear(success, failure);
Description
Function clear
removes any data from the receive buffer.
Parameters
- success: Success callback function that is invoked when the connection is successful. [optional]
- failure: Error callback function, invoked when error occurs. [optional]
list
Lists bonded devices
bluetoothSerial.list(success, failure);
Description
Android
Function list
lists the paired Bluetooth devices. The success callback is called with a list of objects.
Example list passed to success callback. See BluetoothDevice and BluetoothClass#getDeviceClass.
[{
"class": 276,
"address": "10:BF:48:CB:00:00",
"name": "Nexus 7"
}, {
"class": 7936,
"address": "00:06:66:4D:00:00",
"name": "RN42"
}]
iOS
Function list
lists the discovered Bluetooth Low Energy peripheral. The success callback is called with a list of objects.
Example list passed to success callback for iOS.
[{
"uuid": "CC410A23-2865-F03E-FC6A-4C17E858E11E",
"name": "Biscuit",
"rssi": -68
}]
The advertised RSSI may be included if available.
Parameters
- success: Success callback function that is invoked with a list of bonded devices.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.list(function(devices) {
devices.forEach(function(device) {
console.log(device.address);
})
}, failure);
isConnected
Reports the connection status.
bluetoothSerial.isConnected(success, failure);
Description
Function isConnected
calls the success callback when connected to a peer and the failure callback when not connected.
Parameters
- success: Success callback function, invoked when device connected.
- failure: Error callback function, invoked when device is NOT connected.
Quick Example
bluetoothSerial.isConnected(
function() {
console.log("Bluetooth is connected");
},
function() {
console.log("Bluetooth is *not* connected");
}
);
isEnabled
Reports if bluetooth is enabled.
bluetoothSerial.isEnabled(success, failure);
Description
Function isEnabled
calls the success callback when bluetooth is enabled and the failure callback when bluetooth is not enabled.
Parameters
- success: Success callback function, invoked when Bluetooth is enabled.
- failure: Error callback function, invoked when Bluetooth is NOT enabled.
Quick Example
bluetoothSerial.isEnabled(
function() {
console.log("Bluetooth is enabled");
},
function() {
console.log("Bluetooth is *not* enabled");
}
);
readRSSI
Reads the RSSI from the connected peripheral.
bluetoothSerial.readRSSI(success, failure);
Description
Function readRSSI
calls the success callback with the rssi.
BLE only This function is experimental and the API may change
Parameters
- success: Success callback function that is invoked with the rssi value.
- failure: Error callback function, invoked when error occurs. [optional]
Quick Example
bluetoothSerial.readRSSI(
function(rssi) {
console.log(rssi);
}
);
Misc
Where does this work?
Android
Current development is done with Cordova 3.4 on Android 4.x. Theoretically this code runs on PhoneGap 2.9 and greater. It should support Android-10 (2.3.2) and greater, but I only test with Android 4.x.
Development Devices include
- Nexus 5 with Android 4.4
- Samsung Galaxy Tab 10.1 (GT-P7510) with Android 4.0.4 (see Issue #8)
- Google Nexus S with Android 4.1.2
- Nexus 4 with Android 4.2.2
- Samsung Galaxy S4 with Android 4.3
On the Arduino side I test with Sparkfun Mate Silver and the Seeed Studio Bluetooth Shield. The code should be generic and work with most hardware.
I highly recommend Adafruit's Bluefruit EZ-Link.
iOS
NOTE: Currently iOS only works with RedBear Labs BLE Mini & BLE Shield Hardware
This plugin is developed with Cordova 3.4 using iOS 7.x on an iPhone 5s connecting to a RedBearLab BLEMini.
Ensure that you have update the BLE Mini firmware to at least Biscuit-UART_20130313.bin.
Props
Android
Most of the Bluetooth implementation was borrowed from the Bluetooth Chat example in the Android SDK.
iOS
The iOS code uses RedBearLab's BLE_Framework.
API
The API for available, read, readUntil was influenced by the BtSerial Library for Processing for Arduino
Wrong Bluetooth Plugin?
If you don't need serial over Bluetooth, try the PhoneGap Bluetooth Plugin for Android or perhaps phonegap-plugin-bluetooth
What format should the Mac Address be in?
An example a properly formatted mac address is AA:BB:CC:DD:EE:FF
Feedback
Try the code. If you find an problem or missing feature, file an issue or create a pull request.