有没有一种方法可以实现像信标一样的蓝牙广播?

时间:2020-05-21 08:38:21

标签: android flutter bluetooth android-bluetooth beacon

我想知道如何为Flutter应用程序实现某种“蓝牙广播”(使用低功耗蓝牙)。 我特别希望达到以下几点:

  • 我想使用蓝牙“在空中”发送随机字符串和整数。
  • 我还希望能够通过其他设备接收那些数据
  • 该应用程序必须能够同时发送和接收

现在,我检查了pub.dev中的一些信标库(例如thisthis),但事实证明,我可能不了解这些库是否以及如何帮助我。

例如,让我们考虑 beacon_broadcast 库:

建议的创建信标的代码如下:

beaconBroadcast
  .setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
  .setMajorId(1)
  .setMinorId(100)
  .setTransmissionPower(-59) //optional
  .setIdentifier('com.example.myDeviceRegion') //iOS-only, optional
  .setLayout('s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-21v') //Android-only, optional
  .setManufacturerId(0x001D) //Android-only, optional
  .start();

但是我有点困惑。我想了解如何发送自定义数据(一个简单的字符串和一个更简单的整数)。 在接收方,我想获得具有特定布局的所有信标,而不仅仅是与特定UUID匹配的信标。

here可以找到与我想要实现的目标类似的东西,但它是由kotlin制造的。如果您认为这与我需要的东西最接近,请建议我如何在flutter项目中使用本机代码。

非常感谢您。

编辑1:我们现在需要找到两个Flutter库,以便同时发送和接收带有AltBeacon布局的各种信标。这并非微不足道,因为事实证明其他开发人员奇怪地实现了通信的一侧,而不是两者。而且,很难找到带有“包含电池”的库(即可以开箱即用地互相交谈)。

编辑2:最新消息!我结合了两个flutter库,特别是 flutter_beacon beacon_broadcast 。现在,请帮助我解决以下问题:我可以收到信标,开始做广告,但不能同时进行。

我不知道我的错误是什么,让我们在这里看看:

我用来扫描信标的代码如下:

  Future<void> beacon() async {

  await flutterBeacon.initializeScanning;

  final regions = <Region>[];

// Android platform, it can ranging out of beacon that filter all of Proximity UUID
  regions.add(Region(identifier: 'unito'));

      // to start monitoring beacons
  var _streamRanging = flutterBeacon.ranging(regions).listen((RangingResult result) {
    // result contains a region, event type and event state
     print(result);
     print(result.toJson);
     print(result.beacons.toString());
  });
}

以下内容显示在调试控制台中:

When i turn on scanning

但是,不幸的是,如果我还激活BLE广告,则什么也不会发生:

When i turn on advertising

那么,有什么建议吗?当我分别使用一种设备进行扫描而另一种用于广告时,它可以工作...

2 个答案:

答案 0 :(得分:2)

发送自定义数据是编码问题。信标标识符只是对蓝牙数据包中一系列字节的解释。您可以根据需要安全地重新解释这些字节,重新使用所需的任何信标格式。

例如,在您的问题中,您具有以下标识符:

39ED98FF-2900-441A-802F-9C398FC199D2

为什么不将其重新解释为一系列16位整数?

39ED, 98FF, 2900, 441A, 802F, 9C39, 8FC1, 99D2

您还可以将字符串编码为字节流。例如,Eddystone-URL是一种将URL编码到Bluetooth字节数组中的格式。

我写了您所引用的博客文章,通常都可以在Swift或Kotlin上完成所有工作,但是如果找到可以发送和接收BLE广告包的模块,就没有理由不能使用Flutter做到这一点。这些可以是原始广告,也可以是信标格式,例如您可以重新解释的AltBeacon或Eddystone。

问题中的示例显示了信标布局。这是一个简短的表达式,显示了如何将字节序列解释为特定长度的标识符数组。最初编写Android Beacon库时,我创建了beacon layout expressions的概念。这些简短的字符串使您可以简洁地定义如何对信标数据包中的字节进行编码和解码。

如果您可以找到用于flutter的软件包,从而可以在发送和接收端基于这些表达式来设置布局,那么您的工作就快完成了。否则,您只需要手动重新编码即可。

答案 1 :(得分:1)

实际上,您应该将其与以下软件包一起使用: https://pub.dev/packages/flutter_blue

从另一个应用程序项目中,我知道这是高度可定制的。

设置通知并收听更改#

await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
    // do something with new value
});

我提供的链接中的完整文档。您可以读写,连接服务并收听所需的各种通知。