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

