flutter_bluetooth.dart 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. library flutter_bluetooth;
  2. import 'dart:async';
  3. import 'dart:ffi';
  4. import 'dart:typed_data';
  5. import 'package:flutter/cupertino.dart';
  6. import 'package:flutter/services.dart';
  7. import 'package:rxdart/rxdart.dart';
  8. part 'bluetooth_device.dart';
  9. part 'bluetooth_socket.dart';
  10. class FlutterBluetooth {
  11. static const MethodChannel _channel =
  12. const MethodChannel('flutter_bluetooth');
  13. PublishSubject _stopScanPill = new PublishSubject();
  14. List<BluetoothDevice> _scanDevices;
  15. FlutterBluetooth._();
  16. static FlutterBluetooth _instance = new FlutterBluetooth._();
  17. static FlutterBluetooth get instance => _instance;
  18. Future<bool> get isEnabled async {
  19. final bool version = await _channel.invokeMethod('isEnabled');
  20. return version;
  21. }
  22. enabled() async {
  23. await _channel.invokeMethod('enabled');
  24. }
  25. Stream<List<BluetoothDevice>> startScan({List<int> filterClasses}) async* {
  26. await _channel.invokeMethod('startScan');
  27. _scanDevices = [];
  28. yield* EventChannel('flutter_bluetooth/scanEvents')
  29. .receiveBroadcastStream()
  30. .takeUntil(_stopScanPill)
  31. .map((item) {
  32. if (item['isCompleted']) {
  33. _stopScanPill.add(null);
  34. } else {
  35. var device = BluetoothDevice.fromJson(item["data"]);
  36. if (!_scanDevices.contains(device)) {
  37. if (filterClasses == null || _filterClass(device, filterClasses)) {
  38. _scanDevices.add(device);
  39. }
  40. }
  41. }
  42. return _scanDevices;
  43. });
  44. }
  45. stopScan() async {
  46. await _channel.invokeMethod('stopScan');
  47. _stopScanPill.add(null);
  48. }
  49. bool _filterClass(BluetoothDevice device, List<int> filterClasses) {
  50. return filterClasses.indexOf(device.deviceClass) >= 0;
  51. }
  52. }