android - 有没有一种方法可以在颤振中实现一种像信标一样的蓝牙广播?
问题描述
我想知道如何为 Flutter 应用程序实现一种“蓝牙广播”(使用蓝牙低功耗)。特别是,我想实现这些点:
- 我想使用蓝牙“在空中”发送随机字符串和整数。
- 我还希望能够通过其他设备接收这些数据
- 应用程序必须能够同时发送和接收
现在,我检查了来自 pub.dev 的一些信标库(如this或this),但事实证明我可能不明白这些库是否以及如何帮助我。
例如,让我们考虑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 的信标。
可以在这里找到与我想要实现的目标类似的东西,但它是用 kotlin 制作的。如果您认为这是最接近我需要的东西,请建议我如何在我的颤振项目中使用本机代码。
非常感谢。
编辑 1:我们现在需要找到两个 Flutter 库,以便使用 AltBeacon 布局同时发送和接收各种信标。这不是微不足道的,因为事实证明其他开发人员奇怪地实现了通信的一侧,而不是两者。此外,很难找到带有“包含电池”的库(即能够开箱即用地相互通信)。
编辑2:突发新闻!我结合了两个颤振库,特别是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());
});
}
以下内容显示在调试控制台中:
但是,不幸的是,如果我也激活 BLE 广告,什么也不会发生:
那么,有什么建议吗?当我单独使用一个设备进行扫描和另一个设备进行广告时,它可以工作......
解决方案
发送自定义数据是一个编码问题。信标标识符只是对蓝牙数据包中一系列字节的解释。您可以根据需要安全地重新解释这些字节,重用您想要的任何信标格式。
例如,在您的问题中,您有以下标识符:
39ED98FF-2900-441A-802F-9C398FC199D2
为什么不将其重新解释为一系列 16 位整数呢?
39ED, 98FF, 2900, 441A, 802F, 9C39, 8FC1, 99D2
您还可以将字符串编码到字节流中。例如,Eddystone-URL 是一种将 URL 编码为蓝牙字节数组的格式。
我写了你引用的博客文章,并且通常在 Swift 或 Kotlin 中本地完成所有工作,但如果你能找到让你发送和接收 BLE 广告数据包的模块,你没有理由不能用 Flutter 做到这一点。这些可以是原始广告或信标格式,例如您可以重新解释的 AltBeacon 或 Eddystone。
问题中的示例显示了信标布局。这是一个简短的表达式,显示了如何将字节序列解释为特定长度的标识符数组。我在第一次编写 Android 信标库时创建了信标布局表达式的概念。这些是简短的字符串,可让您简洁地定义如何对信标数据包中的字节进行编码和解码。
如果你能找到 Flutter 的包,让你在发送端和接收端都基于这些表达式设置布局,那么你的工作就差不多完成了。否则,您只需要手动重新编码。
推荐阅读
- java - 如何从 url 视频链接连续重复相同的视频?
- angular - 离子角度 - 当我有多个嵌套路由时,路由无法正常工作
- python - Python Cassandra - TypeError:'UUID'类型的对象没有len()
- python - 熊猫如何从 df2 获取 df1 的值,而 df1 和 df2 的值在列上重叠
- jquery - 在将屏幕从小屏幕调整到大屏幕时,jQuery数据表宽度错误地改变了
- android - 添加此最新依赖项“com.google.android.material:material”时如何解决问题?
- json - 通过 Azure Datafactory V2 将 Simple Json 导入 Sql 表
- qt - QML ToolButton 背景颜色
- python - 调用python脚本并捕获二进制输出
- sql - CTE 方法避免在先前行集的结果上对表的每一行进行游标更新