前言
使用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,如果大于这个长度,需要拆分和组装数据。