如何在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
相关产品推荐
相关产品推荐

