bluetooth_plugin.dart 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import 'dart:io';
  2. import 'package:flutter/services.dart';
  3. import 'package:logger/logger.dart';
  4. import '../main.dart';
  5. import '../router/my_navigator.dart';
  6. class BluetoothPlugin {
  7. factory BluetoothPlugin() => _instance;
  8. BluetoothPlugin._();
  9. static final BluetoothPlugin _instance = BluetoothPlugin._();
  10. static BluetoothPlugin get instance => _instance;
  11. final String delimiterStr = "_NIMBOT_";
  12. final MethodChannel _channel = const MethodChannel("io.flutter.plugins/bluetooth/methods");
  13. final EventChannel _onReceiveDataStream = const EventChannel('io.flutter.plugins/bluetooth/onDiscoveryDevice');
  14. final EventChannel _onDeviceStateStream = const EventChannel('io.flutter.plugins/bluetooth/onDeviceState');
  15. //是否打开蓝牙
  16. Future<bool> isBleOpen() async {
  17. if (Platform.isIOS) {
  18. return true;
  19. }
  20. return _channel.invokeMethod('isBleOpen').then<bool>((d) => d);
  21. }
  22. //安卓版本是否大于等于31
  23. Future<bool> isSDKIntGreaterOrEqual31() async {
  24. if (Platform.isIOS) {
  25. return true;
  26. }
  27. return _channel.invokeMethod('isSDKIntGreaterOrEqual').then<bool>((d) => d);
  28. }
  29. //开始扫描
  30. Future<int> startBluetoothDiscovery() async {
  31. if (Platform.isIOS) {
  32. return 0;
  33. }
  34. return _channel.invokeMethod('startBluetoothDiscovery').then<int>((d) => d);
  35. }
  36. //开始配对
  37. Future<int> startBluetoothPair(BlueDeviceInfo deviceInfo) async {
  38. if (Platform.isIOS) {
  39. return 0;
  40. }
  41. String deviceInfoStr = deviceInfo.deviceName+delimiterStr+deviceInfo.deviceMac+delimiterStr+deviceInfo.connectState;
  42. return _channel.invokeMethod('startBluetoothPair', deviceInfoStr).then<int>((d) => d);
  43. }
  44. //开始连接
  45. Future<int> startBluetoothConnect(BlueDeviceInfo deviceInfo) async {
  46. if (Platform.isIOS) {
  47. return 0;
  48. }
  49. String deviceInfoStr = deviceInfo.deviceName+delimiterStr+deviceInfo.deviceMac+delimiterStr+deviceInfo.connectState;
  50. return _channel.invokeMethod('startBluetoothConnect', deviceInfoStr).then<int>((d) => d);
  51. }
  52. //断开连接
  53. Future<int> endBluetoothConnect(BlueDeviceInfo deviceInfo) async {
  54. if (Platform.isIOS) {
  55. return 0;
  56. }
  57. String deviceInfoStr = deviceInfo.deviceName+delimiterStr+deviceInfo.deviceMac+delimiterStr+deviceInfo.connectState;
  58. return _channel.invokeMethod('endBluetoothConnect', deviceInfoStr).then<int>((d) => d);
  59. }
  60. //开始打印
  61. Future<int> startBluetoothPrint(BlueDeviceInfo deviceInfo) async {
  62. if (Platform.isIOS) {
  63. return 0;
  64. }
  65. String deviceInfoStr = deviceInfo.deviceName+delimiterStr+deviceInfo.deviceMac+delimiterStr+deviceInfo.connectState;
  66. return _channel.invokeMethod('startBluetoothPrint', deviceInfoStr).then<int>((d) => d);
  67. }
  68. /// 接收数据监听
  69. Stream<BlueDeviceInfo?> get onReceiveDataStream async* {
  70. yield* _onReceiveDataStream
  71. .receiveBroadcastStream()
  72. .map((buffer) {
  73. String str = buffer;
  74. List<String> strList = str.split(delimiterStr);
  75. if(strList.length == 3) {
  76. BlueDeviceInfo deviceInfo = BlueDeviceInfo(deviceName: strList[0], deviceMac: strList[1], connectState: strList[2]);
  77. return deviceInfo;
  78. }
  79. return null;
  80. });
  81. }
  82. /// 接收数据监听
  83. Stream<String?> get onDeviceStateStream async* {
  84. yield* _onDeviceStateStream
  85. .receiveBroadcastStream()
  86. .map((buffer) {
  87. return buffer.toString();
  88. });
  89. }
  90. }
  91. class DeviceState {
  92. static String scanStart = "scanStart";
  93. static String scanEnd = "scanEnd";
  94. static String pairEnd = "pairEnd";
  95. }
  96. class BlueDeviceInfo {
  97. String deviceName;
  98. String deviceMac;
  99. String connectState;
  100. String? _connectStateStr;
  101. BlueDeviceInfo({required this.deviceName, required this.deviceMac, required this.connectState});
  102. String get connectStateStr {
  103. if(connectState == '10') {
  104. _connectStateStr = "未配对";
  105. }
  106. if(connectState == '11') {
  107. _connectStateStr = "配对中";
  108. }
  109. if(connectState == '12') {
  110. _connectStateStr = "已配对";
  111. }
  112. if(connectState == '13') {
  113. _connectStateStr = "断开";
  114. }
  115. return _connectStateStr ?? "未知";
  116. }
  117. void connectSuccess() {
  118. connectState = '13';
  119. }
  120. void disConnectSuccess() {
  121. connectState = '12';
  122. }
  123. @override
  124. String toString() {
  125. return {'deviceName:': deviceName, "mac:": deviceMac, "state:": connectState}.toString();
  126. }
  127. }