用蓝牙连接2个应用程序并传输数据flutter [已关闭]

qxgroojn  于 2022-12-27  发布在  Flutter
关注(0)|答案(2)|浏览(177)

我们不允许问题寻求有关书籍、工具、软件库等的推荐。你可以编辑问题,以便可以使用事实和引用来回答问题。
13小时前关门了。
Improve this question
所以我正在做一个应用程序,我需要从一个应用程序传输数据到另一个应用程序(最好使用蓝牙)。我已经研究了蓝牙插件,但我似乎不明白如何做两个设备之间的连接和传输一些字符串。有人能帮忙吗?我喜欢通过蓝牙的解决方案,但如果没有,请建议其他东西
我需要在Android 7 API 24上开发
我做了一些研究,看起来https://pub.dev/packages/flutter_bluetooth_serial包很适合这个。但是我无法让测试应用程序中的聊天系统工作。有人能帮我吗?

fcipmucu

fcipmucu1#

首先,没有简单的方法。如果你想成功地使用蓝牙协议,你必须至少学习一些蓝牙协议的基础知识。当然,不要浪费时间试图从头开始实现蓝牙。使用软件包,你会在编写代码、阅读文档和调试的同时学到一切。
我用的是Flutter Blue软件包。它适用于其他手机和任何辅助设备。在描述中的例子工作完美。一切都在顶部应该自定义到您的应用程序;因此不需要寻找其它代码段。
使用蓝牙可能会更困难,因为涉及到硬件组件。在这种情况下,调试复杂性呈指数增长。将过程分成更小的部分,你会没事的:扫描、检测、地址读取、连接等。
这是一个扫描可用设备的通用代码片段。如果检测到设备,则显示名称。

class BleScan extends StatefulWidget {
  @override
  _BleScanState createState() => _BleScanState();
}

class _BleScanState extends State<BleScan> {
  BluetoothService service;
  int scanDuration = 10; // seconds

  @override
  void initState() {
    FlutterBlue.instance.startScan(timeout: Duration(seconds: scanDuration));
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Container(
          alignment: Alignment.center,
          child: Text('Search again if not detected'),
        ),
        StreamBuilder<List<ScanResult>>(
          stream: FlutterBlue.instance.scanResults,
          initialData: [],
          builder: (c, snapshot) => Column(
            children: snapshot.data
                .where((t) => t.device.name.contains(serialNumberMap[chosenSerial])) //Filter by name
                .map(
                  (r) => Text(r.device.name),
                )
                .toList(),
          ),
        ),
        Spacer(),
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            StreamBuilder<bool>(
              stream: FlutterBlue.instance.isScanning,
              initialData: false,
              builder: (c, snapshot) {
                if (snapshot.data) {
                  return Container();
                } else {
                  return FloatingActionButton.extended(
                    icon: Icon(Icons.search),
                    label: Text('Search again'),
                    onPressed: () {
                      FlutterBlue.instance.startScan(timeout: Duration(seconds: scanDuration));
                    },
                  );
                }
              },
            ),
          ],
        ),
      ],
    );
  }
}

这个代码片段可以用来连接到设备,读取服务和特性,注意特性是发生数据交换的位置as documented everywhere

widget.device.connect(timeout: const Duration(seconds: 5), autoConnect: false).then((a) {
  widget.device.discoverServices().then((value) {
    value.forEach((service) {
      //services are here
      service.characteristics.forEach((characteristic) {
        //characteristics
      });
    });
  });
});
5lwkijsr

5lwkijsr2#

第一个想法
这取决于您想要提供的数据/体验类型,但在不同设备上的应用程序之间共享数据的最简单解决方案是使用QR码。
您的设备A生成QR码。
设备B扫描来自设备A的QR码并检索数据。
优点:

  • 易于实施
  • 在飞行模式下工作
  • 每部手机都有摄像头
  • 不影响电池

缺点:

  • 需要用户操作
  • 如果您有一个非常大的文件要在手机之间传输,则无法正常工作

第二个想法

如果你需要在两部手机之间无声地传输数据,并且上传/下载可能需要一些时间,你可以像你想的那样使用蓝牙,这个库应该适合你的需要。
https://pub.dev/packages/nearby_connections
流程如下:
1.配对设备
1.建立连接
1.上传数据到目标设备的内存(SD卡或手机的内部存储器)=〉数据将写入文件
1.在目标设备上,侦听特定文件夹上的更改,并检索写入特定文件的数据
优点:

  • 目标设备不需要任何操作
  • 无声
  • 可以处理大文件

缺点:

  • 仅适用于Android手机
  • 更难开发/维护

第三个想法

如果你能使用互联网,你可以中继Firebase实时数据库。
优点:

  • 无需靠近目标设备
  • 快速、易于实施和扩展

缺点:

  • 需要互联网
  • 只能共享"字符串"数据或光编码媒体文件

如果我能想到其他解决方案,我会更新我的答案

相关问题