前言

使用flutter蓝牙插件flutter_blue实现。

开发流程

Ble低功耗蓝牙,不管是android还是ios,都是如下的流程:

1.扫描设备;

通过广播的形式,可以扫描附近的蓝牙设备,扫描到的数据包括蓝牙名称name和信号强度rssi。代码如下

FlutterBlue flutterBlue = FlutterBlue.instance;

// Start scanning
flutterBlue.startScan(timeout: Duration(seconds: 4));

// Listen to scan results
var subscription = flutterBlue.scanResults.listen((results) {
    // do something with scan results
    for (ScanResult r in results) {
        print('${r.device.name} found! rssi: ${r.rssi}');
    }
});

// Stop scanning
flutterBlue.stopScan();

2.连接设备

扫描设备后,匹配到合适的蓝牙名称,然后连接该设备。代码如下


// Connect to the device
await device.connect();

// Disconnect from device
device.disconnect();

3.发现设备

连接设备后,需要发现设备,因为设备可能提供多个服务,每一个服务又有多个特征,我们要做的是,根据设备方提供的服务值和特征值匹配到可用的特征。代码如下


List<BluetoothService> services = await device.discoverServices();
    services.forEach((service) {
      var value = service.uuid.toString();
      logD("所有服务值 --- $value");
      if (service.uuid.toString().toLowerCase() == bleProduct.serviceUuid) {
        List<BluetoothCharacteristic> characteristics = service.characteristics;
        characteristics.forEach((characteristic) async {
          var valuex = characteristic.uuid.toString();
          logD("所有特征值 --- $valuex");
          if (characteristic.uuid.toString().toLowerCase() ==
              bleProduct.characteristicUuid) {
            logD("匹配到正确的特征值:" + bleProduct.characteristicUuid);
            _characteristic = characteristic;
            bleProduct.device = device;
            await _receiveFromDevice();
            bleProduct.connected = true;
            _bleConnectedListener(true);
          }
        });
      }
    });


4.数据的发送和接收

通过以上步骤获得特征

//接收
await characteristic.setNotifyValue(true);
characteristic.value.listen((value) {
    // do something with new value
});

//发送
_characteristic.write(comm);

需要注意的点

1.BluetoothDevice.id在android上,返回的是蓝牙的mac地址,在ios上,返回的是uuid,这是因为平台限制,ios不能获取mac地址,只能获取uuid。
2.蓝牙数据传输最大长度是20位byte,如果大于这个长度,需要拆分和组装数据。

代码地址