flutter_bluetooth.dart 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. MethodChannel _channel = MethodChannel('flutter_bluetooth');
  12. PublishSubject _stopScanPill = new PublishSubject();
  13. List<BluetoothDevice> _scanDevices = [];
  14. FlutterBluetooth._();
  15. static FlutterBluetooth _instance = new FlutterBluetooth._();
  16. static FlutterBluetooth get instance => _instance;
  17. Future<bool> get isEnabled async {
  18. final bool version = await _channel.invokeMethod('isEnabled');
  19. return version;
  20. }
  21. enabled() async {
  22. await _channel.invokeMethod('enabled');
  23. }
  24. Stream<List<BluetoothDevice>> startScan({List<int>? filterClasses}) async* {
  25. bool isSuccess = await _channel.invokeMethod('startScan');
  26. if(!isSuccess){
  27. throw ErrorDescription('启动扫描失败');
  28. }
  29. _scanDevices = [];
  30. yield* EventChannel('flutter_bluetooth/scanEvents')
  31. .receiveBroadcastStream()
  32. .takeUntil(_stopScanPill)
  33. .map((item) {
  34. if (item['isCompleted']) {
  35. _stopScanPill.add(null);
  36. } else {
  37. var device = BluetoothDevice.fromJson(item["data"]);
  38. if (!_scanDevices.contains(device)) {
  39. if (filterClasses == null || _filterClass(device, filterClasses)) {
  40. _scanDevices.add(device);
  41. }
  42. }
  43. }
  44. return _scanDevices;
  45. });
  46. }
  47. stopScan() async {
  48. bool isSuccess = await _channel.invokeMethod('stopScan');
  49. if(!isSuccess){
  50. throw ErrorDescription('暂停扫描失败');
  51. }
  52. _stopScanPill.add(null);
  53. }
  54. bool _filterClass(BluetoothDevice device, List<int> filterClasses) {
  55. return filterClasses.indexOf(device.deviceClass ?? -1) >= 0;
  56. }
  57. }