btlib 0.1.1 btlib: ^0.1.1 copied to clipboard
A bluetooth driver plugin project, using a easy event-driven way. Support both platforms (iOS and Android).
import 'dart:async';
import 'dart:collection';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:btlib/btlib.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key, this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
static const String TAG = "iTAG";
static const String ALARM_SERV = "1802";
static const String ALARM_CHAR = "2A06";
static const String BATTERY_SERV = "180F";
static const String BATTERY_CHAR = "2A19";
static const String KEY_SERV = "FFE0";
static const String KEY_CHAR = "FFE1";
Btlib driver = Btlib();
StreamSubscription subscription;
String address;
bool scanning = false;
bool connected = false;
int counter = 0;
int battery = 0;
int rssi = 0;
@override
void initState() {
super.initState();
subscription = driver.listen(onEvent);
}
@override
void dispose() {
subscription.cancel();
super.dispose();
}
void onEvent(Object e) {
HashMap<String, Object> map = HashMap.from(e);
print(map);
var event = map["event"];
if (event == BTEvent.BLE_START_SCAN) {
scanning = true;
} else if (event == BTEvent.BLE_STOP_SCAN) {
scanning = false;
} else if (event == BTEvent.BLE_CONNECTED) {
connected = true;
address = map["address"];
driver.setCharacteristicNotification(address, KEY_SERV, KEY_CHAR, true);
driver.readCharacteristic(address, BATTERY_SERV, BATTERY_CHAR);
driver.getRSSI(address);
} else if (event == BTEvent.BLE_DISCONNECTED) {
connected = false;
counter = 0;
battery = 0;
rssi = 0;
} else if (event == BTEvent.BLE_SCAN_RESULT) {
if (map["name"].toString().startsWith(TAG))
{
driver.stopScan();
driver.connect(map["address"]);
}
} else if (event == BTEvent.BLE_DATA_AVAILABLE) {
if (map["characteristic"].toString() == KEY_CHAR) {
counter++;
}
if (map["characteristic"].toString() == BATTERY_CHAR) {
Uint8List data = map["data"];
battery = data[0];
}
} else if (event == BTEvent.BLE_SERVICES_CHARACTERISTICS) {
} else if (event == BTEvent.BLE_RSSI) {
rssi = int.parse(map["rssi"]);
}
setState(() {});
}
_buildActionButtons() {
return <Widget>[
new IconButton(
icon: const Icon(Icons.cancel),
onPressed: () => driver.disconnect(address),
)
];
}
_buildFloatingActionButton() {
return new FloatingActionButton(
child: new Icon(scanning ? Icons.stop : Icons.search),
onPressed: () {
scanning ? driver.stopScan() : driver.startScan();
},
backgroundColor: scanning ? Colors.red : Colors.blue,
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
actions: connected ? _buildActionButtons() : null,
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
scanning ? 'Scanning...' : connected ? '$address Connected' : 'Tap to scan',
),
RaisedButton(
onPressed: () => driver.writeCharacteristic(
address, ALARM_SERV, ALARM_CHAR, Uint8List.fromList([2])),
child: Text("Alarm ON."),
),
RaisedButton(
onPressed: () => driver.writeCharacteristic(
address, ALARM_SERV, ALARM_CHAR, Uint8List.fromList([0])),
child: Text("Alarm OFF"),
),
Text(
'Pushed:$counter\nBattery:$battery\nRSSI:$rssi',
textAlign: TextAlign.left,
),
],
),
),
floatingActionButton: _buildFloatingActionButton(),
);
}
}