寫這篇文章的初衷
上一篇文章介紹了如何開發(fā)一個藍牙app,(http://www.itdecent.cn/p/969871112806),
但局限于只能連接一臺藍牙設(shè)備,想同時連接著多臺藍牙設(shè)備,就沒法實現(xiàn)
于是就有了寫作本文的動力,-------->解決同時連接多臺藍牙設(shè)備!!!
選擇第三方庫
flutter_blue 適合于單臺的藍牙設(shè)備,使用起來簡單
flutter_reactive_ble 適合于單臺的藍牙設(shè)備,多臺藍牙設(shè)備也可以用
flutter_ble_lib 適合于單臺的藍牙設(shè)備,多臺藍牙設(shè)備也可以用,可以在模擬器上進行調(diào)試藍牙
感覺后2個第三方庫都可以使用,本人先入為主使用了flutter_reactive_ble,所以本文以flutter_reactive_ble為基礎(chǔ)進行介紹
先聲明4個全局變量,后面會用到
StreamSubscription<DiscoveredDevice>? _streamSubscription;
StreamSubscription<ConnectionStateUpdate>? _connectionStreamSubscription;
final flutterReactiveBle = FlutterReactiveBle();
List<DiscoveredDevice> deviceList = [];
開始掃描
_streamSubscription = flutterReactiveBle.scanForDevices(
withServices: [Uuid.parse("0000fff0-0000-1000-XXXX-XXXXXXXXXXX")],
scanMode: ScanMode.lowLatency).listen((device) {
//code for handling results,返回的是可以掃描到的設(shè)備
deviceList.add(device);
}, onError: (e) {
print("onError = $e");
});
如果掃描過程,不使用過濾條件,withServices這個參數(shù)可以給個空數(shù)組
_streamSubscription = flutterReactiveBle.scanForDevices(
withServices: [],
scanMode: ScanMode.lowLatency).listen((device) {
//code for handling results,返回的是可以掃描到的設(shè)備
deviceList.add(device);
}, onError: (e) {
print("onError = $e");
});
停止掃描如下
_streamSubscription?.cancel();
連接設(shè)備
for (int i = 0; i < deviceList.length; i++) {
DiscoveredDevice device = deviceList[i];
_connectionStreamSubscription = flutterReactiveBle
.connectToDevice(
id: device.id,
servicesWithCharacteristicsToDiscover: {
// Uuid.parse("fff0"): [
// Uuid.parse("fff1"),
// Uuid.parse("fff2"),
// Uuid.parse("fff3"),
// Uuid.parse("fff4"),
// Uuid.parse("fff5")
// ]
},
connectionTimeout: const Duration(seconds: 3),
)
.listen((connectionState) {
if (connectionState.connectionState ==
DeviceConnectionState.connected) {
print(" connectionState=${connectionState.deviceId}");
_discoverServices(deviceId);
}
// Handle connection state updates
}, onError: (Object error) {
print("error1 =$error");
// Handle a possible error
});
}
斷開設(shè)備,
每連接成功一個設(shè)備后,就會產(chǎn)生一個_connectionStreamSubscription,對應(yīng)設(shè)備的斷開,就用對應(yīng)的StreamSubscription去斷開, 可以用一個HashMap,去記錄連接成功的設(shè)備與StreamSubscription的對應(yīng)關(guān)系
_connectionStreamSubscription.cancel();
去掃描服務(wù),并過濾服務(wù),掃描結(jié)果服務(wù)里面是包含有特征的數(shù)組,如: serviceId:[fff0,fff1,fff2,fff3,...]
_discoverServices(String deivceId) {
List<DiscoveredService> serviceList =
await flutterReactiveBle.discoverServices(deviceId);
print("services=$serviceList");
for (int i = 0; i < serviceList.length; i++) {
DiscoveredService discoveredService = serviceList[i];
if (discoveredService.serviceId == Uuid.parse("fff0")) {
if (discoveredService.characteristicIds.length < 4) {
print("長度不夠用");
}
}
}
}
去監(jiān)聽上報來的數(shù)據(jù),參數(shù)來自前面掃描到的結(jié)果serviceId--服務(wù)ID, characteristicId--特征ID,deviceId--設(shè)備ID
final characteristic = QualifiedCharacteristic(
serviceId: serviceId,
characteristicId: characteristicId,
deviceId: deviceId);
print("characteristic = $characteristic");
flutterReactiveBle.subscribeToCharacteristic(characteristic).listen((data) {
// code to handle incoming data
print("deviceId =${discoveredDevice.id}---上報來的數(shù)據(jù)data = $data");
}, onError: (dynamic error) {
// code to handle errors
});
監(jiān)聽這個地方,就知道當前是哪個設(shè)備上報的數(shù)據(jù)!
后面就是各位看官根據(jù)自己的需求去做邏輯處理啦。
print("deviceId =${discoveredDevice.id}---上報來的數(shù)據(jù)data = $data");
對設(shè)備設(shè)置命令,發(fā)送請求(寫操作),list為整形數(shù)據(jù),要寫的數(shù)據(jù)
// write
final writeCharacteristic = QualifiedCharacteristic(
serviceId: discoveredService.serviceId,
characteristicId: discoveredService.characteristicIds[2],
deviceId: widget.device.id);
await flutterReactiveBle
.writeCharacteristicWithResponse(writeCharacteristic, value: list);
讀取設(shè)備的信息(讀操作)
// read
final characteristic = QualifiedCharacteristic(
serviceId: discoveredService.serviceId,
characteristicId: discoveredService.characteristicIds[1],
deviceId: widget.device.id);
final response =
await flutterReactiveBle.readCharacteristic(characteristic);
print("response=$response");
最終的成果

結(jié)尾
flutter 多臺藍牙設(shè)備同時連接的分享就到這里嘍,小伴們,覺得有點用的話,或者已經(jīng)看到這里面來的請點個贊吧~~ 后續(xù)分享更多有關(guān)flutter的文章。如果有疑問的話,請在下方留言~
補充
過一段時間后,我在項目把這個藍牙庫用起來了,基本能滿足日常需求.效果如下:
