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

如何在Flutter中使用flutter_blue库通过低功耗蓝牙发送数据

使用flutter_blue向Arduino BLE模块发送数据的完整步骤

一、Arduino端准备(关键前提)

BLE和经典蓝牙的串口通信逻辑不同,你需要先在Arduino上配置BLE服务和可写特征:

  • 推荐使用NimBLE-Arduino库(比官方BLEPeripheral更高效)
  • 创建一个服务(示例UUID:0000ffe0-0000-1000-8000-00805f9b34fb,和HC-05的串口UUID对应便于过渡)
  • 在服务下创建可写特征(示例UUID:0000ffe1-0000-1000-8000-00805f9b34fb)
  • 示例代码片段:
#include <NimBLEDevice.h>

#define SERVICE_UUID        "0000ffe0-0000-1000-8000-00805f9b34fb"
#define CHARACTERISTIC_UUID "0000ffe1-0000-1000-8000-00805f9b34fb"

NimBLEServer* pServer = nullptr;
NimBLECharacteristic* pCharacteristic = nullptr;

void setup() {
  Serial.begin(115200);
  NimBLEDevice::init("Arduino_BLE");
  pServer = NimBLEDevice::createServer();
  NimBLEService* pService = pServer->createService(SERVICE_UUID);
  pCharacteristic = pService->createCharacteristic(
                      CHARACTERISTIC_UUID,
                      NIMBLE_PROPERTY::WRITE | NIMBLE_PROPERTY::WRITE_NR
                    );
  pService->start();
  NimBLEAdvertising* pAdvertising = NimBLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->start();
}

void loop() {
  if(pCharacteristic->getValue().length() > 0) {
    Serial.print("Received: ");
    Serial.println(pCharacteristic->getValue().c_str());
    // 收到"1"时执行任务,比如点亮LED
    if(pCharacteristic->getValue() == "1") {
      digitalWrite(LED_BUILTIN, HIGH);
    }
    pCharacteristic->setValue(""); // 清空缓存
  }
  delay(100);
}

二、Flutter端用flutter_blue发送数据的步骤

1. 依赖配置

在pubspec.yaml中添加:

dependencies:
  flutter_blue: ^0.8.0

执行flutter pub get完成依赖安装

2. 核心操作流程

(1)扫描并匹配目标设备

import 'package:flutter_blue/flutter_blue.dart';

FlutterBlue flutterBlue = FlutterBlue.instance;

void scanAndConnect() {
  flutterBlue.startScan(timeout: const Duration(seconds: 4));
  flutterBlue.scanResults.listen((results) {
    for (ScanResult result in results) {
      // 匹配Arduino设备名称(和代码中设置的"Arduino_BLE"一致)
      if (result.device.name == "Arduino_BLE") {
        _connectToDevice(result.device);
        flutterBlue.stopScan();
        break;
      }
    }
  });
}

(2)连接设备并获取可写特征

BluetoothDevice? _targetDevice;
BluetoothCharacteristic? _writeCharacteristic;

Future<void> _connectToDevice(BluetoothDevice device) async {
  _targetDevice = device;
  await _targetDevice!.connect();
  
  // 发现设备所有服务
  List<BluetoothService> services = await _targetDevice!.discoverServices();
  for (BluetoothService service in services) {
    // 匹配预设的服务UUID
    if (service.uuid.toString() == "0000ffe0-0000-1000-8000-00805f9b34fb") {
      // 找到可写特征
      for (BluetoothCharacteristic char in service.characteristics) {
        if (char.uuid.toString() == "0000ffe1-0000-1000-8000-00805f9b34fb" && char.properties.write) {
          _writeCharacteristic = char;
          break;
        }
      }
      break;
    }
  }
}

(3)发送数据(比如发送"1")

BLE以字节数组传输数据,需要将字符串转为Uint8List:

Future<void> sendData(String data) async {
  if (_writeCharacteristic != null && _targetDevice != null) {
    Uint8List bytes = Uint8List.fromList(data.codeUnits);
    await _writeCharacteristic!.write(bytes);
    print("已发送: $data");
  } else {
    print("未连接设备或未找到可写特征");
  }
}

// 调用示例
sendData("1");

三、注意事项

  • 确保Arduino的BLE模块和Flutter设备在有效通信距离内,双方蓝牙均开启
  • 服务和特征的UUID必须和Arduino端完全一致(注意大小写和格式)
  • 若发送特殊字符,需保证两端编码统一(推荐UTF8)
  • 建议添加断开重连逻辑,避免设备意外断开后无法继续通信

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:51:02