Native BLE Peripheral in React Native
This is a simulator for a BLE peripheral, to help with testing BLE apps without an actual peripheral BLE device this project is not yet complete, for all ready parts see documentation below. (docs are not complete, feel free to improve them)
- fixed issues fixed on github repo in npm package - starting from version 1.2.0
- IOS support was added in version 2.0.0
- merged PR to fix write charicaristics - version 2.0.1
if you would like to contribute to this project or suggest more future features you're welcome to so via an issue or pull request.
right now this package does not support IOS, so any one that wants to help and contribute the IOS support is more than welcome
npm install react-native-ble-peripheral --save
or
yarn add react-native-ble-peripheral
npm page - https://www.npmjs.com/package/react-native-ble-peripheral
- In
AndroidManifest.xml
add:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
react-native link
or, for react-native >= 0.60:
npx react-native-asset
- In
android/settings.gradle
...
include ':react-native-ble-peripheral'
project(':react-native-ble-peripheral').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-ble-peripheral/android')
- In
android/app/build.gradle
...
dependencies {
/* YOUR DEPENDENCIES HERE */
compile project(':react-native-ble-peripheral') // <--- add this
}
- Register Module (in MainApplication.java)
import com.himelbrand.forwardcalls.RNForwardCallsPackage; // <--- import
public class MainActivity extends ReactActivity {
......
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new RNBLEPackage() // <--- Add this
);
}
......
}
Add the following to yout react-native.config.js
file:
module.exports = {
dependencies: {
// HERE YOUR OTHER DEPENDENCIES
'react-native-ble-peripheral': { // <--- Add this
root: path.join(__dirname, 'node_modules/react-native-ble-peripheral'), // <--- Add this
} // <--- Add this
},
};
import BLEPeripheral from 'react-native-ble-peripheral'
BLEPeripheral.addService(UUID:string, primary:boolean)
BLEPeripheral.addService('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', true) //for primary service
BLEPeripheral.addService('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', false) //for non primary service
BLEPeripheral.addCharacteristicToService(ServiceUUID:string, UUID:string, permissions:number, properties:number)
https://developer.android.com/reference/android/bluetooth/BluetoothGattCharacteristic.html the link above is for permissions and properties constants info
Permissions:
- 1 - Readable
- 2 - Readable Encrypted
- 4 - Readable Encrypted MITM (Man-in-the-middle) Protection
- 16 - Writable
- 32 - Writable Encrypted
- 64 - Writable Encrypted MITM Protection
- 128 - Writable Signed
- 256 - Writable Signed MITM
Properties:
- 1 - Broadcastable
- 2 - Readable
- 4 - Writable without response
- 8 - Writable
- 16 - Supports notification
- 32 - Supports indication
- 64 - Signed Write
- 128 - Extended properties
BLEPeripheral.addCharacteristicToService('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 16 | 1, 8) //this is a Characteristic with read and write permissions and notify property
BLEPeripheral.sendNotificationToDevices(ServiceUUID:string, CharacteristicUUID:string, data:byte[])
- note #1: in js it's not really a byte array, but an array of numbers
- note #2: the CharacteristicUUID must be of a Characteristic with notify property
BLEPeripheral.sendNotificationToDevices('XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', [0x10,0x01,0xA1,0x80]) //sends a notification to all connected devices that, using the char uuid given
note:use this only after adding services and characteristics
BLEPeripheral.start()
.then(res => {
console.log(res)
}).catch(error => {
console.log(error)
})
In case of error, these are the error codes:
- 1 - Failed to start advertising as the advertise data to be broadcasted is larger than 31 bytes.
- 2 - Failed to start advertising because no advertising instance is available.
- 3 - Failed to start advertising as the advertising is already started.
- 4 - Operation failed due to an internal error.
- 5 - This feature is not supported on this platform.
BLEPeripheral.stop()
BLEPeripheral.setName(name:string)
This method sets the name of the device broadcast, before calling start
.
BLEPeripheral.setName('RNBLETEST')
This is an example on how you would handle the write requests:
import { NativeEventEmitter, NativeModules } from 'react-native';
const { RNBLEModule } = NativeModules;
const eventEmitter = new NativeEventEmitter(RNBLEModule);
eventEmitter.addListener('WriteEvent', (map) => {
// Handle the event
console.log('WriteEvent received:', map);
});
// Don't forget to remove the listener when it's no longer needed to avoid memory leaks
// eventEmitter.removeAllListeners('WriteEvent');
All the available events are:
BleStatusChangeEvent
: emitted when BLE status changes;ReadEvent
: emitted when a read request is handled;WriteEvent
: emitted when a write request is handled;NotificationEvent
: emitted when a notification is sent.
NB Events are not working on iOS. Sorry :(
DOCs and project is under development Any help would be welcome... feel free to contact me