You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Flutter向Bluno Beetle V1.1发送蓝牙数据?

Flutter与Bluno Beetle V1.1蓝牙通信解决方案

核心前提:Bluno Beetle的通信逻辑

Bluno Beetle本质是BLE转串口透传模块,并非标准BLE服务/特征设备。所以不需要用ArduinoBLE库,直接用Arduino原生Serial类即可实现数据透传,Flutter端只需找到Bluno对应的透传特征进行读写。


一、Arduino端配置(关键)

放弃ArduinoBLE,直接使用以下极简代码实现串口透传(波特率默认9600,需和Flutter端逻辑匹配):

void setup() {
  Serial.begin(9600); // 固定波特率,Flutter端无需额外设置
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    char cmd = Serial.read();
    // 根据收到的指令控制LED
    if (cmd == '1') {
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println("LED已开启"); // 回传状态给Flutter
    } else if (cmd == '0') {
      digitalWrite(LED_BUILTIN, LOW);
      Serial.println("LED已关闭");
    }
  }
}

二、Flutter端基于FlutterBluePlus的实现

你已经能连接设备,只需补充找到透传特征并读写的逻辑:

1. 修正连接流程(先连接再跳转)

避免页面跳转导致的设备实例丢失,建议连接成功后再跳转到控制页:

onTap: () async {
  final bluetoothDevice = BluetoothDevice(remoteId: data.device.remoteId);
  try {
    await bluetoothDevice.connect();
    // 连接成功后传递设备实例到控制页
    Navigator.push(
      context,
      MaterialPageRoute<void>(
        builder: (context) => LedControll(device: bluetoothDevice),
      ),
    );
  } catch (e) {
    print("连接失败:$e");
    // 可添加Toast提示用户
  }
},

2. 在LedControll页实现数据读写

Bluno的透传服务UUID为0000ffe0-0000-1000-8000-00805f9b34fb,特征UUID为0000ffe1-0000-1000-8000-00805f9b34fb(通用BLE透传标准),代码如下:

class LedControll extends StatefulWidget {
  final BluetoothDevice device;
  const LedControll({super.key, required this.device});

  @override
  State<LedControll> createState() => _LedControllState();
}

class _LedControllState extends State<LedControll> {
  BluetoothCharacteristic? _txChar; // 用于读写的透传特征

  @override
  void initState() {
    super.initState();
    _initBLECharacteristic();
  }

  // 初始化透传特征
  Future<void> _initBLECharacteristic() async {
    final services = await widget.device.discoverServices();
    for (var service in services) {
      if (service.uuid.toString() == "0000ffe0-0000-1000-8000-00805f9b34fb") {
        for (var char in service.characteristics) {
          if (char.uuid.toString() == "0000ffe1-0000-1000-8000-00805f9b34fb") {
            _txChar = char;
            // 订阅特征通知,接收Bluno回传的数据
            await char.setNotifyValue(true);
            char.lastValueStream.listen((value) {
              print("收到设备数据:${String.fromCharCodes(value)}");
            });
            break;
          }
        }
        break;
      }
    }
  }

  // 发送控制指令
  Future<void> _sendCommand(String cmd) async {
    if (_txChar != null) {
      await _txChar!.write(utf8.encode(cmd));
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("LED控制")),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: () => _sendCommand("1"),
              child: const Text("开启LED"),
            ),
            const SizedBox(height: 20),
            ElevatedButton(
              onPressed: () => _sendCommand("0"),
              child: const Text("关闭LED"),
            ),
          ],
        ),
      ),
    );
  }
}

三、其他库的问题说明

  • flutter_libserialport:这个库是针对本地物理串口(如USB转串口),不支持蓝牙串口,所以会编译错误,直接放弃即可。
  • flutter bluetooth serial ble:文档缺失且波特率无需在Flutter端设置(波特率是Arduino端Serial.begin()的配置),但该库封装度高、可控性差,不如FlutterBluePlus灵活。

内容的提问来源于stack exchange,提问作者NewUser69420

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:35:31