Android 有没有一种方法可以实现类似于信标的蓝牙广播?

Android 有没有一种方法可以实现类似于信标的蓝牙广播?,android,flutter,bluetooth,android-bluetooth,beacon,Android,Flutter,Bluetooth,Android Bluetooth,Beacon,我想知道如何实现一种蓝牙广播使用蓝牙低能量的颤振应用。 我特别希望实现以下几点: 我想用蓝牙在空中发送随机字符串和整数。 我还希望能够通过其他设备接收这些数据 应用程序必须能够同时发送和接收 现在,我检查了pub.dev中的一些beacon库,比如or,但结果可能是我不明白这些库是否以及如何帮助我 例如,让我们考虑Beason广播库: 制作信标的建议代码如下所示: beaconBroadcast .setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')

我想知道如何实现一种蓝牙广播使用蓝牙低能量的颤振应用。 我特别希望实现以下几点:

我想用蓝牙在空中发送随机字符串和整数。 我还希望能够通过其他设备接收这些数据 应用程序必须能够同时发送和接收 现在,我检查了pub.dev中的一些beacon库,比如or,但结果可能是我不明白这些库是否以及如何帮助我

例如,让我们考虑Beason广播库:

制作信标的建议代码如下所示:

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();
  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());
  });
}
但是我有点困惑。我想了解如何发送自定义数据一个简单的字符串和一个简单的整数。 在接收器端,我希望获得具有特定布局的所有信标,而不仅仅是匹配特定UUID的信标

类似于我想要实现的东西可以找到,但它是在科特林制造的。如果你认为这是我需要的最接近的东西,请告诉我如何在我的颤动项目中使用本机代码。 多谢各位

编辑1:我们现在需要找到两个颤振库,以便同时发送和接收具有AltBeacon布局的所有类型的信标。这不是小事,因为事实证明,其他开发人员奇怪地实现了通信的一方,而不是两者。此外,很难找到包含电池的库,也就是说,可以在开箱即用的情况下相互交谈

编辑2:突发新闻!我合并了两个颤振库,特别是颤振信标和信标广播。现在,请帮我解决以下问题:我可以接收灯塔,开始广告,但不能同时接收两者

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

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

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();
  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());
  });
}
调试控制台中将显示以下内容:

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


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

实际上,您应该使用以下软件包使其工作:

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

设置通知并侦听更改

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

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

事实上,您应该使用以下软件包使其正常工作:

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

设置通知并侦听更改

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

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

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

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

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

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

39ED、98FF、2900441A、802F、9C39、8FC1199D2

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

我写了你引用的博客文章,通常用Swift或Kotlin以本机方式完成所有工作,但如果你能找到允许你发送和接收BLE广告包的模块,那么你没有理由不能用FLIFT完成这项工作。这些可以是原始广告或信标格式,如AltBeacon或Eddystone,您可以重新解释

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


如果您可以找到flutter包,该包允许您在发送端和接收端根据这些表达式设置布局,那么您的工作即将完成。否则,您只需手动重新编码。

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

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

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

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

39ED、98FF、2900441A、802F、9C39、8FC1199D2

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

我写了你引用的博客文章,通常用Swift或Kotlin以本机方式完成所有工作,但如果你能找到允许你发送和接收BLE广告包的模块,那么你没有理由不能用FLIFT完成这项工作。这些可以是原始广告或信标格式,如AltBeacon或Eddystone,您可以重新解释

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


如果您可以找到flutter包,该包允许您在发送端和接收端根据这些表达式设置布局,那么您的工作即将完成。否则,您只需手动重新编码。

谢谢您的回答。我还有一个疑问:Flatter_blue是否需要设备配对?我可以发送广播数据并扫描其他设备发送的所有数据吗?我需要不请自来的消息谢谢你的回答。我还有一个疑问:Flatter_blue是否需要设备配对?我可以发送广播数据并扫描其他设备发送的所有数据吗?我需要不请自来的消息谢谢你,我真的很感激你的回答。现在,告诉我我是否正确理解了:我们需要的是一个用于Flutter的模块,它使我能够发送BLE广告包。此时,我们可以发送自定义数量的数据,例如100字节。在接收器端,我们得到这个字节数组,并进行自定义解码,即用于颤振的本机Dart。所有这些都可以在设备之间没有某种配对的情况下实现。这通常是正确的。但您不能发送100字节,不能。制造商BLE广告在2字节制造商代码之后最多可以包含24字节。节省空间!如果24还不够,您可以每隔500毫秒左右交错广告,并合并来自(比如)几秒钟内看到的四个不同广告的数据。24+24+24+24=96 bytest这可能是我在StackOverflow上看到的关于这个答案的书中写得最多的一篇了谢谢你,我真的很感激你的回答。现在,告诉我我是否正确理解了:我们需要的是一个用于Flutter的模块,它使我能够发送BLE广告包。此时,我们可以发送自定义数量的数据,例如100字节。在接收器端,我们得到这个字节数组,并进行自定义解码,即用于颤振的本机Dart。所有这些都可以在设备之间没有某种配对的情况下实现。这通常是正确的。但您不能发送100字节,不能。制造商BLE广告在2字节制造商代码之后最多可以包含24字节。节省空间!如果24还不够,您可以每隔500毫秒左右交错广告,并合并来自(比如)几秒钟内看到的四个不同广告的数据。24+24+24+24=96 bytest这可能是我在StackOverflow上看到的关于这个答案的书中写得最多的一篇了