当前位置:   article > 正文

flutter 实现自动连接蓝牙_flutter 蓝牙连接

flutter 蓝牙连接

首先介绍一款github上的插件 flutter_blue_elves

源码简单易懂基本都是中文注释

github地址 github.com/pineappleoO…

使用方式

使用方式与一般的flutter插件一样,引用依赖后在要用的地方导包即可

  1. import 'package:flutter_blue_elves/flutter_blue_elves.dart';
  2. 复制代码

蓝牙权限

使用蓝牙时需要打开GPS以及蓝牙功能,这里插件给了定位的权限以及蓝牙权限,定位功能以及蓝牙功能的使用。 下列代码给上了权限的中文注释

  1. FlutterBlueElves.instance.androidCheckBlueLackWhat().then((values) {
  2. if (values.toString() == '[]') {
  3. concact(); // 这里判断是否连接上蓝牙
  4. } else {
  5. if (values.contains(AndroidBluetoothLack.bluetoothPermission)) {
  6. print("没有授予蓝牙权限");
  7. FlutterBlueElves.instance.androidApplyBluetoothPermission((isOk) {
  8. print(isOk ? "用户同意开启蓝牙权限" : "用户不同意开启蓝牙权限");
  9. });
  10. }
  11. if (values.contains(AndroidBluetoothLack.locationPermission)) {
  12. print("没有授予定位权限");
  13. FlutterBlueElves.instance.androidApplyLocationPermission((isOk) {
  14. print(isOk ? "用户同意授予位置权限" : "用户不同意授予位置权限");
  15. });
  16. }
  17. if (values.contains(AndroidBluetoothLack.locationFunction)) {
  18. print("没有开启定位功能");
  19. FlutterBlueElves.instance.androidOpenLocationService((isOk) {
  20. print(isOk ? "用户同意开启定位功能" : "用户不同意开启定位功能");
  21. });
  22. }
  23. if (values.contains(AndroidBluetoothLack.bluetoothFunction)) {
  24. print("没有开启蓝牙功能");
  25. FlutterBlueElves.instance.androidOpenBluetoothService((isOk) {
  26. if (isOk) {
  27. print('开启蓝牙了');
  28. concact(); // 连接的方法
  29. }
  30. });
  31. }
  32. }
  33. });
  34. 复制代码

权限开启后如何实现连接呢

首先来看一下我们扫描到的数据类型吧 这里我们所要的是ID以及RSSI以及name

  1. class ScanResult {
  2. ///设备Id
  3. late final String _id;
  4. ///设备名称
  5. late final String? _name;
  6. ///设备localName
  7. late final String? _localName;
  8. ///mac地址,ios没有返回
  9. late final String? _macAddress;
  10. ///蓝牙信号强度
  11. late final int _rssi;
  12. ///设备uuid
  13. late final List _uuids;
  14. ///厂商自定义数据
  15. late final Map? _manufacturerSpecificData;
  16. ///原始广播包数据
  17. late final Uint8List? _row;
  18. ScanResult._(this._id, this._name, this._localName, this._macAddress,
  19. this._rssi, this._uuids, this._manufacturerSpecificData, this._row);
  20. Uint8List? get row => _row;
  21. String? get localName => _localName;
  22. Map? get manufacturerSpecificData => _manufacturerSpecificData;
  23. List get uuids => _uuids;
  24. int get rssi => _rssi;
  25. String? get macAddress => _macAddress;
  26. String? get name => _name;
  27. String get id => _id;
  28. 复制代码

实现自动连接以及读取数据 通过vue传过来的Global.UUID,匹配到相同的ID开始连接,连接后通过stateStream.listen监听到连接的状态,连接成功后停止扫描,通过serviceDiscoveryStream.listen事件监听到serviceUuid,通过vue传过来的接收数据的服务ID以及特征值,来判断接收的服务ID以及特征值。这样就可以实现自动连接以及监听蓝牙的数据,具体看一下代码,已打好中文注释

  1. // startcan
  2. FlutterBlueElves.instance.startScan(100000).listen((scanItem) {
  3. eventBus.fire(MYStaus('连接中'));
  4. print(scanItem.id); // scanItem
  5. if (Global.UUID == scanItem.id) {
  6. Device device = scanItem.connect(connectTimeout: 100000);
  7. device.stateStream.listen((newState) {
  8. // 状态
  9. if (newState == DeviceState.disconnected) {
  10. eventBus.fire(MYStaus('连接失败'));
  11. device.destroy();
  12. concact();
  13. } else if (newState == DeviceState.connectTimeout) {
  14. eventBus.fire(MYStaus('连接超时'));
  15. device.destroy();
  16. concact();
  17. } else if (newState == DeviceState.connected) {
  18. FlutterBlueElves.instance.stopScan();
  19. device.serviceDiscoveryStream.listen((serviceItem) {
  20. if (serviceItem.serviceUuid == Global.SERVERID) {
  21. device.setNotify(serviceItem.serviceUuid, Global.CHARTIDS, true);
  22. }
  23. });
  24. device.discoveryService();
  25. device.deviceSignalResultStream.listen((result) {
  26. eventBus.fire(MYStaus('已连接'));
  27. eventBus.fire(ScanEvent(result.data.toString()));
  28. });
  29. } else if (newState == DeviceState.initiativeDisConnected) {
  30. print('------------------手动');
  31. } else {
  32. print('断开连接了');
  33. }
  34. }).onDone(() {
  35. eventBus.fire(MYStaus('连接发生错误'));
  36. device.destroy();
  37. blequanxian();
  38. });
  39. } else {
  40. eventBus.fire(MYStaus('扫描匹配设备中'));
  41. var _counter = 0;
  42. Timer timer = Timer.periodic(const Duration(seconds: 60), (timer) {
  43. _counter++;
  44. blequanxian();
  45. if (_counter == 5) {
  46. timer.cancel();
  47. print("执行5次之后停止定时器");
  48. }
  49. });
  50. }
  51. });
  52. 复制代码

自动连接以及实时读取数据就已经完成了,拓展自动重连这里就不需要贴代码了,有问题的可以私聊,有其他开发思路可以在评论区指出,接下来会更新wifi

作者:前端七武海
链接:https://juejin.cn/post/7119447974005964836
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/867765
推荐阅读
相关标签
  

闽ICP备14008679号