Beacon Broadcast 插件,用于 Flutter
一个 Flutter 插件,用于将您的设备变成信标。
用法
要使用此插件,请将 beacon_broadcast 添加到您的 pubspec.yaml 文件中作为依赖项,并导入
文件。
import 'package:beacon_broadcast/beacon_broadcast.dart';
现在您可以创建 BeaconBroadcast 对象并开始使用它了。
重要提示:对于 Android 应用,用户需要首先打开设备上的蓝牙
。
BeaconBroadcast beaconBroadcast = BeaconBroadcast();
在最简单的情况下,要开始广播,只需设置您的 UUID、major 和 minor
ID,然后调用 start()
beaconBroadcast
.setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
.setMajorId(1)
.setMinorId(100)
.start();
您也可以在开始之前自定义您的信标。
beaconBroadcast
.setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
.setMajorId(1)
.setMinorId(100)
.setTransmissionPower(-59) //optional
.setAdvertiseMode(AdvertiseMode.lowPower) //Android-only, 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();
您可以检查信标广播状态的当前状态。
bool isAdvertising = await beaconBroadcast.isAdvertising()
您还可以监听信标广播状态的变化。
beaconBroadcast.getAdvertisingStateChange().listen((isAdvertising) {
// Now you know if beacon is advertising
});
在广播之前,您可能想检查您的设备是否支持作为信标进行传输
。您可以使用
checkTransmissionSupported() 方法来完成。
BeaconStatus transmissionSupportStatus = await beaconBroadcast.checkTransmissionSupported();
switch (transmissionSupportStatus) {
case BeaconStatus.SUPPORTED:
// You're good to go, you can advertise as a beacon
break;
case BeaconStatus.NOT_SUPPORTED_MIN_SDK:
// Your Android system version is too low (min. is 21)
break;
case BeaconStatus.NOT_SUPPORTED_BLE:
// Your device doesn't support BLE
break;
case BeaconStatus.NOT_SUPPORTED_CANNOT_GET_ADVERTISER:
// Either your chipset or driver is incompatible
break;
}
如果您想停止广播,只需调用 stop()
beaconBroadcast.stop();
示例
简单的用法示例可以在 示例文件夹 中找到。
更改信标布局
默认情况下,信标布局根据制造商设置
(请参阅 信标制造商 部分)。您可以更改
布局以模仿传输为不同类型的信标。
注意: 对于 iOS,布局设置为 iBeacon,无法更改。
广播为 AltBeacon
beaconBroadcast
.setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
.setMajorId(1)
.setMinorId(100)
.start();
广播为 iBeacon
beaconBroadcast
.setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
.setMajorId(1)
.setMinorId(100)
.setLayout('m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24')
.setManufacturerId(0x004c)
.start();
添加额外数据
如果您的信标布局设置正确,则允许您传输
一些额外数据。根据布局,通常最多为 2 字节。
对于 AltBeacon,它是 1 字节的附加数据(来源)。
对于 iBeacon (iOS),没有选项可以发送额外数据,因为 iBeacon 布局
不支持。
使用 AltBeacon 布局添加额外数据
beaconBroadcast
.setUUID('39ED98FF-2900-441A-802F-9C398FC199D2')
.setMajorId(1)
.setMinorId(100)
.setExtraData([123])
.start();
信标制造商
Android
Android 信标将作为 RadiusNetwork 制造的 AltBeacon 进行广播。
您可以使用 setLayout() 和 setManufacturerId() 方法来更改它。
iOS
对于 iOS,信标将作为 Apple 的 iBeacon 进行广播,无法更改。
在后台传输
Android
由于 Android 8 中引入的后台执行限制
,后台的信标传输受到限制。根据
AltBeacon 文档
,大约为 10 分钟,之后传输将停止。
插件的当前版本不支持前台服务来超出此
限制。
iOS
对于 iOS,应用程序在后台不工作。根据
CoreLocation
文档
重要提示
,在将应用程序广播为信标后,您的应用程序必须继续运行
在前台以广播所需的蓝牙信号。如果用户退出
应用程序,系统将停止通过蓝牙将设备广播为外围设备。此外,从 iOS 13 开始,需要隐私使用描述才能使用蓝牙。否则,应用程序将出现运行时崩溃。
为了解决这个问题,请将以下行添加到您的 Info.plist 中
<key>NSBluetoothAlwaysUsageDescription</key>
<string>(Reason bluetooth is used)</string>
对于早于 iOS 13 的部署目标,请将这些附加行添加到您的 Info.plist 中
<key>NSBluetoothPeripheralUsageDescription</key>
<string>(Reason bluetooth is used)</string>
关于
此插件使用 Android Beacon Library
用于 Android 和 CoreLocation
用于 iOS。
待办事项
还有一些事情需要实现
- [X] 添加选项以编程方式检查 Android 设备支持
- [X] 添加选项以设置 Android 实现的布局和制造商
- [ ] 处理在传输前打开 BLE
- [ ] 添加前台服务以超出 Android 8+ 的后台限制