// flutter bluetooth demo with adafruit bluefruit le ////////////main.dart///////////////////// // add to pubspec.yaml // flutter_blue: 0.7.1+1 // // change android/app/build.gradle // minSdkVersion 19 // // troubleshooting: // on android - turn on bluetooth and location // wait a few seconds make sure device is connected // turn on / off bluetooth briefly // on android under settings - give permission to app for location // check with nrfconnect (from google play) correct device name, serives, and characteristics // // this demo shows how to send and received notification from device // the device tested is adafruit product id: 4062 // //////////////// main.dart ////////////////// import 'package:flutter/material.dart'; import 'dart:async'; import './ble.dart'; import './send_ble.dart'; void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', 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
{ static newReceivedText(String s){ print("received: $s");} BLE ble = BLE(newReceivedText); connectToBLE() async { ble.init(); await new Future.delayed(const Duration(seconds: 5));} @override void initState() { super.initState(); connectToBLE();} @override Widget build(BuildContext ctx) { return Scaffold( body: Container( child: Column( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [SendBLE(),],),),);}} ///////////////// ble.dart //////////////////// import 'package:flutter_blue/flutter_blue.dart'; import 'dart:async'; class BLE { final Function(String) callback; BLE(this.callback); static BluetoothCharacteristic txChar; static BluetoothCharacteristic notifyChar; static String receivedText; static final String baseUuid = "-b5a3-f393-e0a9-e50e24dcca9e"; final String serviceUuid = "6e400001" + baseUuid; final String txCharUuid = "6e400002" + baseUuid; final String notifyCharUuid = "6e400003" + baseUuid; final String deviceName = "Adafruit Bluefruit LE"; FlutterBlue flutterBlue = FlutterBlue.instance; StreamSubscription scanSubScription; BluetoothDevice targetDevice; init(){ scanSubScription = flutterBlue.scan().listen((scanResult) { if (scanResult.device.name == deviceName) { stopScan(); targetDevice = scanResult.device; connectToDevice(); } }, onDone: () => stopScan());} stopScan() { scanSubScription?.cancel(); scanSubScription = null;} connectToDevice() async { if (targetDevice == null) return; await targetDevice.connect(); print("device connectd"); discoverServices();} disconnectFromDevice() { if (targetDevice == null) return; targetDevice.disconnect();} handle(BluetoothCharacteristic notifyChar) async { await notifyChar.setNotifyValue(true); notifyChar.value.listen((data){ if (data.isNotEmpty) callback(String.fromCharCodes(data)); });} discoverServices() async { if (targetDevice == null) return; List services = await targetDevice.discoverServices(); services.forEach((service) { if (service.uuid.toString() == serviceUuid) { service.characteristics.forEach((characteristic) { if (characteristic.uuid.toString() == notifyCharUuid) { notifyChar = characteristic; handle(notifyChar);} if (characteristic.uuid.toString() == txCharUuid) { print("found txchar"); txChar = characteristic;}});}});}} /////////////// send_ble.dart /////////////////// import 'dart:convert' show utf8; import 'package:flutter/material.dart'; import './ble.dart'; class SendBLE extends StatelessWidget { final _writeController = TextEditingController(); @override Widget build(BuildContext context) { return RaisedButton( child: Text('write'), onPressed: () async { await showDialog( context: context, builder: (BuildContext context) { return AlertDialog( title: Text("write"), content: Row( children: [ Expanded(child: TextField( controller: _writeController,),),],), actions: [ FlatButton(child: Text("Send"), onPressed: () { BLE.txChar.write(utf8.encode(_writeController.value.text)); Navigator.pop(context);},), FlatButton(child: Text("Cancel"), onPressed: () { Navigator.pop(context);},),],);});});}}