Flutter蓝牙广播插件beacon_broadcast的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter蓝牙广播插件beacon_broadcast的使用

Beacon Broadcast plugin for Flutter

Awesome Flutter Pub

这是一个用于将您的设备变成信标的Flutter插件。

使用方法

要使用此插件,您需要在pubspec.yaml文件中添加beacon_broadcast作为依赖项并导入:

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) //可选
    .setAdvertiseMode(AdvertiseMode.lowPower) //仅限Android, 可选
    .setIdentifier('com.example.myDeviceRegion') //仅限iOS, 可选
    .setLayout('s:0-1=feaa,m:2-2=10,p:3-3:-41,i:4-21v') //仅限Android, 可选
    .setManufacturerId(0x001D) //仅限Android, 可选
    .start();

你可以检查当前的广播状态:

bool isAdvertising = await beaconBroadcast.isAdvertising()

你还可以监听信标广播状态的变化:

beaconBroadcast.getAdvertisingStateChange().listen((isAdvertising) {
    // 现在你知道信标是否正在广播
});

在广播之前,您可能想要检查您的设备是否支持作为信标传输。你可以使用checkTransmissionSupported()方法来做这个检查。

BeaconStatus transmissionSupportStatus = await beaconBroadcast.checkTransmissionSupported();
switch (transmissionSupportStatus) {
  case BeaconStatus.SUPPORTED:
    // 你可以开始广播了
    break;
  case BeaconStatus.NOT_SUPPORTED_MIN_SDK:
    // 您的Android系统版本太低(最低为21)
    break;
  case BeaconStatus.NOT_SUPPORTED_BLE:
    // 您的设备不支持BLE
    break;
  case BeaconStatus.NOT_SUPPORTED_CANNOT_GET_ADVERTISER:
    // 要么是您的芯片组或驱动程序不兼容
    break;
}

如果你想停止广播,只需要调用stop()

beaconBroadcast.stop();

示例代码

以下是一个完整的示例代码,展示了如何使用beacon_broadcast插件创建一个可以启动和停止广播的应用程序。

import 'dart:async';

import 'package:beacon_broadcast/beacon_broadcast.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  static const String uuid = '39ED98FF-2900-441A-802F-9C398FC199D2';
  static const int majorId = 1;
  static const int minorId = 100;
  static const int transmissionPower = -59;
  static const String identifier = 'com.example.myDeviceRegion';
  static const AdvertiseMode advertiseMode = AdvertiseMode.lowPower;
  static const String layout = BeaconBroadcast.ALTBEACON_LAYOUT;
  static const int manufacturerId = 0x0118;
  static const List<int> extraData = [100];

  BeaconBroadcast beaconBroadcast = BeaconBroadcast();

  bool _isAdvertising = false;
  BeaconStatus _isTransmissionSupported;
  StreamSubscription<bool> _isAdvertisingSubscription;

  @override
  void initState() {
    super.initState();
    beaconBroadcast
        .checkTransmissionSupported()
        .then((isTransmissionSupported) {
      setState(() {
        _isTransmissionSupported = isTransmissionSupported;
      });
    });

    _isAdvertisingSubscription =
        beaconBroadcast.getAdvertisingStateChange().listen((isAdvertising) {
      setState(() {
        _isAdvertising = isAdvertising;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Beacon Broadcast'),
        ),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              mainAxisSize: MainAxisSize.min,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Text('Is transmission supported?',
                    style: Theme.of(context).textTheme.headline5),
                Text('$_isTransmissionSupported',
                    style: Theme.of(context).textTheme.subtitle1),
                Container(height: 16.0),
                Text('Has beacon started?',
                    style: Theme.of(context).textTheme.headline5),
                Text('$_isAdvertising',
                    style: Theme.of(context).textTheme.subtitle1),
                Container(height: 16.0),
                Center(
                  child: ElevatedButton(
                    onPressed: () {
                      beaconBroadcast
                          .setUUID(uuid)
                          .setMajorId(majorId)
                          .setMinorId(minorId)
                          .setTransmissionPower(transmissionPower)
                          .setAdvertiseMode(advertiseMode)
                          .setIdentifier(identifier)
                          .setLayout(layout)
                          .setManufacturerId(manufacturerId)
                          .setExtraData(extraData)
                          .start();
                    },
                    child: Text('START'),
                  ),
                ),
                Center(
                  child: ElevatedButton(
                    onPressed: () {
                      beaconBroadcast.stop();
                    },
                    child: Text('STOP'),
                  ),
                ),
                Text('Beacon Data',
                    style: Theme.of(context).textTheme.headline5),
                Text('UUID: $uuid'),
                Text('Major id: $majorId'),
                Text('Minor id: $minorId'),
                Text('Tx Power: $transmissionPower'),
                Text('Advertise Mode Value: $advertiseMode'),
                Text('Identifier: $identifier'),
                Text('Layout: $layout'),
                Text('Manufacturer Id: $manufacturerId'),
                Text('Extra data: $extraData'),
              ],
            ),
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _isAdvertisingSubscription?.cancel();
    super.dispose();
  }
}

以上代码创建了一个简单的Flutter应用程序,该应用程序允许用户点击按钮开始或停止信标广播,并显示有关广播状态的信息。


更多关于Flutter蓝牙广播插件beacon_broadcast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter蓝牙广播插件beacon_broadcast的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用beacon_broadcast插件来发送蓝牙广播的示例代码。这个插件允许你的Flutter应用充当一个蓝牙Beacon,其他设备可以检测和识别它。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加beacon_broadcast依赖:

dependencies:
  flutter:
    sdk: flutter
  beacon_broadcast: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置权限

对于Android,你需要在AndroidManifest.xml中添加必要的权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

对于iOS,你需要在Info.plist中添加对蓝牙和位置权限的描述:

<key>NSBluetoothAlwaysUsageDescription</key>
<string>App needs bluetooth permission to broadcast beacons</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>App needs location permission to broadcast beacons</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>App needs location permission to broadcast beacons</string>

3. 实现蓝牙广播

在你的Flutter应用中,你可以按照以下步骤实现蓝牙广播:

import 'package:flutter/material.dart';
import 'package:beacon_broadcast/beacon_broadcast.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Beacon Broadcast Example'),
        ),
        body: BeaconBroadcastExample(),
      ),
    );
  }
}

class BeaconBroadcastExample extends StatefulWidget {
  @override
  _BeaconBroadcastExampleState createState() => _BeaconBroadcastExampleState();
}

class _BeaconBroadcastExampleState extends State<BeaconBroadcastExample> {
  late BeaconBroadcast _beaconBroadcast;

  @override
  void initState() {
    super.initState();
    _beaconBroadcast = BeaconBroadcast();
    _startBeaconBroadcast();
  }

  Future<void> _startBeaconBroadcast() async {
    // 请求位置权限(iOS和Android都需要)
    var status = await Permission.locationWhenInUse.status;
    if (!status.isGranted) {
      status = await Permission.locationWhenInUse.request();
      if (!status.isGranted) {
        // 用户拒绝权限请求,这里可以处理权限被拒绝的情况
        return;
      }
    }

    // 开始广播Beacon
    await _beaconBroadcast.configureBeacon(
      uuid: '12345678-1234-5678-1234-567812345678', // UUID
      major: 1, // Major
      minor: 1, // Minor
      measuredPower: -59, // Measured Power
      manufacturerId: 0x004C, // Manufacturer ID (e.g., Apple)
      beaconRegionIdentifier: 'myBeaconRegion', // Region Identifier
      beaconType: BeaconType.IBEACON, // Beacon Type
    );

    await _beaconBroadcast.startAdvertising();
    print("Beacon advertising started");
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Text('Beacon is broadcasting...'),
          ElevatedButton(
            onPressed: () async {
              await _beaconBroadcast.stopAdvertising();
              print("Beacon advertising stopped");
            },
            child: Text('Stop Broadcasting'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _beaconBroadcast.stopAdvertising().then((_) {
      print("Beacon advertising disposed");
    });
    super.dispose();
  }
}

注意事项

  1. 权限请求:在实际应用中,处理权限请求和拒绝的情况非常重要,以确保用户体验良好。
  2. 插件版本:确保你使用的beacon_broadcast插件版本与Flutter SDK兼容。
  3. 设备兼容性:不同设备和操作系统版本对蓝牙广播的支持可能有所不同,务必进行充分的测试。

通过上述代码,你可以在Flutter应用中实现蓝牙广播功能。

回到顶部