Skip to content

Instantly share code, notes, and snippets.

@ecdundar
Created March 1, 2019 12:32
Show Gist options
  • Save ecdundar/587343f4cb2b8b70ce9ff0ce7af46114 to your computer and use it in GitHub Desktop.
Save ecdundar/587343f4cb2b8b70ce9ff0ce7af46114 to your computer and use it in GitHub Desktop.
import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View,
TouchableHighlight,
NativeAppEventEmitter,
NativeEventEmitter,
NativeModules,
Platform,
PermissionsAndroid,
ListView,
ScrollView,
AppState,
Dimensions,
} from 'react-native';
import BleManager from 'react-native-ble-manager';
const window = Dimensions.get('window');
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
const BleManagerModule = NativeModules.BleManager;
const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);
export default class App extends Component {
constructor(){
super()
this.state = {
scanning:false,
peripherals: new Map(),
appState: ''
}
this.handleDiscoverPeripheral = this.handleDiscoverPeripheral.bind(this);
this.handleStopScan = this.handleStopScan.bind(this);
this.handleUpdateValueForCharacteristic = this.handleUpdateValueForCharacteristic.bind(this);
this.handleDisconnectedPeripheral = this.handleDisconnectedPeripheral.bind(this);
this.handleAppStateChange = this.handleAppStateChange.bind(this);
}
componentDidMount() {
AppState.addEventListener('change', this.handleAppStateChange);
BleManager.start({showAlert: false});
this.handlerDiscover = bleManagerEmitter.addListener('BleManagerDiscoverPeripheral', this.handleDiscoverPeripheral );
this.handlerStop = bleManagerEmitter.addListener('BleManagerStopScan', this.handleStopScan );
this.handlerDisconnect = bleManagerEmitter.addListener('BleManagerDisconnectPeripheral', this.handleDisconnectedPeripheral );
this.handlerUpdate = bleManagerEmitter.addListener('BleManagerDidUpdateValueForCharacteristic', this.handleUpdateValueForCharacteristic );
if (Platform.OS === 'android' && Platform.Version >= 23) {
PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION).then((result) => {
if (result) {
console.log("Permission is OK");
} else {
PermissionsAndroid.requestPermission(PermissionsAndroid.PERMISSIONS.ACCESS_COARSE_LOCATION).then((result) => {
if (result) {
console.log("User accept");
} else {
console.log("User refuse");
}
});
}
});
}
}
handleAppStateChange(nextAppState) {
if (this.state.appState.match(/inactive|background/) && nextAppState === 'active') {
console.log('App has come to the foreground!')
BleManager.getConnectedPeripherals([]).then((peripheralsArray) => {
console.log('Connected peripherals: ' + peripheralsArray.length);
});
}
this.setState({appState: nextAppState});
}
componentWillUnmount() {
this.handlerDiscover.remove();
this.handlerStop.remove();
this.handlerDisconnect.remove();
this.handlerUpdate.remove();
}
handleDisconnectedPeripheral(data) {
let peripherals = this.state.peripherals;
let peripheral = peripherals.get(data.peripheral);
if (peripheral) {
peripheral.connected = false;
peripherals.set(peripheral.id, peripheral);
this.setState({peripherals});
}
console.log('Disconnected from ' + data.peripheral);
}
handleUpdateValueForCharacteristic(data) {
console.log('Received data from ' + data.peripheral + ' characteristic ' + data.characteristic, data.value);
}
handleStopScan() {
console.log('Scan is stopped');
this.setState({ scanning: false });
}
startScan() {
if (!this.state.scanning) {
this.setState({peripherals: new Map()});
BleManager.scan([], 3, true).then((results) => {
console.log('Scanning...');
this.setState({scanning:true});
});
}
}
retrieveConnected(){
BleManager.getConnectedPeripherals([]).then((results) => {
if (results.length == 0) {
console.log('No connected peripherals')
}
console.log(results);
var peripherals = this.state.peripherals;
for (var i = 0; i < results.length; i++) {
var peripheral = results[i];
peripheral.connected = true;
peripherals.set(peripheral.id, peripheral);
this.setState({ peripherals });
}
});
}
handleDiscoverPeripheral(peripheral){
var peripherals = this.state.peripherals;
if (!peripherals.has(peripheral.id)){
console.log('Got ble peripheral', peripheral);
peripherals.set(peripheral.id, peripheral);
this.setState({ peripherals })
}
}
test(peripheral) {
if (peripheral){
if (peripheral.connected){
BleManager.disconnect(peripheral.id);
}else{
BleManager.connect(peripheral.id).then(() => {
let peripherals = this.state.peripherals;
let p = peripherals.get(peripheral.id);
if (p) {
p.connected = true;
peripherals.set(peripheral.id, p);
this.setState({peripherals});
}
console.log('Connected to ' + peripheral.id);
setTimeout(() => {
/* Test read current RSSI value
BleManager.retrieveServices(peripheral.id).then((peripheralData) => {
console.log('Retrieved peripheral services', peripheralData);
BleManager.readRSSI(peripheral.id).then((rssi) => {
console.log('Retrieved actual RSSI value', rssi);
});
});*/
// Test using bleno's pizza example
// https://github.com/sandeepmistry/bleno/tree/master/examples/pizza
BleManager.retrieveServices(peripheral.id).then((peripheralInfo) => {
console.log(peripheralInfo);
var service = '13333333-3333-3333-3333-333333333337';
var bakeCharacteristic = '13333333-3333-3333-3333-333333330003';
var crustCharacteristic = '13333333-3333-3333-3333-333333330001';
setTimeout(() => {
BleManager.startNotification(peripheral.id, service, bakeCharacteristic).then(() => {
console.log('Started notification on ' + peripheral.id);
setTimeout(() => {
BleManager.write(peripheral.id, service, crustCharacteristic, [0]).then(() => {
console.log('Writed NORMAL crust');
BleManager.write(peripheral.id, service, bakeCharacteristic, [1,95]).then(() => {
console.log('Writed 351 temperature, the pizza should be BAKED');
/*
var PizzaBakeResult = {
HALF_BAKED: 0,
BAKED: 1,
CRISPY: 2,
BURNT: 3,
ON_FIRE: 4
};*/
});
});
}, 500);
}).catch((error) => {
console.log('Notification error', error);
});
}, 200);
});
}, 900);
}).catch((error) => {
console.log('Connection error', error);
});
}
}
}
render() {
const list = Array.from(this.state.peripherals.values());
const dataSource = ds.cloneWithRows(list);
return (
<View style={styles.container}>
<TouchableHighlight style={{marginTop: 40,margin: 20, padding:20, backgroundColor:'#ccc'}} onPress={() => this.startScan() }>
<Text>Scan Bluetooth ({this.state.scanning ? 'on' : 'off'})</Text>
</TouchableHighlight>
<TouchableHighlight style={{marginTop: 0,margin: 20, padding:20, backgroundColor:'#ccc'}} onPress={() => this.retrieveConnected() }>
<Text>Retrieve connected peripherals</Text>
</TouchableHighlight>
<ScrollView style={styles.scroll}>
{(list.length == 0) &&
<View style={{flex:1, margin: 20}}>
<Text style={{textAlign: 'center'}}>No peripherals</Text>
</View>
}
<ListView
enableEmptySections={true}
dataSource={dataSource}
renderRow={(item) => {
const color = item.connected ? 'green' : '#fff';
return (
<TouchableHighlight onPress={() => this.test(item) }>
<View style={[styles.row, {backgroundColor: color}]}>
<Text style={{fontSize: 12, textAlign: 'center', color: '#333333', padding: 10}}>{item.name}</Text>
<Text style={{fontSize: 8, textAlign: 'center', color: '#333333', padding: 10}}>{item.id}</Text>
</View>
</TouchableHighlight>
);
}}
/>
</ScrollView>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#FFF',
width: window.width,
height: window.height
},
scroll: {
flex: 1,
backgroundColor: '#f0f0f0',
margin: 10,
},
row: {
margin: 10
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment