From cfe0eda4a3774cc372272eb03f34f155ec280f1e Mon Sep 17 00:00:00 2001 From: iAMD Date: Mon, 30 Oct 2023 18:06:14 +0800 Subject: [PATCH] 4.0.0 (#24) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 调整插件接口 * feat: 增加 `Logger` 类 * fix: 部分参数改为可选参数 * fix: 调整接口 * fix: 重命名 AdvertiseData 为 Advertisement * fix: 移除 `Logger.level` 属性 * fix: 适配 4.0.0 * fix: 更新依赖项 * fix: 优化导入方式 * fix: 修改版本号 * fix: 适配 4.0.0 * feat: 部分适配 4.0.0 * feat: 适配 4.0.0 * feat: 适配 4.0.0 * fix: 调整接口 * feat: 调整日志接口 * fix: 修复日志错误 * fix: 临时提交 * draft: 临时提交 * fix: 使用 log_service 插件替换 logging 插件 * fix: 更新 log_service 版本 * fix: 4.0.0 * feat: 4.0.0 * feat: 4.0.0 --- bluetooth_low_energy/CHANGELOG.md | 20 +++ bluetooth_low_energy/README.md | 2 +- bluetooth_low_energy/example/lib/main.dart | 68 +++++----- bluetooth_low_energy/example/pubspec.lock | 34 +++-- bluetooth_low_energy/example/pubspec.yaml | 2 +- .../lib/bluetooth_low_energy.dart | 6 + bluetooth_low_energy/pubspec.yaml | 14 +- bluetooth_low_energy_android/CHANGELOG.md | 29 +++++ .../bluetooth_low_energy_android/MyApi.g.kt | 120 ++++++++++++++---- .../bluetooth_low_energy_android/MyApi.kt | 8 +- .../MyCentralManager.kt | 4 +- .../MyPeripheralManager.kt | 4 +- .../example/lib/main.dart | 68 +++++----- .../example/pubspec.lock | 22 +++- .../example/pubspec.yaml | 4 +- .../lib/bluetooth_low_energy_android.dart | 6 +- .../lib/src/my_api.dart | 12 +- .../lib/src/my_api.g.dart | 119 ++++++++++++----- .../lib/src/my_bluetooth_low_energy.dart | 15 --- .../src/my_bluetooth_low_energy_manager.dart | 39 ------ ..._manager.dart => my_central_manager2.dart} | 75 +++++++---- .../lib/src/my_peripheral_manager2.dart | 96 ++++++++------ bluetooth_low_energy_android/my_api.dart | 8 +- bluetooth_low_energy_android/pubspec.yaml | 9 +- bluetooth_low_energy_darwin/CHANGELOG.md | 20 +++ .../darwin/Classes/MyApi.g.swift | 76 ++++++----- .../darwin/Classes/MyApi.swift | 23 ++-- .../darwin/Classes/MyCentralManager.swift | 12 +- .../darwin/Classes/MyPeripheralManager.swift | 16 +-- .../example/ios/Podfile.lock | 2 +- .../example/lib/main.dart | 68 +++++----- .../example/macos/Podfile.lock | 2 +- .../example/pubspec.lock | 30 ++++- .../example/pubspec.yaml | 5 +- .../lib/bluetooth_low_energy_darwin.dart | 6 +- .../lib/src/my_api.dart | 12 +- .../lib/src/my_api.g.dart | 119 ++++++++++++----- .../lib/src/my_bluetooth_low_energy.dart | 15 --- .../src/my_bluetooth_low_energy_manager.dart | 39 ------ ...manager.dart => my_central_manager_2.dart} | 77 +++++++---- .../lib/src/my_peripheral_manager_2.dart | 96 ++++++++------ bluetooth_low_energy_darwin/my_api.dart | 8 +- bluetooth_low_energy_darwin/pubspec.yaml | 8 +- bluetooth_low_energy_linux/CHANGELOG.md | 20 +++ .../example/lib/main.dart | 68 +++++----- .../example/pubspec.lock | 30 ++++- .../example/pubspec.yaml | 4 +- .../lib/bluetooth_low_energy_linux.dart | 4 +- .../lib/src/my_bluetooth_low_energy.dart | 12 -- .../lib/src/my_bluez.dart | 4 +- ..._manager.dart => my_central_manager2.dart} | 13 +- bluetooth_low_energy_linux/pubspec.yaml | 6 +- .../CHANGELOG.md | 70 ++++++++++ .../README.md | 13 +- ...uetooth_low_energy_platform_interface.dart | 28 +++- ...advertise_data.dart => advertisement.dart} | 8 +- .../lib/src/bluetooth_low_energy.dart | 41 ------ .../src/bluetooth_low_energy_event_args.dart | 11 ++ .../lib/src/bluetooth_low_energy_manager.dart | 8 +- .../lib/src/central_manager.dart | 9 +- .../lib/src/central_manager_event_args.dart | 45 +++++++ .../lib/src/errors.dart | 13 -- .../lib/src/event_args.dart | 98 -------------- .../lib/src/my_central_manager.dart | 41 ++++++ .../lib/src/my_peripheral_manager.dart | 41 ++++++ .../lib/src/peripheral_manager.dart | 47 ++++--- .../src/peripheral_manager_event_args.dart | 73 +++++++++++ .../pubspec.yaml | 5 +- 68 files changed, 1316 insertions(+), 814 deletions(-) delete mode 100644 bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy.dart delete mode 100644 bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy_manager.dart rename bluetooth_low_energy_android/lib/src/{my_central_manager.dart => my_central_manager2.dart} (79%) rename bluetooth_low_energy_darwin/lib/src/my_peripheral_manager.dart => bluetooth_low_energy_android/lib/src/my_peripheral_manager2.dart (71%) delete mode 100644 bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy.dart delete mode 100644 bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy_manager.dart rename bluetooth_low_energy_darwin/lib/src/{my_central_manager.dart => my_central_manager_2.dart} (79%) rename bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart => bluetooth_low_energy_darwin/lib/src/my_peripheral_manager_2.dart (71%) delete mode 100644 bluetooth_low_energy_linux/lib/src/my_bluetooth_low_energy.dart rename bluetooth_low_energy_linux/lib/src/{my_central_manager.dart => my_central_manager2.dart} (97%) rename bluetooth_low_energy_platform_interface/lib/src/{advertise_data.dart => advertisement.dart} (81%) delete mode 100644 bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy.dart create mode 100644 bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_event_args.dart create mode 100644 bluetooth_low_energy_platform_interface/lib/src/central_manager_event_args.dart delete mode 100644 bluetooth_low_energy_platform_interface/lib/src/errors.dart create mode 100644 bluetooth_low_energy_platform_interface/lib/src/my_central_manager.dart create mode 100644 bluetooth_low_energy_platform_interface/lib/src/my_peripheral_manager.dart create mode 100644 bluetooth_low_energy_platform_interface/lib/src/peripheral_manager_event_args.dart diff --git a/bluetooth_low_energy/CHANGELOG.md b/bluetooth_low_energy/CHANGELOG.md index 158649f..f074aef 100644 --- a/bluetooth_low_energy/CHANGELOG.md +++ b/bluetooth_low_energy/CHANGELOG.md @@ -1,3 +1,23 @@ +## 4.0.0 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Change some `PeripheralManager` methods' arguments to required optional arguments. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `BluetoothLowEnergyError` class. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Add `LogController` interface to `BluetoothLowEnergyManager`. +* Fix issues. + +## 4.0.0-dev.1 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to static class. +* Update `PeripheralManager` to static class. +* Move `AdvertiseData` class to `Advertisement` class. +* Update `example`. + ## 3.0.3 * `Android` Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22) diff --git a/bluetooth_low_energy/README.md b/bluetooth_low_energy/README.md index 8b0d017..b12cf01 100644 --- a/bluetooth_low_energy/README.md +++ b/bluetooth_low_energy/README.md @@ -39,7 +39,7 @@ dependencies: bluetooth_low_energy: ^ ``` -Remember to call `await CentralController.setUp()` before use any apis of this plugin. +Remember to call `await CentralManager.setUp()` and `await PeripheralManager.setUp()` before use any apis of this plugin. *Note:* Bluetooth Low Energy doesn't work on emulators, so use physical devices which has bluetooth features for development. diff --git a/bluetooth_low_energy/example/lib/main.dart b/bluetooth_low_energy/example/lib/main.dart index 3503d74..7dbf468 100644 --- a/bluetooth_low_energy/example/lib/main.dart +++ b/bluetooth_low_energy/example/lib/main.dart @@ -8,22 +8,35 @@ import 'package:convert/convert.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +CentralManager get centralManager => CentralManager.instance; +PeripheralManager get peripheralManager => PeripheralManager.instance; + void main() { runZonedGuarded(onStartUp, onCrashed); } void onStartUp() async { + Logger.root.onRecord.listen(onLogRecord); WidgetsFlutterBinding.ensureInitialized(); - await CentralManager.instance.setUp(); - await PeripheralManager.instance.setUp(); + await centralManager.setUp(); + await peripheralManager.setUp(); runApp(const MyApp()); } void onCrashed(Object error, StackTrace stackTrace) { + Logger.root.shout('App crached.', error, stackTrace); +} + +void onLogRecord(LogRecord record) { log( - '$error', - error: error, - stackTrace: stackTrace, + record.message, + time: record.time, + sequenceNumber: record.sequenceNumber, + level: record.level.value, + name: record.loggerName, + zone: record.zone, + error: record.error, + stackTrace: record.stackTrace, ); } @@ -138,8 +151,6 @@ class _HomeViewState extends State { } } -CentralManager get centralManager => CentralManager.instance; - class ScannerView extends StatefulWidget { const ScannerView({super.key}); @@ -237,7 +248,7 @@ class _ScannerViewState extends State { builder: (context, discoveredEventArgs, child) { // final items = discoveredEventArgs; final items = discoveredEventArgs - .where((eventArgs) => eventArgs.advertiseData.name != null) + .where((eventArgs) => eventArgs.advertisement.name != null) .toList(); return ListView.separated( itemBuilder: (context, i) { @@ -245,8 +256,8 @@ class _ScannerViewState extends State { final item = items[i]; final uuid = item.peripheral.uuid; final rssi = item.rssi; - final advertiseData = item.advertiseData; - final name = advertiseData.name; + final advertisement = item.advertisement; + final name = advertisement.name; return ListTile( onTap: () async { final discovering = this.discovering.value; @@ -273,7 +284,7 @@ class _ScannerViewState extends State { clipBehavior: Clip.antiAlias, builder: (context) { final manufacturerSpecificData = - advertiseData.manufacturerSpecificData; + advertisement.manufacturerSpecificData; return ListView.separated( padding: const EdgeInsets.symmetric( horizontal: 16.0, @@ -428,7 +439,7 @@ class _PeripheralViewState extends State { }, ); rssiTimer = Timer.periodic( - const Duration(seconds: 1), + const Duration(seconds: 5), (timer) async { final state = this.state.value; if (state) { @@ -458,7 +469,7 @@ class _PeripheralViewState extends State { } PreferredSizeWidget buildAppBar(BuildContext context) { - final title = eventArgs.advertiseData.name ?? ''; + final title = eventArgs.advertisement.name ?? ''; return AppBar( title: Text(title), actions: [ @@ -804,8 +815,6 @@ class _PeripheralViewState extends State { } } -PeripheralManager get peripheralManager => PeripheralManager.instance; - class AdvertiserView extends StatefulWidget { const AdvertiserView({super.key}); @@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget { State createState() => _AdvertiserViewState(); } -class _AdvertiserViewState extends State { +class _AdvertiserViewState extends State + with SingleTickerProviderStateMixin { late final ValueNotifier state; late final ValueNotifier advertising; late final ValueNotifier> logs; @@ -856,11 +866,11 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x01, 0x02, 0x03]); await peripheralManager.sendReadCharacteristicReply( central, - characteristic, - id, - offset, - status, - value, + characteristic: characteristic, + id: id, + offset: offset, + status: status, + value: value, ); }, ); @@ -884,10 +894,10 @@ class _AdvertiserViewState extends State { const status = true; await peripheralManager.sendWriteCharacteristicReply( central, - characteristic, - id, - offset, - status, + characteristic: characteristic, + id: id, + offset: offset, + status: status, ); }, ); @@ -911,8 +921,8 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x03, 0x02, 0x01]); await peripheralManager.notifyCharacteristicValueChanged( central, - characteristic, - value, + characteristic: characteristic, + value: value, ); } }, @@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State { ], ); await peripheralManager.addService(service); - final advertiseData = AdvertiseData( + final advertisement = Advertisement( name: 'flutter', manufacturerSpecificData: ManufacturerSpecificData( id: 0x2e19, data: Uint8List.fromList([0x01, 0x02, 0x03]), ), ); - await peripheralManager.startAdvertising(advertiseData); + await peripheralManager.startAdvertising(advertisement); advertising.value = true; } diff --git a/bluetooth_low_energy/example/pubspec.lock b/bluetooth_low_energy/example/pubspec.lock index bb89c2d..1cb34b9 100644 --- a/bluetooth_low_energy/example/pubspec.lock +++ b/bluetooth_low_energy/example/pubspec.lock @@ -23,39 +23,39 @@ packages: path: ".." relative: true source: path - version: "3.0.3" + version: "4.0.0" bluetooth_low_energy_android: dependency: transitive description: name: bluetooth_low_energy_android - sha256: "86e10541532c96607a0525edba1fd75516543e9beac2e391ac8a50c467aebf88" + sha256: "7668f695f195ed67b9985a76a21f10d181a26ebfc2124b4cd272fb6f202c1ee9" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "4.0.0" bluetooth_low_energy_darwin: dependency: transitive description: name: bluetooth_low_energy_darwin - sha256: "797d3803de3b124ffb13267910f8d727ae4884fdcc621ccc0995076107468bb6" + sha256: "027b46d8efea5c726cc32ab6b2ca387f0ef15507afcd1077d75712ad4e7f941d" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "4.0.0" bluetooth_low_energy_linux: dependency: transitive description: name: bluetooth_low_energy_linux - sha256: "31a23704a4b34e7f6cea61d94c24b3e1c6698928645aaeaf1af947e4870996d7" + sha256: "548a869579684ce7602577ef5e0498d18eef552fb2abb3ee7909814bef57807f" url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" bluetooth_low_energy_platform_interface: dependency: transitive description: name: bluetooth_low_energy_platform_interface - sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" + sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" bluez: dependency: transitive description: @@ -158,10 +158,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -189,10 +189,18 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" + log_service: + dependency: transitive + description: + name: log_service + sha256: "21124936899e227d1779268077921d46d57456e2592d1562e455be273594e2e4" + url: "https://pub.dev" + source: hosted + version: "1.0.0" logging: dependency: transitive description: diff --git a/bluetooth_low_energy/example/pubspec.yaml b/bluetooth_low_energy/example/pubspec.yaml index 58da87f..73ea057 100644 --- a/bluetooth_low_energy/example/pubspec.yaml +++ b/bluetooth_low_energy/example/pubspec.yaml @@ -42,7 +42,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/bluetooth_low_energy/lib/bluetooth_low_energy.dart b/bluetooth_low_energy/lib/bluetooth_low_energy.dart index 8c822b5..b51330b 100644 --- a/bluetooth_low_energy/lib/bluetooth_low_energy.dart +++ b/bluetooth_low_energy/lib/bluetooth_low_energy.dart @@ -1,5 +1,11 @@ +/// A Flutter plugin for controlling the bluetooth low energy, supports central +/// and peripheral apis. +library; + export 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart' hide + MyCentralManager, + MyPeripheralManager, MyObject, MyCentral, MyPeripheral, diff --git a/bluetooth_low_energy/pubspec.yaml b/bluetooth_low_energy/pubspec.yaml index f185a88..9ce0cb9 100644 --- a/bluetooth_low_energy/pubspec.yaml +++ b/bluetooth_low_energy/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy -description: A Flutter plugin for controlling the bluetooth low energy. -version: 3.0.3 +description: A Flutter plugin for controlling the bluetooth low energy, supports central and peripheral apis. +version: 4.0.0 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -10,15 +10,15 @@ environment: dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 - bluetooth_low_energy_android: ^3.0.4 - bluetooth_low_energy_darwin: ^3.0.2 - bluetooth_low_energy_linux: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 + bluetooth_low_energy_android: ^4.0.0 + bluetooth_low_energy_darwin: ^4.0.0 + bluetooth_low_energy_linux: ^4.0.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 flutter: plugin: diff --git a/bluetooth_low_energy_android/CHANGELOG.md b/bluetooth_low_energy_android/CHANGELOG.md index 9ed4ba1..79d5638 100644 --- a/bluetooth_low_energy_android/CHANGELOG.md +++ b/bluetooth_low_energy_android/CHANGELOG.md @@ -1,3 +1,32 @@ +## 4.0.0 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Change some `PeripheralManager` methods' arguments to required optional arguments. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `BluetoothLowEnergyError` class. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Add `LogController` interface to `BluetoothLowEnergyManager`. +* Fix issues. + +## 4.0.0-dev.3 + +* Optimize project structure. + +## 4.0.0-dev.2 + +* Optimize the import method of the `example`. + +## 4.0.0-dev.1 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `logging` dependency. +* Update `example`. + ## 3.0.4 * Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22) diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt index d77bd90..6b0865f 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.g.kt @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v12.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon package dev.yanshouwang.bluetooth_low_energy_android @@ -165,7 +165,7 @@ data class MyPeripheralArgs ( } /** Generated class from Pigeon that represents data sent in messages. */ -data class MyAdvertiseDataArgs ( +data class MyAdvertisementArgs ( val nameArgs: String? = null, val serviceUUIDsArgs: List, val serviceDataArgs: Map, @@ -174,14 +174,14 @@ data class MyAdvertiseDataArgs ( ) { companion object { @Suppress("UNCHECKED_CAST") - fun fromList(list: List): MyAdvertiseDataArgs { + fun fromList(list: List): MyAdvertisementArgs { val nameArgs = list[0] as String? val serviceUUIDsArgs = list[1] as List val serviceDataArgs = list[2] as Map val manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = (list[3] as List?)?.let { MyManufacturerSpecificDataArgs.fromList(it) } - return MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) + return MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) } } fun toList(): List { @@ -654,7 +654,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() { return when (type) { 128.toByte() -> { return (readValue(buffer) as? List)?.let { - MyAdvertiseDataArgs.fromList(it) + MyAdvertisementArgs.fromList(it) } } 129.toByte() -> { @@ -682,7 +682,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() { } override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { when (value) { - is MyAdvertiseDataArgs -> { + is MyAdvertisementArgs -> { stream.write(128) writeValue(stream, value.toList()) } @@ -716,28 +716,60 @@ class MyCentralManagerFlutterApi(private val binaryMessenger: BinaryMessenger) { MyCentralManagerFlutterApiCodec } } - fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) { + fun onStateChanged(stateNumberArgsArg: Long, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged", codec) channel.send(listOf(stateNumberArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onDiscovered(peripheralArgsArg: MyPeripheralArgs, rssiArgsArg: Long, advertiseDataArgsArg: MyAdvertiseDataArgs, callback: () -> Unit) { + fun onDiscovered(peripheralArgsArg: MyPeripheralArgs, rssiArgsArg: Long, advertisementArgsArg: MyAdvertisementArgs, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered", codec) - channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertiseDataArgsArg)) { - callback() + channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertisementArgsArg)) { + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: () -> Unit) { + fun onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged", codec) channel.send(listOf(peripheralArgsArg, stateArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onCharacteristicValueChanged(characteristicArgsArg: MyGattCharacteristicArgs, valueArgsArg: ByteArray, callback: () -> Unit) { + fun onCharacteristicValueChanged(characteristicArgsArg: MyGattCharacteristicArgs, valueArgsArg: ByteArray, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged", codec) channel.send(listOf(characteristicArgsArg, valueArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } } @@ -747,7 +779,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() { return when (type) { 128.toByte() -> { return (readValue(buffer) as? List)?.let { - MyAdvertiseDataArgs.fromList(it) + MyAdvertisementArgs.fromList(it) } } 129.toByte() -> { @@ -780,7 +812,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() { } override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { when (value) { - is MyAdvertiseDataArgs -> { + is MyAdvertisementArgs -> { stream.write(128) writeValue(stream, value.toList()) } @@ -815,7 +847,7 @@ interface MyPeripheralManagerHostApi { fun addService(serviceArgs: MyGattServiceArgs, callback: (Result) -> Unit) fun removeService(serviceHashCodeArgs: Long) fun clearServices() - fun startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, callback: (Result) -> Unit) + fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result) -> Unit) fun stopAdvertising() fun getMaximumWriteLength(centralHashCodeArgs: Long): Long fun sendReadCharacteristicReply(centralHashCodeArgs: Long, characteristicHashCodeArgs: Long, idArgs: Long, offsetArgs: Long, statusArgs: Boolean, valueArgs: ByteArray) @@ -908,8 +940,8 @@ interface MyPeripheralManagerHostApi { if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List - val advertiseDataArgsArg = args[0] as MyAdvertiseDataArgs - api.startAdvertising(advertiseDataArgsArg) { result: Result -> + val advertisementArgsArg = args[0] as MyAdvertisementArgs + api.startAdvertising(advertisementArgsArg) { result: Result -> val error = result.exceptionOrNull() if (error != null) { reply.reply(wrapError(error)) @@ -1078,28 +1110,60 @@ class MyPeripheralManagerFlutterApi(private val binaryMessenger: BinaryMessenger MyPeripheralManagerFlutterApiCodec } } - fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) { + fun onStateChanged(stateNumberArgsArg: Long, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged", codec) channel.send(listOf(stateNumberArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onReadCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, callback: () -> Unit) { + fun onReadCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", codec) channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onWriteCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, valueArgsArg: ByteArray, callback: () -> Unit) { + fun onWriteCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, valueArgsArg: ByteArray, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", codec) channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg, valueArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } - fun onNotifyCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, stateArgsArg: Boolean, callback: () -> Unit) { + fun onNotifyCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, stateArgsArg: Boolean, callback: (Result) -> Unit) { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", codec) channel.send(listOf(centralArgsArg, characteristicArgsArg, stateArgsArg)) { - callback() + if (it is List<*>) { + if (it.size > 1) { + callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?))); + } else { + callback(Result.success(Unit)); + } + } else { + callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", ""))); + } } } } diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt index dedd6a6..7ca8c42 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyApi.kt @@ -43,7 +43,7 @@ val BluetoothDevice.uuid: UUID return UUID.fromString("00000000-0000-0000-0000-$node") } -val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs +val ScanResult.advertisementArgs: MyAdvertisementArgs get() { val record = scanRecord return if (record == null) { @@ -51,7 +51,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs val serviceUUIDsArgs = emptyList() val serviceDataArgs = emptyMap() val manufacturerSpecificDataArgs = null - MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) + MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) } else { val nameArgs = record.deviceName val serviceUUIDsArgs = record.serviceUuids?.map { uuid -> uuid.toString() } @@ -62,7 +62,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs }.toTypedArray() val serviceDataArgs = mapOf(*pairs) val manufacturerSpecificDataArgs = record.manufacturerSpecificData.toManufacturerSpecificDataArgs() - MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) + MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) } } @@ -99,7 +99,7 @@ val ScanRecord.rawValues: Map return rawValues.toMap() } -fun MyAdvertiseDataArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData { +fun MyAdvertisementArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData { val advertiseDataBuilder = AdvertiseData.Builder() if (nameArgs == null) { advertiseDataBuilder.setIncludeDeviceName(false) diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt index 0cf76da..6f56e1b 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyCentralManager.kt @@ -417,8 +417,8 @@ class MyCentralManager(private val context: Context, binaryMessenger: BinaryMess this.devices[hashCodeArgs] = device this.peripheralsArgs[hashCode] = peripheralArgs val rssiArgs = result.rssi.toLong() - val advertiseDataArgs = result.advertiseDataArgs - api.onDiscovered(peripheralArgs, rssiArgs, advertiseDataArgs) {} + val advertisementArgs = result.advertisementArgs + api.onDiscovered(peripheralArgs, rssiArgs, advertisementArgs) {} } fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { diff --git a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt index 3c28550..9dee30d 100644 --- a/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt +++ b/bluetooth_low_energy_android/android/src/main/kotlin/dev/yanshouwang/bluetooth_low_energy_android/MyPeripheralManager.kt @@ -203,13 +203,13 @@ class MyPeripheralManager(private val context: Context, binaryMessenger: BinaryM } } - override fun startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, callback: (Result) -> Unit) { + override fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result) -> Unit) { try { if (startAdvertisingCallback != null) { throw IllegalStateException() } val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).build() - val advertiseData = advertiseDataArgs.toAdvertiseData(adapter) + val advertiseData = advertisementArgs.toAdvertiseData(adapter) advertiser.startAdvertising(settings, advertiseData, advertiseCallback) startAdvertisingCallback = callback } catch (e: Throwable) { diff --git a/bluetooth_low_energy_android/example/lib/main.dart b/bluetooth_low_energy_android/example/lib/main.dart index e539942..813aa77 100644 --- a/bluetooth_low_energy_android/example/lib/main.dart +++ b/bluetooth_low_energy_android/example/lib/main.dart @@ -8,22 +8,35 @@ import 'package:convert/convert.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +CentralManager get centralManager => CentralManager.instance; +PeripheralManager get peripheralManager => PeripheralManager.instance; + void main() { runZonedGuarded(onStartUp, onCrashed); } void onStartUp() async { + Logger.root.onRecord.listen(onLogRecord); WidgetsFlutterBinding.ensureInitialized(); - await CentralManager.instance.setUp(); - await PeripheralManager.instance.setUp(); + await centralManager.setUp(); + await peripheralManager.setUp(); runApp(const MyApp()); } void onCrashed(Object error, StackTrace stackTrace) { + Logger.root.shout('App crached.', error, stackTrace); +} + +void onLogRecord(LogRecord record) { log( - '$error', - error: error, - stackTrace: stackTrace, + record.message, + time: record.time, + sequenceNumber: record.sequenceNumber, + level: record.level.value, + name: record.loggerName, + zone: record.zone, + error: record.error, + stackTrace: record.stackTrace, ); } @@ -138,8 +151,6 @@ class _HomeViewState extends State { } } -CentralManager get centralManager => CentralManager.instance; - class ScannerView extends StatefulWidget { const ScannerView({super.key}); @@ -237,7 +248,7 @@ class _ScannerViewState extends State { builder: (context, discoveredEventArgs, child) { // final items = discoveredEventArgs; final items = discoveredEventArgs - .where((eventArgs) => eventArgs.advertiseData.name != null) + .where((eventArgs) => eventArgs.advertisement.name != null) .toList(); return ListView.separated( itemBuilder: (context, i) { @@ -245,8 +256,8 @@ class _ScannerViewState extends State { final item = items[i]; final uuid = item.peripheral.uuid; final rssi = item.rssi; - final advertiseData = item.advertiseData; - final name = advertiseData.name; + final advertisement = item.advertisement; + final name = advertisement.name; return ListTile( onTap: () async { final discovering = this.discovering.value; @@ -273,7 +284,7 @@ class _ScannerViewState extends State { clipBehavior: Clip.antiAlias, builder: (context) { final manufacturerSpecificData = - advertiseData.manufacturerSpecificData; + advertisement.manufacturerSpecificData; return ListView.separated( padding: const EdgeInsets.symmetric( horizontal: 16.0, @@ -428,7 +439,7 @@ class _PeripheralViewState extends State { }, ); rssiTimer = Timer.periodic( - const Duration(seconds: 1), + const Duration(seconds: 5), (timer) async { final state = this.state.value; if (state) { @@ -458,7 +469,7 @@ class _PeripheralViewState extends State { } PreferredSizeWidget buildAppBar(BuildContext context) { - final title = eventArgs.advertiseData.name ?? ''; + final title = eventArgs.advertisement.name ?? ''; return AppBar( title: Text(title), actions: [ @@ -804,8 +815,6 @@ class _PeripheralViewState extends State { } } -PeripheralManager get peripheralManager => PeripheralManager.instance; - class AdvertiserView extends StatefulWidget { const AdvertiserView({super.key}); @@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget { State createState() => _AdvertiserViewState(); } -class _AdvertiserViewState extends State { +class _AdvertiserViewState extends State + with SingleTickerProviderStateMixin { late final ValueNotifier state; late final ValueNotifier advertising; late final ValueNotifier> logs; @@ -856,11 +866,11 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x01, 0x02, 0x03]); await peripheralManager.sendReadCharacteristicReply( central, - characteristic, - id, - offset, - status, - value, + characteristic: characteristic, + id: id, + offset: offset, + status: status, + value: value, ); }, ); @@ -884,10 +894,10 @@ class _AdvertiserViewState extends State { const status = true; await peripheralManager.sendWriteCharacteristicReply( central, - characteristic, - id, - offset, - status, + characteristic: characteristic, + id: id, + offset: offset, + status: status, ); }, ); @@ -911,8 +921,8 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x03, 0x02, 0x01]); await peripheralManager.notifyCharacteristicValueChanged( central, - characteristic, - value, + characteristic: characteristic, + value: value, ); } }, @@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State { ], ); await peripheralManager.addService(service); - final advertiseData = AdvertiseData( + final advertisement = Advertisement( name: 'flutter', manufacturerSpecificData: ManufacturerSpecificData( id: 0x2e19, data: Uint8List.fromList([0x01, 0x02, 0x03]), ), ); - await peripheralManager.startAdvertising(advertiseData); + await peripheralManager.startAdvertising(advertisement); advertising.value = true; } diff --git a/bluetooth_low_energy_android/example/pubspec.lock b/bluetooth_low_energy_android/example/pubspec.lock index d5217ff..72308a2 100644 --- a/bluetooth_low_energy_android/example/pubspec.lock +++ b/bluetooth_low_energy_android/example/pubspec.lock @@ -15,15 +15,15 @@ packages: path: ".." relative: true source: path - version: "3.0.4" + version: "4.0.0" bluetooth_low_energy_platform_interface: dependency: "direct main" description: name: bluetooth_low_energy_platform_interface - sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" + sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" boolean_selector: dependency: transitive description: @@ -102,10 +102,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -133,10 +133,18 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" + log_service: + dependency: transitive + description: + name: log_service + sha256: "21124936899e227d1779268077921d46d57456e2592d1562e455be273594e2e4" + url: "https://pub.dev" + source: hosted + version: "1.0.0" logging: dependency: transitive description: diff --git a/bluetooth_low_energy_android/example/pubspec.yaml b/bluetooth_low_energy_android/example/pubspec.yaml index b2eeb9d..692aa5a 100644 --- a/bluetooth_low_energy_android/example/pubspec.yaml +++ b/bluetooth_low_energy_android/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 bluetooth_low_energy_android: # When depending on this package from a real application you should use: # bluetooth_low_energy: ^x.y.z @@ -43,7 +43,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/bluetooth_low_energy_android/lib/bluetooth_low_energy_android.dart b/bluetooth_low_energy_android/lib/bluetooth_low_energy_android.dart index 3833335..c5effe3 100644 --- a/bluetooth_low_energy_android/lib/bluetooth_low_energy_android.dart +++ b/bluetooth_low_energy_android/lib/bluetooth_low_energy_android.dart @@ -1,9 +1,11 @@ import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'src/my_bluetooth_low_energy.dart'; +import 'src/my_central_manager2.dart'; +import 'src/my_peripheral_manager2.dart'; abstract class BluetoothLowEnergyAndroid { static void registerWith() { - BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); + MyCentralManager.instance = MyCentralManager2(); + MyPeripheralManager.instance = MyPeripheralManager2(); } } diff --git a/bluetooth_low_energy_android/lib/src/my_api.dart b/bluetooth_low_energy_android/lib/src/my_api.dart index e68f13e..a5f4075 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.dart @@ -15,8 +15,8 @@ extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs { } } -extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { - AdvertiseData toAdvertiseData() { +extension MyAdvertisementArgsX on MyAdvertisementArgs { + Advertisement toAdvertisement() { final name = nameArgs; final serviceUUIDs = serviceUUIDsArgs .cast() @@ -31,7 +31,7 @@ extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { ); final manufacturerSpecificData = manufacturerSpecificDataArgs?.toManufacturerSpecificData(); - return AdvertiseData( + return Advertisement( name: name, serviceUUIDs: serviceUUIDs, serviceData: serviceData, @@ -136,8 +136,8 @@ extension MyCentralArgsX on MyCentralArgs { } } -extension AdvertiseDataX on AdvertiseData { - MyAdvertiseDataArgs toArgs() { +extension AdvertisementX on Advertisement { + MyAdvertisementArgs toArgs() { final nameArgs = name; final serviceUUIDsArgs = serviceUUIDs.map((uuid) => uuid.toString()).toList(); @@ -147,7 +147,7 @@ extension AdvertiseDataX on AdvertiseData { return MapEntry(uuidArgs, dataArgs); }); final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs(); - return MyAdvertiseDataArgs( + return MyAdvertisementArgs( nameArgs: nameArgs, serviceUUIDsArgs: serviceUUIDsArgs, serviceDataArgs: serviceDataArgs, diff --git a/bluetooth_low_energy_android/lib/src/my_api.g.dart b/bluetooth_low_energy_android/lib/src/my_api.g.dart index 2121702..beab20d 100644 --- a/bluetooth_low_energy_android/lib/src/my_api.g.dart +++ b/bluetooth_low_energy_android/lib/src/my_api.g.dart @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v12.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -7,6 +7,15 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; +List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { + if (empty) { + return []; + } + if (error == null) { + return [result]; + } + return [error.code, error.message, error.details]; +} enum MyBluetoothLowEnergyStateArgs { unknown, @@ -123,8 +132,8 @@ class MyPeripheralArgs { } } -class MyAdvertiseDataArgs { - MyAdvertiseDataArgs({ +class MyAdvertisementArgs { + MyAdvertisementArgs({ this.nameArgs, required this.serviceUUIDsArgs, required this.serviceDataArgs, @@ -148,9 +157,9 @@ class MyAdvertiseDataArgs { ]; } - static MyAdvertiseDataArgs decode(Object result) { + static MyAdvertisementArgs decode(Object result) { result as List; - return MyAdvertiseDataArgs( + return MyAdvertisementArgs( nameArgs: result[0] as String?, serviceUUIDsArgs: (result[1] as List?)!.cast(), serviceDataArgs: (result[2] as Map?)!.cast(), @@ -681,7 +690,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec { const _MyCentralManagerFlutterApiCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is MyAdvertiseDataArgs) { + if (value is MyAdvertisementArgs) { buffer.putUint8(128); writeValue(buffer, value.encode()); } else if (value is MyGattCharacteristicArgs) { @@ -705,7 +714,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec { Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { case 128: - return MyAdvertiseDataArgs.decode(readValue(buffer)!); + return MyAdvertisementArgs.decode(readValue(buffer)!); case 129: return MyGattCharacteristicArgs.decode(readValue(buffer)!); case 130: @@ -725,7 +734,7 @@ abstract class MyCentralManagerFlutterApi { void onStateChanged(int stateNumberArgs); - void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertiseDataArgs advertiseDataArgs); + void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertisementArgs advertisementArgs); void onPeripheralStateChanged(MyPeripheralArgs peripheralArgs, bool stateArgs); @@ -746,8 +755,14 @@ abstract class MyCentralManagerFlutterApi { final int? arg_stateNumberArgs = (args[0] as int?); assert(arg_stateNumberArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.'); - api.onStateChanged(arg_stateNumberArgs!); - return; + try { + api.onStateChanged(arg_stateNumberArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -768,11 +783,17 @@ abstract class MyCentralManagerFlutterApi { final int? arg_rssiArgs = (args[1] as int?); assert(arg_rssiArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null int.'); - final MyAdvertiseDataArgs? arg_advertiseDataArgs = (args[2] as MyAdvertiseDataArgs?); - assert(arg_advertiseDataArgs != null, - 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertiseDataArgs.'); - api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertiseDataArgs!); - return; + final MyAdvertisementArgs? arg_advertisementArgs = (args[2] as MyAdvertisementArgs?); + assert(arg_advertisementArgs != null, + 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertisementArgs.'); + try { + api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertisementArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -793,8 +814,14 @@ abstract class MyCentralManagerFlutterApi { final bool? arg_stateArgs = (args[1] as bool?); assert(arg_stateArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.'); - api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); - return; + try { + api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -815,8 +842,14 @@ abstract class MyCentralManagerFlutterApi { final Uint8List? arg_valueArgs = (args[1] as Uint8List?); assert(arg_valueArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.'); - api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); - return; + try { + api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -827,7 +860,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec { const _MyPeripheralManagerHostApiCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is MyAdvertiseDataArgs) { + if (value is MyAdvertisementArgs) { buffer.putUint8(128); writeValue(buffer, value.encode()); } else if (value is MyGattCharacteristicArgs) { @@ -854,7 +887,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec { Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { case 128: - return MyAdvertiseDataArgs.decode(readValue(buffer)!); + return MyAdvertisementArgs.decode(readValue(buffer)!); case 129: return MyGattCharacteristicArgs.decode(readValue(buffer)!); case 130: @@ -974,12 +1007,12 @@ class MyPeripheralManagerHostApi { } } - Future startAdvertising(MyAdvertiseDataArgs arg_advertiseDataArgs) async { + Future startAdvertising(MyAdvertisementArgs arg_advertisementArgs) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostApi.startAdvertising', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_advertiseDataArgs]) as List?; + await channel.send([arg_advertisementArgs]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1171,8 +1204,14 @@ abstract class MyPeripheralManagerFlutterApi { final int? arg_stateNumberArgs = (args[0] as int?); assert(arg_stateNumberArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.'); - api.onStateChanged(arg_stateNumberArgs!); - return; + try { + api.onStateChanged(arg_stateNumberArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1199,8 +1238,14 @@ abstract class MyPeripheralManagerFlutterApi { final int? arg_offsetArgs = (args[3] as int?); assert(arg_offsetArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived was null, expected non-null int.'); - api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!); - return; + try { + api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1230,8 +1275,14 @@ abstract class MyPeripheralManagerFlutterApi { final Uint8List? arg_valueArgs = (args[4] as Uint8List?); assert(arg_valueArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived was null, expected non-null Uint8List.'); - api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!); - return; + try { + api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1255,8 +1306,14 @@ abstract class MyPeripheralManagerFlutterApi { final bool? arg_stateArgs = (args[2] as bool?); assert(arg_stateArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived was null, expected non-null bool.'); - api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!); - return; + try { + api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } diff --git a/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy.dart b/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy.dart deleted file mode 100644 index 752d659..0000000 --- a/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; - -import 'my_central_manager.dart'; -import 'my_peripheral_manager.dart'; - -class MyBluetoothLowEnergy extends BluetoothLowEnergy { - @override - final MyCentralManager centralManager; - @override - final MyPeripheralManager peripheralManager; - - MyBluetoothLowEnergy() - : centralManager = MyCentralManager(), - peripheralManager = MyPeripheralManager(); -} diff --git a/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy_manager.dart b/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy_manager.dart deleted file mode 100644 index 8082f8b..0000000 --- a/bluetooth_low_energy_android/lib/src/my_bluetooth_low_energy_manager.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'dart:async'; - -import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'package:flutter/foundation.dart'; - -abstract class MyBluetoothLowEnergyManager extends BluetoothLowEnergyManager { - MyBluetoothLowEnergyManager() - : _state = BluetoothLowEnergyState.unknown, - _stateChangedController = StreamController.broadcast(); - - final StreamController - _stateChangedController; - - BluetoothLowEnergyState _state; - @override - BluetoothLowEnergyState get state => _state; - @protected - set state(BluetoothLowEnergyState value) { - if (_state == value) { - return; - } - _state = value; - final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); - _stateChangedController.add(eventArgs); - } - - @override - Stream get stateChanged => - _stateChangedController.stream; - - @protected - Future throwWithoutState(BluetoothLowEnergyState state) async { - if (this.state != state) { - throw BluetoothLowEnergyError( - '$state is expected, but current state is ${this.state}.', - ); - } - } -} diff --git a/bluetooth_low_energy_android/lib/src/my_central_manager.dart b/bluetooth_low_energy_android/lib/src/my_central_manager2.dart similarity index 79% rename from bluetooth_low_energy_android/lib/src/my_central_manager.dart rename to bluetooth_low_energy_android/lib/src/my_central_manager2.dart index 394502e..dd66c07 100644 --- a/bluetooth_low_energy_android/lib/src/my_central_manager.dart +++ b/bluetooth_low_energy_android/lib/src/my_central_manager2.dart @@ -1,32 +1,48 @@ import 'dart:async'; -import 'dart:typed_data'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'package:logging/logging.dart'; +import 'package:flutter/foundation.dart'; import 'my_api.dart'; -import 'my_bluetooth_low_energy_manager.dart'; import 'my_gatt_characteristic2.dart'; import 'my_gatt_descriptor2.dart'; -class MyCentralManager extends MyBluetoothLowEnergyManager - implements CentralManager, MyCentralManagerFlutterApi { - final Logger _logger; +class MyCentralManager2 extends MyCentralManager + implements MyCentralManagerFlutterApi { final MyCentralManagerHostApi _api; + BluetoothLowEnergyState _state; + final StreamController + _stateChangedController; final StreamController _discoveredController; final StreamController _peripheralStateChangedController; final StreamController _characteristicValueChangedController; - MyCentralManager() - : _logger = Logger('MyCentralManager'), - _api = MyCentralManagerHostApi(), + MyCentralManager2() + : _api = MyCentralManagerHostApi(), + _state = BluetoothLowEnergyState.unknown, + _stateChangedController = StreamController.broadcast(), _discoveredController = StreamController.broadcast(), _peripheralStateChangedController = StreamController.broadcast(), _characteristicValueChangedController = StreamController.broadcast(); @override + BluetoothLowEnergyState get state => _state; + @protected + set state(BluetoothLowEnergyState value) { + if (_state == value) { + return; + } + _state = value; + final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); + _stateChangedController.add(eventArgs); + } + + @override + Stream get stateChanged => + _stateChangedController.stream; + @override Stream get discovered => _discoveredController.stream; @override Stream get peripheralStateChanged => @@ -36,6 +52,13 @@ class MyCentralManager extends MyBluetoothLowEnergyManager get characteristicValueChanged => _characteristicValueChangedController.stream; + Future _throwWithoutState(BluetoothLowEnergyState state) async { + if (this.state != state) { + throw StateError( + '$state is expected, but current state is ${this.state}.'); + } + } + @override Future setUp() async { final args = await _api.setUp(); @@ -47,26 +70,26 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future startDiscovery() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.startDiscovery(); } @override Future stopDiscovery() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.stopDiscovery(); } @override Future connect(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; await _api.connect(peripheralHashCodeArgs); } @override Future disconnect(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; await _api.disconnect(peripheralHashCodeArgs); } @@ -76,7 +99,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager Peripheral peripheral, { required GattCharacteristicWriteType type, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; final typeArgs = type.toArgs(); final typeNumberArgs = typeArgs.index; @@ -89,7 +112,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future readRSSI(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; final rssi = await _api.readRSSI(peripheralHashCodeArgs); return rssi; @@ -97,7 +120,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future> discoverGATT(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (peripheral is! MyPeripheral) { throw TypeError(); } @@ -123,9 +146,9 @@ class MyCentralManager extends MyBluetoothLowEnergyManager // TODO: 思考更好的解决方式,可以在连接后立即协商 MTU。 const mtuArgs = 517; await _api.requestMTU(peripheralHashCodeArgs, mtuArgs); - } catch (error, stack) { + } catch (error, stackTrace) { // 忽略协商 MTU 错误 - _logger.warning('requst MTU failed.', error, stack); + logger.warning('requst MTU failed.', error, stackTrace); } return services; } @@ -134,7 +157,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager Future readCharacteristic( GattCharacteristic characteristic, ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -155,7 +178,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager required Uint8List value, required GattCharacteristicWriteType type, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -179,7 +202,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager GattCharacteristic characteristic, { required bool state, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -197,7 +220,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future readDescriptor(GattDescriptor descriptor) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (descriptor is! MyGattDescriptor2) { throw TypeError(); } @@ -218,7 +241,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager GattDescriptor descriptor, { required Uint8List value, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (descriptor is! MyGattDescriptor2) { throw TypeError(); } @@ -245,15 +268,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager void onDiscovered( MyPeripheralArgs peripheralArgs, int rssiArgs, - MyAdvertiseDataArgs advertiseDataArgs, + MyAdvertisementArgs advertisementArgs, ) { final peripheral = peripheralArgs.toPeripheral(); final rssi = rssiArgs; - final advertiseData = advertiseDataArgs.toAdvertiseData(); + final advertisement = advertisementArgs.toAdvertisement(); final eventArgs = DiscoveredEventArgs( peripheral, rssi, - advertiseData, + advertisement, ); _discoveredController.add(eventArgs); } diff --git a/bluetooth_low_energy_darwin/lib/src/my_peripheral_manager.dart b/bluetooth_low_energy_android/lib/src/my_peripheral_manager2.dart similarity index 71% rename from bluetooth_low_energy_darwin/lib/src/my_peripheral_manager.dart rename to bluetooth_low_energy_android/lib/src/my_peripheral_manager2.dart index 628ec37..c0b5473 100644 --- a/bluetooth_low_energy_darwin/lib/src/my_peripheral_manager.dart +++ b/bluetooth_low_energy_android/lib/src/my_peripheral_manager2.dart @@ -1,14 +1,16 @@ import 'dart:async'; -import 'dart:typed_data'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; +import 'package:flutter/foundation.dart'; import 'my_api.dart'; -import 'my_bluetooth_low_energy_manager.dart'; -class MyPeripheralManager extends MyBluetoothLowEnergyManager - implements PeripheralManager, MyPeripheralManagerFlutterApi { +class MyPeripheralManager2 extends MyPeripheralManager + implements MyPeripheralManagerFlutterApi { final MyPeripheralManagerHostApi _api; + BluetoothLowEnergyState _state; + final StreamController + _stateChangedController; final StreamController _readCharacteristicCommandReceivedController; final StreamController @@ -16,8 +18,10 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager final StreamController _notifyCharacteristicCommandReceivedController; - MyPeripheralManager() + MyPeripheralManager2() : _api = MyPeripheralManagerHostApi(), + _state = BluetoothLowEnergyState.unknown, + _stateChangedController = StreamController.broadcast(), _readCharacteristicCommandReceivedController = StreamController.broadcast(), _writeCharacteristicCommandReceivedController = @@ -26,20 +30,40 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager StreamController.broadcast(); @override + BluetoothLowEnergyState get state => _state; + @protected + set state(BluetoothLowEnergyState value) { + if (_state == value) { + return; + } + _state = value; + final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); + _stateChangedController.add(eventArgs); + } + + @override + Stream get stateChanged => + _stateChangedController.stream; + @override Stream get readCharacteristicCommandReceived => _readCharacteristicCommandReceivedController.stream; - @override Stream get writeCharacteristicCommandReceived => _writeCharacteristicCommandReceivedController.stream; - @override Stream get notifyCharacteristicCommandReceived => _notifyCharacteristicCommandReceivedController.stream; + Future _throwWithoutState(BluetoothLowEnergyState state) async { + if (this.state != state) { + throw StateError( + '$state is expected, but current state is ${this.state}.'); + } + } + @override Future setUp() async { final args = await _api.setUp(); @@ -51,7 +75,7 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future addService(GattService service) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (service is! MyGattService) { throw TypeError(); } @@ -61,33 +85,33 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future removeService(GattService service) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final serviceHashCodeArgs = service.hashCode; await _api.removeService(serviceHashCodeArgs); } @override Future clearServices() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.clearServices(); } @override - Future startAdvertising(AdvertiseData advertiseData) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); - final advertiseDataArgs = advertiseData.toArgs(); - await _api.startAdvertising(advertiseDataArgs); + Future startAdvertising(Advertisement advertisement) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); + final advertisementArgs = advertisement.toArgs(); + await _api.startAdvertising(advertisementArgs); } @override Future stopAdvertising() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.stopAdvertising(); } @override Future getMaximumWriteLength(Central central) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final maximumWriteLength = await _api.getMaximumWriteLength(centralHashCodeArgs); @@ -96,14 +120,14 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future sendReadCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - Uint8List value, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + required Uint8List value, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final idArgs = id; @@ -122,13 +146,13 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future sendWriteCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final idArgs = id; @@ -145,11 +169,11 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future notifyCharacteristicValueChanged( - Central central, - GattCharacteristic characteristic, - Uint8List value, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required Uint8List value, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final valueArgs = value; diff --git a/bluetooth_low_energy_android/my_api.dart b/bluetooth_low_energy_android/my_api.dart index 686ca5b..1ddb6ee 100644 --- a/bluetooth_low_energy_android/my_api.dart +++ b/bluetooth_low_energy_android/my_api.dart @@ -66,7 +66,7 @@ abstract class MyCentralManagerFlutterApi { void onDiscovered( MyPeripheralArgs peripheralArgs, int rssiArgs, - MyAdvertiseDataArgs advertiseDataArgs, + MyAdvertisementArgs advertisementArgs, ); void onPeripheralStateChanged( MyPeripheralArgs peripheralArgs, @@ -87,7 +87,7 @@ abstract class MyPeripheralManagerHostApi { void removeService(int serviceHashCodeArgs); void clearServices(); @async - void startAdvertising(MyAdvertiseDataArgs advertiseDataArgs); + void startAdvertising(MyAdvertisementArgs advertisementArgs); void stopAdvertising(); int getMaximumWriteLength(int centralHashCodeArgs); void sendReadCharacteristicReply( @@ -162,13 +162,13 @@ class MyPeripheralArgs { MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs); } -class MyAdvertiseDataArgs { +class MyAdvertisementArgs { final String? nameArgs; final List serviceUUIDsArgs; final Map serviceDataArgs; final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs; - MyAdvertiseDataArgs( + MyAdvertisementArgs( this.nameArgs, this.serviceUUIDsArgs, this.serviceDataArgs, diff --git a/bluetooth_low_energy_android/pubspec.yaml b/bluetooth_low_energy_android/pubspec.yaml index 91cd501..2ac94c9 100644 --- a/bluetooth_low_energy_android/pubspec.yaml +++ b/bluetooth_low_energy_android/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy_android description: Android implementation of the bluetooth_low_energy plugin. -version: 3.0.4 +version: 4.0.0 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -10,14 +10,13 @@ environment: dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 - logging: ^1.2.0 + bluetooth_low_energy_platform_interface: ^4.0.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 - pigeon: ^11.0.1 + flutter_lints: ^3.0.0 + pigeon: ^12.0.1 flutter: plugin: diff --git a/bluetooth_low_energy_darwin/CHANGELOG.md b/bluetooth_low_energy_darwin/CHANGELOG.md index b9818ce..36d8ecd 100644 --- a/bluetooth_low_energy_darwin/CHANGELOG.md +++ b/bluetooth_low_energy_darwin/CHANGELOG.md @@ -1,3 +1,23 @@ +## 4.0.0 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Change some `PeripheralManager` methods' arguments to required optional arguments. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `BluetoothLowEnergyError` class. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Add `LogController` interface to `BluetoothLowEnergyManager`. +* Fix issues. + +## 4.0.0-dev.1 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Move `AdvertiseData` class to `Advertisement` class. +* Update `example`. + ## 3.0.2 * Fix the issue that `getMaximumWriteLength` is wrong and coerce the value from 20 to 512. diff --git a/bluetooth_low_energy_darwin/darwin/Classes/MyApi.g.swift b/bluetooth_low_energy_darwin/darwin/Classes/MyApi.g.swift index f6f3f79..08489b3 100644 --- a/bluetooth_low_energy_darwin/darwin/Classes/MyApi.g.swift +++ b/bluetooth_low_energy_darwin/darwin/Classes/MyApi.g.swift @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v12.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -140,13 +140,13 @@ struct MyPeripheralArgs { } /// Generated class from Pigeon that represents data sent in messages. -struct MyAdvertiseDataArgs { +struct MyAdvertisementArgs { var nameArgs: String? = nil var serviceUUIDsArgs: [String?] var serviceDataArgs: [String?: FlutterStandardTypedData?] var manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = nil - static func fromList(_ list: [Any?]) -> MyAdvertiseDataArgs? { + static func fromList(_ list: [Any?]) -> MyAdvertisementArgs? { let nameArgs: String? = nilOrValue(list[0]) let serviceUUIDsArgs = list[1] as! [String?] let serviceDataArgs = list[2] as! [String?: FlutterStandardTypedData?] @@ -155,7 +155,7 @@ struct MyAdvertiseDataArgs { manufacturerSpecificDataArgs = MyManufacturerSpecificDataArgs.fromList(manufacturerSpecificDataArgsList) } - return MyAdvertiseDataArgs( + return MyAdvertisementArgs( nameArgs: nameArgs, serviceUUIDsArgs: serviceUUIDsArgs, serviceDataArgs: serviceDataArgs, @@ -575,7 +575,7 @@ private class MyCentralManagerFlutterApiCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { case 128: - return MyAdvertiseDataArgs.fromList(self.readValue() as! [Any?]) + return MyAdvertisementArgs.fromList(self.readValue() as! [Any?]) case 129: return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?]) case 130: @@ -592,7 +592,7 @@ private class MyCentralManagerFlutterApiCodecReader: FlutterStandardReader { private class MyCentralManagerFlutterApiCodecWriter: FlutterStandardWriter { override func writeValue(_ value: Any) { - if let value = value as? MyAdvertiseDataArgs { + if let value = value as? MyAdvertisementArgs { super.writeByte(128) super.writeValue(value.toList()) } else if let value = value as? MyGattCharacteristicArgs { @@ -627,8 +627,14 @@ class MyCentralManagerFlutterApiCodec: FlutterStandardMessageCodec { static let shared = MyCentralManagerFlutterApiCodec(readerWriter: MyCentralManagerFlutterApiCodecReaderWriter()) } -/// Generated class from Pigeon that represents Flutter messages that can be called from Swift. -class MyCentralManagerFlutterApi { +/// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift. +protocol MyCentralManagerFlutterApiProtocol { + func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result) -> Void) + func onDiscovered(peripheralArgs peripheralArgsArg: MyPeripheralArgs, rssiArgs rssiArgsArg: Int64, advertisementArgs advertisementArgsArg: MyAdvertisementArgs, completion: @escaping (Result) -> Void) + func onPeripheralStateChanged(peripheralArgs peripheralArgsArg: MyPeripheralArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result) -> Void) + func onCharacteristicValueChanged(characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result) -> Void) +} +class MyCentralManagerFlutterApi: MyCentralManagerFlutterApiProtocol { private let binaryMessenger: FlutterBinaryMessenger init(binaryMessenger: FlutterBinaryMessenger){ self.binaryMessenger = binaryMessenger @@ -636,28 +642,28 @@ class MyCentralManagerFlutterApi { var codec: FlutterStandardMessageCodec { return MyCentralManagerFlutterApiCodec.shared } - func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping () -> Void) { + func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([stateNumberArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } - func onDiscovered(peripheralArgs peripheralArgsArg: MyPeripheralArgs, rssiArgs rssiArgsArg: Int64, advertiseDataArgs advertiseDataArgsArg: MyAdvertiseDataArgs, completion: @escaping () -> Void) { + func onDiscovered(peripheralArgs peripheralArgsArg: MyPeripheralArgs, rssiArgs rssiArgsArg: Int64, advertisementArgs advertisementArgsArg: MyAdvertisementArgs, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered", binaryMessenger: binaryMessenger, codec: codec) - channel.sendMessage([peripheralArgsArg, rssiArgsArg, advertiseDataArgsArg] as [Any?]) { _ in - completion() + channel.sendMessage([peripheralArgsArg, rssiArgsArg, advertisementArgsArg] as [Any?]) { _ in + completion(.success(Void())) } } - func onPeripheralStateChanged(peripheralArgs peripheralArgsArg: MyPeripheralArgs, stateArgs stateArgsArg: Bool, completion: @escaping () -> Void) { + func onPeripheralStateChanged(peripheralArgs peripheralArgsArg: MyPeripheralArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([peripheralArgsArg, stateArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } - func onCharacteristicValueChanged(characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping () -> Void) { + func onCharacteristicValueChanged(characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([characteristicArgsArg, valueArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } } @@ -665,7 +671,7 @@ private class MyPeripheralManagerHostApiCodecReader: FlutterStandardReader { override func readValue(ofType type: UInt8) -> Any? { switch type { case 128: - return MyAdvertiseDataArgs.fromList(self.readValue() as! [Any?]) + return MyAdvertisementArgs.fromList(self.readValue() as! [Any?]) case 129: return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?]) case 130: @@ -684,7 +690,7 @@ private class MyPeripheralManagerHostApiCodecReader: FlutterStandardReader { private class MyPeripheralManagerHostApiCodecWriter: FlutterStandardWriter { override func writeValue(_ value: Any) { - if let value = value as? MyAdvertiseDataArgs { + if let value = value as? MyAdvertisementArgs { super.writeByte(128) super.writeValue(value.toList()) } else if let value = value as? MyGattCharacteristicArgs { @@ -728,7 +734,7 @@ protocol MyPeripheralManagerHostApi { func addService(serviceArgs: MyGattServiceArgs, completion: @escaping (Result) -> Void) func removeService(serviceHashCodeArgs: Int64) throws func clearServices() throws - func startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, completion: @escaping (Result) -> Void) + func startAdvertising(advertisementArgs: MyAdvertisementArgs, completion: @escaping (Result) -> Void) func stopAdvertising() throws func getMaximumWriteLength(centralHashCodeArgs: Int64) throws -> Int64 func sendReadCharacteristicReply(centralHashCodeArgs: Int64, characteristicHashCodeArgs: Int64, idArgs: Int64, offsetArgs: Int64, statusArgs: Bool, valueArgs: FlutterStandardTypedData) throws @@ -806,8 +812,8 @@ class MyPeripheralManagerHostApiSetup { if let api = api { startAdvertisingChannel.setMessageHandler { message, reply in let args = message as! [Any?] - let advertiseDataArgsArg = args[0] as! MyAdvertiseDataArgs - api.startAdvertising(advertiseDataArgs: advertiseDataArgsArg) { result in + let advertisementArgsArg = args[0] as! MyAdvertisementArgs + api.startAdvertising(advertisementArgs: advertisementArgsArg) { result in switch result { case .success: reply(wrapResult(nil)) @@ -953,8 +959,14 @@ class MyPeripheralManagerFlutterApiCodec: FlutterStandardMessageCodec { static let shared = MyPeripheralManagerFlutterApiCodec(readerWriter: MyPeripheralManagerFlutterApiCodecReaderWriter()) } -/// Generated class from Pigeon that represents Flutter messages that can be called from Swift. -class MyPeripheralManagerFlutterApi { +/// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift. +protocol MyPeripheralManagerFlutterApiProtocol { + func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result) -> Void) + func onReadCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, completion: @escaping (Result) -> Void) + func onWriteCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result) -> Void) + func onNotifyCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result) -> Void) +} +class MyPeripheralManagerFlutterApi: MyPeripheralManagerFlutterApiProtocol { private let binaryMessenger: FlutterBinaryMessenger init(binaryMessenger: FlutterBinaryMessenger){ self.binaryMessenger = binaryMessenger @@ -962,28 +974,28 @@ class MyPeripheralManagerFlutterApi { var codec: FlutterStandardMessageCodec { return MyPeripheralManagerFlutterApiCodec.shared } - func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping () -> Void) { + func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([stateNumberArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } - func onReadCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, completion: @escaping () -> Void) { + func onReadCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } - func onWriteCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping () -> Void) { + func onWriteCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg, valueArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } - func onNotifyCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, stateArgs stateArgsArg: Bool, completion: @escaping () -> Void) { + func onNotifyCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result) -> Void) { let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) channel.sendMessage([centralArgsArg, characteristicArgsArg, stateArgsArg] as [Any?]) { _ in - completion() + completion(.success(Void())) } } } diff --git a/bluetooth_low_energy_darwin/darwin/Classes/MyApi.swift b/bluetooth_low_energy_darwin/darwin/Classes/MyApi.swift index 7c80b6b..682e546 100644 --- a/bluetooth_low_energy_darwin/darwin/Classes/MyApi.swift +++ b/bluetooth_low_energy_darwin/darwin/Classes/MyApi.swift @@ -16,6 +16,9 @@ import FlutterMacOS #error("Unsupported platform.") #endif +// This extension of Error is required to do use FlutterError in any Swift code. +extension FlutterError: Error {} + extension CBManagerState { func toArgs() -> MyBluetoothLowEnergyStateArgs { switch self { @@ -125,7 +128,7 @@ extension UInt16 { } extension [String: Any] { - func toAdvertiseDataArgs() -> MyAdvertiseDataArgs { + func toAdvertisementArgs() -> MyAdvertisementArgs { let nameArgs = self[CBAdvertisementDataLocalNameKey] as? String let serviceUUIDs = self[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] ?? [] let serviceUUIDsArgs = serviceUUIDs.map { uuid in uuid.uuidString } @@ -138,7 +141,7 @@ extension [String: Any] { let serviceDataArgs = [String?: FlutterStandardTypedData?](uniqueKeysWithValues: serviceDataArgsKeyWithValues) let manufacturerSpecificData = self[CBAdvertisementDataManufacturerDataKey] as? Data let manufacturerSpecificDataArgs = manufacturerSpecificData?.toManufacturerSpecificDataArgs() - return MyAdvertiseDataArgs(nameArgs: nameArgs, serviceUUIDsArgs: serviceUUIDsArgs, serviceDataArgs: serviceDataArgs, manufacturerSpecificDataArgs: manufacturerSpecificDataArgs) + return MyAdvertisementArgs(nameArgs: nameArgs, serviceUUIDsArgs: serviceUUIDsArgs, serviceDataArgs: serviceDataArgs, manufacturerSpecificDataArgs: manufacturerSpecificDataArgs) } } @@ -155,13 +158,13 @@ extension Data { } } -extension MyAdvertiseDataArgs { - func toAdvertiseData() throws -> [String : Any] { +extension MyAdvertisementArgs { + func toAdvertisement() throws -> [String : Any] { // CoreBluetooth only support `CBAdvertisementDataLocalNameKey` and `CBAdvertisementDataServiceUUIDsKey`, see https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising - var advertiseData = [String: Any]() + var advertisement = [String: Any]() if nameArgs != nil { let name = nameArgs! - advertiseData[CBAdvertisementDataLocalNameKey] = name + advertisement[CBAdvertisementDataLocalNameKey] = name } if serviceUUIDsArgs.count > 0 { var serviceUUIDs = [CBUUID]() @@ -172,7 +175,7 @@ extension MyAdvertiseDataArgs { let uuid = CBUUID(string: uuidArgs) serviceUUIDs.append(uuid) } - advertiseData[CBAdvertisementDataServiceUUIDsKey] = serviceUUIDs + advertisement[CBAdvertisementDataServiceUUIDsKey] = serviceUUIDs } // if serviceDataArgs.count > 0 { // var serviceData = [CBUUID: Data]() @@ -187,13 +190,13 @@ extension MyAdvertiseDataArgs { // let data = dataArgs.data // serviceData[uuid] = data // } -// advertiseData[CBAdvertisementDataServiceDataKey] = serviceData +// advertisement[CBAdvertisementDataServiceDataKey] = serviceData // } // if manufacturerSpecificDataArgs != nil { // let manufacturerSpecificData = manufacturerSpecificDataArgs!.toManufacturerSpecificData() -// advertiseData[CBAdvertisementDataManufacturerDataKey] = manufacturerSpecificData +// advertisement[CBAdvertisementDataManufacturerDataKey] = manufacturerSpecificData // } - return advertiseData + return advertisement } } diff --git a/bluetooth_low_energy_darwin/darwin/Classes/MyCentralManager.swift b/bluetooth_low_energy_darwin/darwin/Classes/MyCentralManager.swift index 84fbeb4..6a8ab9c 100644 --- a/bluetooth_low_energy_darwin/darwin/Classes/MyCentralManager.swift +++ b/bluetooth_low_energy_darwin/darwin/Classes/MyCentralManager.swift @@ -307,7 +307,7 @@ class MyCentralManager: MyCentralManagerHostApi { setUpCompletion!(.success(args)) setUpCompletion = nil } - api.onStateChanged(stateNumberArgs: stateNumberArgs) {} + api.onStateChanged(stateNumberArgs: stateNumberArgs) {_ in } } func didDiscover(_ peripheral: CBPeripheral, _ advertisementData: [String : Any], _ rssi: NSNumber) { @@ -318,8 +318,8 @@ class MyCentralManager: MyCentralManagerHostApi { peripherals[peripheralHashCodeArgs] = peripheral peripheralsArgs[peripheralHashCode] = peripheralArgs let rssiArgs = rssi.int64Value - let advertiseDataArgs = advertisementData.toAdvertiseDataArgs() - api.onDiscovered(peripheralArgs: peripheralArgs, rssiArgs: rssiArgs, advertiseDataArgs: advertiseDataArgs) {} + let advertisementArgs = advertisementData.toAdvertisementArgs() + api.onDiscovered(peripheralArgs: peripheralArgs, rssiArgs: rssiArgs, advertisementArgs: advertisementArgs) {_ in } } func didConnect(_ peripheral: CBPeripheral) { @@ -329,7 +329,7 @@ class MyCentralManager: MyCentralManagerHostApi { } let peripheralHashCodeArgs = peripheralArgs.hashCodeArgs let stateArgs = true - api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {} + api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {_ in } guard let completion = connectCompletions.removeValue(forKey: peripheralHashCodeArgs) else { return } @@ -390,7 +390,7 @@ class MyCentralManager: MyCentralManagerHostApi { } } let stateArgs = false - api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {} + api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {_ in } guard let completion = disconnectCompletions.removeValue(forKey: peripheralHashCodeArgs) else { return } @@ -550,7 +550,7 @@ class MyCentralManager: MyCentralManagerHostApi { guard let completion = readCharacteristicCompletions.removeValue(forKey: characteristicHashCodeArgs) else { let value = characteristic.value ?? Data() let valueArgs = FlutterStandardTypedData(bytes: value) - api.onCharacteristicValueChanged(characteristicArgs: characteristicArgs, valueArgs: valueArgs) {} + api.onCharacteristicValueChanged(characteristicArgs: characteristicArgs, valueArgs: valueArgs) {_ in } return } if error == nil { diff --git a/bluetooth_low_energy_darwin/darwin/Classes/MyPeripheralManager.swift b/bluetooth_low_energy_darwin/darwin/Classes/MyPeripheralManager.swift index ad4c9cf..25d3420 100644 --- a/bluetooth_low_energy_darwin/darwin/Classes/MyPeripheralManager.swift +++ b/bluetooth_low_energy_darwin/darwin/Classes/MyPeripheralManager.swift @@ -181,13 +181,13 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { self.servicesArgs.removeValue(forKey: serviceHashCode) } - func startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, completion: @escaping (Result) -> Void) { + func startAdvertising(advertisementArgs: MyAdvertisementArgs, completion: @escaping (Result) -> Void) { do { if startAdvertisingCompletion != nil { throw MyError.illegalState } - let advertisementData = try advertiseDataArgs.toAdvertiseData() - peripheralManager.startAdvertising(advertisementData) + let advertisement = try advertisementArgs.toAdvertisement() + peripheralManager.startAdvertising(advertisement) startAdvertisingCompletion = completion } catch { completion(.failure(error)) @@ -264,7 +264,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { setUpCompletion!(.success(args)) setUpCompletion = nil } - api.onStateChanged(stateNumberArgs: stateNumberArgs) {} + api.onStateChanged(stateNumberArgs: stateNumberArgs) {_ in } } func didAdd(_ service: CBService, _ error: Error?) { @@ -311,7 +311,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { let idArgs = Int64(request.hash) requests[idArgs] = request let offsetArgs = Int64(request.offset) - api.onReadCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, idArgs: idArgs, offsetArgs: offsetArgs) {} + api.onReadCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, idArgs: idArgs, offsetArgs: offsetArgs) {_ in } } func didReceiveWrite(_ requests: [CBATTRequest]) { @@ -343,7 +343,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { return } let valueArgs = FlutterStandardTypedData(bytes: value) - api.onWriteCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, idArgs: idArgs, offsetArgs: offsetArgs, valueArgs: valueArgs) {} + api.onWriteCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, idArgs: idArgs, offsetArgs: offsetArgs, valueArgs: valueArgs) {_ in } } func didSubscribeTo(_ central: CBCentral, _ characteristic: CBCharacteristic) { @@ -356,7 +356,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { return } let stateArgs = true - api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {} + api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {_ in } } func didUnsubscribeFrom(_ central: CBCentral, _ characteristic: CBCharacteristic) { @@ -369,7 +369,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi { return } let stateArgs = false - api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {} + api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {_ in } } func isReadyToUpdateSubscribers() { diff --git a/bluetooth_low_energy_darwin/example/ios/Podfile.lock b/bluetooth_low_energy_darwin/example/ios/Podfile.lock index f36c41d..01f97ed 100644 --- a/bluetooth_low_energy_darwin/example/ios/Podfile.lock +++ b/bluetooth_low_energy_darwin/example/ios/Podfile.lock @@ -26,4 +26,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 diff --git a/bluetooth_low_energy_darwin/example/lib/main.dart b/bluetooth_low_energy_darwin/example/lib/main.dart index e539942..813aa77 100644 --- a/bluetooth_low_energy_darwin/example/lib/main.dart +++ b/bluetooth_low_energy_darwin/example/lib/main.dart @@ -8,22 +8,35 @@ import 'package:convert/convert.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +CentralManager get centralManager => CentralManager.instance; +PeripheralManager get peripheralManager => PeripheralManager.instance; + void main() { runZonedGuarded(onStartUp, onCrashed); } void onStartUp() async { + Logger.root.onRecord.listen(onLogRecord); WidgetsFlutterBinding.ensureInitialized(); - await CentralManager.instance.setUp(); - await PeripheralManager.instance.setUp(); + await centralManager.setUp(); + await peripheralManager.setUp(); runApp(const MyApp()); } void onCrashed(Object error, StackTrace stackTrace) { + Logger.root.shout('App crached.', error, stackTrace); +} + +void onLogRecord(LogRecord record) { log( - '$error', - error: error, - stackTrace: stackTrace, + record.message, + time: record.time, + sequenceNumber: record.sequenceNumber, + level: record.level.value, + name: record.loggerName, + zone: record.zone, + error: record.error, + stackTrace: record.stackTrace, ); } @@ -138,8 +151,6 @@ class _HomeViewState extends State { } } -CentralManager get centralManager => CentralManager.instance; - class ScannerView extends StatefulWidget { const ScannerView({super.key}); @@ -237,7 +248,7 @@ class _ScannerViewState extends State { builder: (context, discoveredEventArgs, child) { // final items = discoveredEventArgs; final items = discoveredEventArgs - .where((eventArgs) => eventArgs.advertiseData.name != null) + .where((eventArgs) => eventArgs.advertisement.name != null) .toList(); return ListView.separated( itemBuilder: (context, i) { @@ -245,8 +256,8 @@ class _ScannerViewState extends State { final item = items[i]; final uuid = item.peripheral.uuid; final rssi = item.rssi; - final advertiseData = item.advertiseData; - final name = advertiseData.name; + final advertisement = item.advertisement; + final name = advertisement.name; return ListTile( onTap: () async { final discovering = this.discovering.value; @@ -273,7 +284,7 @@ class _ScannerViewState extends State { clipBehavior: Clip.antiAlias, builder: (context) { final manufacturerSpecificData = - advertiseData.manufacturerSpecificData; + advertisement.manufacturerSpecificData; return ListView.separated( padding: const EdgeInsets.symmetric( horizontal: 16.0, @@ -428,7 +439,7 @@ class _PeripheralViewState extends State { }, ); rssiTimer = Timer.periodic( - const Duration(seconds: 1), + const Duration(seconds: 5), (timer) async { final state = this.state.value; if (state) { @@ -458,7 +469,7 @@ class _PeripheralViewState extends State { } PreferredSizeWidget buildAppBar(BuildContext context) { - final title = eventArgs.advertiseData.name ?? ''; + final title = eventArgs.advertisement.name ?? ''; return AppBar( title: Text(title), actions: [ @@ -804,8 +815,6 @@ class _PeripheralViewState extends State { } } -PeripheralManager get peripheralManager => PeripheralManager.instance; - class AdvertiserView extends StatefulWidget { const AdvertiserView({super.key}); @@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget { State createState() => _AdvertiserViewState(); } -class _AdvertiserViewState extends State { +class _AdvertiserViewState extends State + with SingleTickerProviderStateMixin { late final ValueNotifier state; late final ValueNotifier advertising; late final ValueNotifier> logs; @@ -856,11 +866,11 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x01, 0x02, 0x03]); await peripheralManager.sendReadCharacteristicReply( central, - characteristic, - id, - offset, - status, - value, + characteristic: characteristic, + id: id, + offset: offset, + status: status, + value: value, ); }, ); @@ -884,10 +894,10 @@ class _AdvertiserViewState extends State { const status = true; await peripheralManager.sendWriteCharacteristicReply( central, - characteristic, - id, - offset, - status, + characteristic: characteristic, + id: id, + offset: offset, + status: status, ); }, ); @@ -911,8 +921,8 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x03, 0x02, 0x01]); await peripheralManager.notifyCharacteristicValueChanged( central, - characteristic, - value, + characteristic: characteristic, + value: value, ); } }, @@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State { ], ); await peripheralManager.addService(service); - final advertiseData = AdvertiseData( + final advertisement = Advertisement( name: 'flutter', manufacturerSpecificData: ManufacturerSpecificData( id: 0x2e19, data: Uint8List.fromList([0x01, 0x02, 0x03]), ), ); - await peripheralManager.startAdvertising(advertiseData); + await peripheralManager.startAdvertising(advertisement); advertising.value = true; } diff --git a/bluetooth_low_energy_darwin/example/macos/Podfile.lock b/bluetooth_low_energy_darwin/example/macos/Podfile.lock index 5d7ea3b..6e81df1 100644 --- a/bluetooth_low_energy_darwin/example/macos/Podfile.lock +++ b/bluetooth_low_energy_darwin/example/macos/Podfile.lock @@ -20,4 +20,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 -COCOAPODS: 1.11.3 +COCOAPODS: 1.12.1 diff --git a/bluetooth_low_energy_darwin/example/pubspec.lock b/bluetooth_low_energy_darwin/example/pubspec.lock index a7f2cf6..aa96aca 100644 --- a/bluetooth_low_energy_darwin/example/pubspec.lock +++ b/bluetooth_low_energy_darwin/example/pubspec.lock @@ -15,15 +15,15 @@ packages: path: ".." relative: true source: path - version: "3.0.2" + version: "4.0.0" bluetooth_low_energy_platform_interface: dependency: "direct main" description: name: bluetooth_low_energy_platform_interface - sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" + sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" boolean_selector: dependency: transitive description: @@ -102,10 +102,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -133,10 +133,26 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" + log_service: + dependency: transitive + description: + name: log_service + sha256: "21124936899e227d1779268077921d46d57456e2592d1562e455be273594e2e4" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + logging: + dependency: "direct main" + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: diff --git a/bluetooth_low_energy_darwin/example/pubspec.yaml b/bluetooth_low_energy_darwin/example/pubspec.yaml index e7bdf45..f7f26bc 100644 --- a/bluetooth_low_energy_darwin/example/pubspec.yaml +++ b/bluetooth_low_energy_darwin/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 bluetooth_low_energy_darwin: # When depending on this package from a real application you should use: # bluetooth_low_energy: ^x.y.z @@ -31,6 +31,7 @@ dependencies: cupertino_icons: ^1.0.2 convert: ^3.1.1 intl: ^0.18.1 + logging: ^1.2.0 dev_dependencies: integration_test: @@ -43,7 +44,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/bluetooth_low_energy_darwin/lib/bluetooth_low_energy_darwin.dart b/bluetooth_low_energy_darwin/lib/bluetooth_low_energy_darwin.dart index ba802f9..d38f2ba 100644 --- a/bluetooth_low_energy_darwin/lib/bluetooth_low_energy_darwin.dart +++ b/bluetooth_low_energy_darwin/lib/bluetooth_low_energy_darwin.dart @@ -1,9 +1,11 @@ import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'src/my_bluetooth_low_energy.dart'; +import 'src/my_central_manager_2.dart'; +import 'src/my_peripheral_manager_2.dart'; abstract class BluetoothLowEnergyDarwin { static void registerWith() { - BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); + MyCentralManager.instance = MyCentralManager2(); + MyPeripheralManager.instance = MyPeripheralManager2(); } } diff --git a/bluetooth_low_energy_darwin/lib/src/my_api.dart b/bluetooth_low_energy_darwin/lib/src/my_api.dart index 08e60d5..940f859 100644 --- a/bluetooth_low_energy_darwin/lib/src/my_api.dart +++ b/bluetooth_low_energy_darwin/lib/src/my_api.dart @@ -15,8 +15,8 @@ extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs { } } -extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { - AdvertiseData toAdvertiseData() { +extension MyAdvertisementArgsX on MyAdvertisementArgs { + Advertisement toAdvertisement() { final name = nameArgs; final serviceUUIDs = serviceUUIDsArgs .cast() @@ -31,7 +31,7 @@ extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { ); final manufacturerSpecificData = manufacturerSpecificDataArgs?.toManufacturerSpecificData(); - return AdvertiseData( + return Advertisement( name: name, serviceUUIDs: serviceUUIDs, serviceData: serviceData, @@ -136,8 +136,8 @@ extension MyCentralArgsX on MyCentralArgs { } } -extension AdvertiseDataX on AdvertiseData { - MyAdvertiseDataArgs toArgs() { +extension AdvertisementX on Advertisement { + MyAdvertisementArgs toArgs() { final nameArgs = name; final serviceUUIDsArgs = serviceUUIDs.map((uuid) => uuid.toString()).toList(); @@ -147,7 +147,7 @@ extension AdvertiseDataX on AdvertiseData { return MapEntry(uuidArgs, dataArgs); }); final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs(); - return MyAdvertiseDataArgs( + return MyAdvertisementArgs( nameArgs: nameArgs, serviceUUIDsArgs: serviceUUIDsArgs, serviceDataArgs: serviceDataArgs, diff --git a/bluetooth_low_energy_darwin/lib/src/my_api.g.dart b/bluetooth_low_energy_darwin/lib/src/my_api.g.dart index c5fd859..b275177 100644 --- a/bluetooth_low_energy_darwin/lib/src/my_api.g.dart +++ b/bluetooth_low_energy_darwin/lib/src/my_api.g.dart @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// Autogenerated from Pigeon (v12.0.1), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -7,6 +7,15 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List; import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer; import 'package:flutter/services.dart'; +List wrapResponse({Object? result, PlatformException? error, bool empty = false}) { + if (empty) { + return []; + } + if (error == null) { + return [result]; + } + return [error.code, error.message, error.details]; +} enum MyBluetoothLowEnergyStateArgs { unknown, @@ -123,8 +132,8 @@ class MyPeripheralArgs { } } -class MyAdvertiseDataArgs { - MyAdvertiseDataArgs({ +class MyAdvertisementArgs { + MyAdvertisementArgs({ this.nameArgs, required this.serviceUUIDsArgs, required this.serviceDataArgs, @@ -148,9 +157,9 @@ class MyAdvertiseDataArgs { ]; } - static MyAdvertiseDataArgs decode(Object result) { + static MyAdvertisementArgs decode(Object result) { result as List; - return MyAdvertiseDataArgs( + return MyAdvertisementArgs( nameArgs: result[0] as String?, serviceUUIDsArgs: (result[1] as List?)!.cast(), serviceDataArgs: (result[2] as Map?)!.cast(), @@ -654,7 +663,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec { const _MyCentralManagerFlutterApiCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is MyAdvertiseDataArgs) { + if (value is MyAdvertisementArgs) { buffer.putUint8(128); writeValue(buffer, value.encode()); } else if (value is MyGattCharacteristicArgs) { @@ -678,7 +687,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec { Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { case 128: - return MyAdvertiseDataArgs.decode(readValue(buffer)!); + return MyAdvertisementArgs.decode(readValue(buffer)!); case 129: return MyGattCharacteristicArgs.decode(readValue(buffer)!); case 130: @@ -698,7 +707,7 @@ abstract class MyCentralManagerFlutterApi { void onStateChanged(int stateNumberArgs); - void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertiseDataArgs advertiseDataArgs); + void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertisementArgs advertisementArgs); void onPeripheralStateChanged(MyPeripheralArgs peripheralArgs, bool stateArgs); @@ -719,8 +728,14 @@ abstract class MyCentralManagerFlutterApi { final int? arg_stateNumberArgs = (args[0] as int?); assert(arg_stateNumberArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.'); - api.onStateChanged(arg_stateNumberArgs!); - return; + try { + api.onStateChanged(arg_stateNumberArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -741,11 +756,17 @@ abstract class MyCentralManagerFlutterApi { final int? arg_rssiArgs = (args[1] as int?); assert(arg_rssiArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null int.'); - final MyAdvertiseDataArgs? arg_advertiseDataArgs = (args[2] as MyAdvertiseDataArgs?); - assert(arg_advertiseDataArgs != null, - 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertiseDataArgs.'); - api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertiseDataArgs!); - return; + final MyAdvertisementArgs? arg_advertisementArgs = (args[2] as MyAdvertisementArgs?); + assert(arg_advertisementArgs != null, + 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertisementArgs.'); + try { + api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertisementArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -766,8 +787,14 @@ abstract class MyCentralManagerFlutterApi { final bool? arg_stateArgs = (args[1] as bool?); assert(arg_stateArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.'); - api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); - return; + try { + api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -788,8 +815,14 @@ abstract class MyCentralManagerFlutterApi { final Uint8List? arg_valueArgs = (args[1] as Uint8List?); assert(arg_valueArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.'); - api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); - return; + try { + api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -800,7 +833,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec { const _MyPeripheralManagerHostApiCodec(); @override void writeValue(WriteBuffer buffer, Object? value) { - if (value is MyAdvertiseDataArgs) { + if (value is MyAdvertisementArgs) { buffer.putUint8(128); writeValue(buffer, value.encode()); } else if (value is MyGattCharacteristicArgs) { @@ -827,7 +860,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec { Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { case 128: - return MyAdvertiseDataArgs.decode(readValue(buffer)!); + return MyAdvertisementArgs.decode(readValue(buffer)!); case 129: return MyGattCharacteristicArgs.decode(readValue(buffer)!); case 130: @@ -947,12 +980,12 @@ class MyPeripheralManagerHostApi { } } - Future startAdvertising(MyAdvertiseDataArgs arg_advertiseDataArgs) async { + Future startAdvertising(MyAdvertisementArgs arg_advertisementArgs) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerHostApi.startAdvertising', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_advertiseDataArgs]) as List?; + await channel.send([arg_advertisementArgs]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -1144,8 +1177,14 @@ abstract class MyPeripheralManagerFlutterApi { final int? arg_stateNumberArgs = (args[0] as int?); assert(arg_stateNumberArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.'); - api.onStateChanged(arg_stateNumberArgs!); - return; + try { + api.onStateChanged(arg_stateNumberArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1172,8 +1211,14 @@ abstract class MyPeripheralManagerFlutterApi { final int? arg_offsetArgs = (args[3] as int?); assert(arg_offsetArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived was null, expected non-null int.'); - api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!); - return; + try { + api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1203,8 +1248,14 @@ abstract class MyPeripheralManagerFlutterApi { final Uint8List? arg_valueArgs = (args[4] as Uint8List?); assert(arg_valueArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived was null, expected non-null Uint8List.'); - api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!); - return; + try { + api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } @@ -1228,8 +1279,14 @@ abstract class MyPeripheralManagerFlutterApi { final bool? arg_stateArgs = (args[2] as bool?); assert(arg_stateArgs != null, 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived was null, expected non-null bool.'); - api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!); - return; + try { + api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!); + return wrapResponse(empty: true); + } on PlatformException catch (e) { + return wrapResponse(error: e); + } catch (e) { + return wrapResponse(error: PlatformException(code: 'error', message: e.toString())); + } }); } } diff --git a/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy.dart b/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy.dart deleted file mode 100644 index 752d659..0000000 --- a/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy.dart +++ /dev/null @@ -1,15 +0,0 @@ -import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; - -import 'my_central_manager.dart'; -import 'my_peripheral_manager.dart'; - -class MyBluetoothLowEnergy extends BluetoothLowEnergy { - @override - final MyCentralManager centralManager; - @override - final MyPeripheralManager peripheralManager; - - MyBluetoothLowEnergy() - : centralManager = MyCentralManager(), - peripheralManager = MyPeripheralManager(); -} diff --git a/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy_manager.dart b/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy_manager.dart deleted file mode 100644 index 8082f8b..0000000 --- a/bluetooth_low_energy_darwin/lib/src/my_bluetooth_low_energy_manager.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'dart:async'; - -import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'package:flutter/foundation.dart'; - -abstract class MyBluetoothLowEnergyManager extends BluetoothLowEnergyManager { - MyBluetoothLowEnergyManager() - : _state = BluetoothLowEnergyState.unknown, - _stateChangedController = StreamController.broadcast(); - - final StreamController - _stateChangedController; - - BluetoothLowEnergyState _state; - @override - BluetoothLowEnergyState get state => _state; - @protected - set state(BluetoothLowEnergyState value) { - if (_state == value) { - return; - } - _state = value; - final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); - _stateChangedController.add(eventArgs); - } - - @override - Stream get stateChanged => - _stateChangedController.stream; - - @protected - Future throwWithoutState(BluetoothLowEnergyState state) async { - if (this.state != state) { - throw BluetoothLowEnergyError( - '$state is expected, but current state is ${this.state}.', - ); - } - } -} diff --git a/bluetooth_low_energy_darwin/lib/src/my_central_manager.dart b/bluetooth_low_energy_darwin/lib/src/my_central_manager_2.dart similarity index 79% rename from bluetooth_low_energy_darwin/lib/src/my_central_manager.dart rename to bluetooth_low_energy_darwin/lib/src/my_central_manager_2.dart index 56ebd60..ea87df2 100644 --- a/bluetooth_low_energy_darwin/lib/src/my_central_manager.dart +++ b/bluetooth_low_energy_darwin/lib/src/my_central_manager_2.dart @@ -1,28 +1,47 @@ import 'dart:async'; -import 'dart:typed_data'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; +import 'package:flutter/foundation.dart'; import 'my_api.dart'; -import 'my_bluetooth_low_energy_manager.dart'; import 'my_gatt_characteristic2.dart'; import 'my_gatt_descriptor2.dart'; -class MyCentralManager extends MyBluetoothLowEnergyManager - implements CentralManager, MyCentralManagerFlutterApi { - MyCentralManager() - : _api = MyCentralManagerHostApi(), - _discoveredController = StreamController.broadcast(), - _peripheralStateChangedController = StreamController.broadcast(), - _characteristicValueChangedController = StreamController.broadcast(); - +class MyCentralManager2 extends MyCentralManager + implements MyCentralManagerFlutterApi { final MyCentralManagerHostApi _api; + BluetoothLowEnergyState _state; + final StreamController + _stateChangedController; final StreamController _discoveredController; final StreamController _peripheralStateChangedController; final StreamController _characteristicValueChangedController; + MyCentralManager2() + : _api = MyCentralManagerHostApi(), + _state = BluetoothLowEnergyState.unknown, + _stateChangedController = StreamController.broadcast(), + _discoveredController = StreamController.broadcast(), + _peripheralStateChangedController = StreamController.broadcast(), + _characteristicValueChangedController = StreamController.broadcast(); + + @override + BluetoothLowEnergyState get state => _state; + @protected + set state(BluetoothLowEnergyState value) { + if (_state == value) { + return; + } + _state = value; + final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); + _stateChangedController.add(eventArgs); + } + + @override + Stream get stateChanged => + _stateChangedController.stream; @override Stream get discovered => _discoveredController.stream; @override @@ -33,9 +52,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager get characteristicValueChanged => _characteristicValueChangedController.stream; + Future _throwWithoutState(BluetoothLowEnergyState state) async { + if (this.state != state) { + throw StateError( + '$state is expected, but current state is ${this.state}.'); + } + } + @override Future setUp() async { - await throwWithoutState(BluetoothLowEnergyState.unknown); final args = await _api.setUp(); final stateArgs = MyBluetoothLowEnergyStateArgs.values[args.stateNumberArgs]; @@ -45,26 +70,26 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future startDiscovery() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.startDiscovery(); } @override Future stopDiscovery() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.stopDiscovery(); } @override Future connect(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; await _api.connect(peripheralHashCodeArgs); } @override Future disconnect(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; await _api.disconnect(peripheralHashCodeArgs); } @@ -74,7 +99,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager Peripheral peripheral, { required GattCharacteristicWriteType type, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; final typeArgs = type.toArgs(); final typeNumberArgs = typeArgs.index; @@ -87,7 +112,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future readRSSI(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final peripheralHashCodeArgs = peripheral.hashCode; final rssi = await _api.readRSSI(peripheralHashCodeArgs); return rssi; @@ -95,7 +120,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future> discoverGATT(Peripheral peripheral) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (peripheral is! MyPeripheral) { throw TypeError(); } @@ -121,7 +146,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager Future readCharacteristic( GattCharacteristic characteristic, ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -142,7 +167,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager required Uint8List value, required GattCharacteristicWriteType type, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -166,7 +191,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager GattCharacteristic characteristic, { required bool state, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (characteristic is! MyGattCharacteristic2) { throw TypeError(); } @@ -184,7 +209,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager @override Future readDescriptor(GattDescriptor descriptor) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (descriptor is! MyGattDescriptor2) { throw TypeError(); } @@ -205,7 +230,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager GattDescriptor descriptor, { required Uint8List value, }) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (descriptor is! MyGattDescriptor2) { throw TypeError(); } @@ -232,15 +257,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager void onDiscovered( MyPeripheralArgs peripheralArgs, int rssiArgs, - MyAdvertiseDataArgs advertiseDataArgs, + MyAdvertisementArgs advertisementArgs, ) { final peripheral = peripheralArgs.toPeripheral(); final rssi = rssiArgs; - final advertiseData = advertiseDataArgs.toAdvertiseData(); + final advertisement = advertisementArgs.toAdvertisement(); final eventArgs = DiscoveredEventArgs( peripheral, rssi, - advertiseData, + advertisement, ); _discoveredController.add(eventArgs); } diff --git a/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart b/bluetooth_low_energy_darwin/lib/src/my_peripheral_manager_2.dart similarity index 71% rename from bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart rename to bluetooth_low_energy_darwin/lib/src/my_peripheral_manager_2.dart index 628ec37..c0b5473 100644 --- a/bluetooth_low_energy_android/lib/src/my_peripheral_manager.dart +++ b/bluetooth_low_energy_darwin/lib/src/my_peripheral_manager_2.dart @@ -1,14 +1,16 @@ import 'dart:async'; -import 'dart:typed_data'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; +import 'package:flutter/foundation.dart'; import 'my_api.dart'; -import 'my_bluetooth_low_energy_manager.dart'; -class MyPeripheralManager extends MyBluetoothLowEnergyManager - implements PeripheralManager, MyPeripheralManagerFlutterApi { +class MyPeripheralManager2 extends MyPeripheralManager + implements MyPeripheralManagerFlutterApi { final MyPeripheralManagerHostApi _api; + BluetoothLowEnergyState _state; + final StreamController + _stateChangedController; final StreamController _readCharacteristicCommandReceivedController; final StreamController @@ -16,8 +18,10 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager final StreamController _notifyCharacteristicCommandReceivedController; - MyPeripheralManager() + MyPeripheralManager2() : _api = MyPeripheralManagerHostApi(), + _state = BluetoothLowEnergyState.unknown, + _stateChangedController = StreamController.broadcast(), _readCharacteristicCommandReceivedController = StreamController.broadcast(), _writeCharacteristicCommandReceivedController = @@ -26,20 +30,40 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager StreamController.broadcast(); @override + BluetoothLowEnergyState get state => _state; + @protected + set state(BluetoothLowEnergyState value) { + if (_state == value) { + return; + } + _state = value; + final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state); + _stateChangedController.add(eventArgs); + } + + @override + Stream get stateChanged => + _stateChangedController.stream; + @override Stream get readCharacteristicCommandReceived => _readCharacteristicCommandReceivedController.stream; - @override Stream get writeCharacteristicCommandReceived => _writeCharacteristicCommandReceivedController.stream; - @override Stream get notifyCharacteristicCommandReceived => _notifyCharacteristicCommandReceivedController.stream; + Future _throwWithoutState(BluetoothLowEnergyState state) async { + if (this.state != state) { + throw StateError( + '$state is expected, but current state is ${this.state}.'); + } + } + @override Future setUp() async { final args = await _api.setUp(); @@ -51,7 +75,7 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future addService(GattService service) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); if (service is! MyGattService) { throw TypeError(); } @@ -61,33 +85,33 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future removeService(GattService service) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final serviceHashCodeArgs = service.hashCode; await _api.removeService(serviceHashCodeArgs); } @override Future clearServices() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.clearServices(); } @override - Future startAdvertising(AdvertiseData advertiseData) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); - final advertiseDataArgs = advertiseData.toArgs(); - await _api.startAdvertising(advertiseDataArgs); + Future startAdvertising(Advertisement advertisement) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); + final advertisementArgs = advertisement.toArgs(); + await _api.startAdvertising(advertisementArgs); } @override Future stopAdvertising() async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); await _api.stopAdvertising(); } @override Future getMaximumWriteLength(Central central) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final maximumWriteLength = await _api.getMaximumWriteLength(centralHashCodeArgs); @@ -96,14 +120,14 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future sendReadCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - Uint8List value, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + required Uint8List value, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final idArgs = id; @@ -122,13 +146,13 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future sendWriteCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final idArgs = id; @@ -145,11 +169,11 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager @override Future notifyCharacteristicValueChanged( - Central central, - GattCharacteristic characteristic, - Uint8List value, - ) async { - await throwWithoutState(BluetoothLowEnergyState.poweredOn); + Central central, { + required GattCharacteristic characteristic, + required Uint8List value, + }) async { + await _throwWithoutState(BluetoothLowEnergyState.poweredOn); final centralHashCodeArgs = central.hashCode; final characteristicHashCodeArgs = characteristic.hashCode; final valueArgs = value; diff --git a/bluetooth_low_energy_darwin/my_api.dart b/bluetooth_low_energy_darwin/my_api.dart index ef93a97..16dc110 100644 --- a/bluetooth_low_energy_darwin/my_api.dart +++ b/bluetooth_low_energy_darwin/my_api.dart @@ -60,7 +60,7 @@ abstract class MyCentralManagerFlutterApi { void onDiscovered( MyPeripheralArgs peripheralArgs, int rssiArgs, - MyAdvertiseDataArgs advertiseDataArgs, + MyAdvertisementArgs advertisementArgs, ); void onPeripheralStateChanged( MyPeripheralArgs peripheralArgs, @@ -81,7 +81,7 @@ abstract class MyPeripheralManagerHostApi { void removeService(int serviceHashCodeArgs); void clearServices(); @async - void startAdvertising(MyAdvertiseDataArgs advertiseDataArgs); + void startAdvertising(MyAdvertisementArgs advertisementArgs); void stopAdvertising(); int getMaximumWriteLength(int centralHashCodeArgs); void sendReadCharacteristicReply( @@ -156,13 +156,13 @@ class MyPeripheralArgs { MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs); } -class MyAdvertiseDataArgs { +class MyAdvertisementArgs { final String? nameArgs; final List serviceUUIDsArgs; final Map serviceDataArgs; final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs; - MyAdvertiseDataArgs( + MyAdvertisementArgs( this.nameArgs, this.serviceUUIDsArgs, this.serviceDataArgs, diff --git a/bluetooth_low_energy_darwin/pubspec.yaml b/bluetooth_low_energy_darwin/pubspec.yaml index 3e1101f..a4eddc8 100644 --- a/bluetooth_low_energy_darwin/pubspec.yaml +++ b/bluetooth_low_energy_darwin/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy_darwin description: iOS and macOS implementation of the bluetooth_low_energy plugin. -version: 3.0.2 +version: 4.0.0 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -10,13 +10,13 @@ environment: dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 - pigeon: ^11.0.1 + flutter_lints: ^3.0.0 + pigeon: ^12.0.1 flutter: plugin: diff --git a/bluetooth_low_energy_linux/CHANGELOG.md b/bluetooth_low_energy_linux/CHANGELOG.md index abb1b52..c1e304e 100644 --- a/bluetooth_low_energy_linux/CHANGELOG.md +++ b/bluetooth_low_energy_linux/CHANGELOG.md @@ -1,3 +1,23 @@ +## 4.0.0 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Change some `PeripheralManager` methods' arguments to required optional arguments. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `BluetoothLowEnergyError` class. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Add `LogController` interface to `BluetoothLowEnergyManager`. +* Fix issues. + +## 4.0.0-dev.1 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Move `AdvertiseData` class to `Advertisement` class. +* Update `example`. + ## 3.0.0 * Add `PeripheralManager` api. diff --git a/bluetooth_low_energy_linux/example/lib/main.dart b/bluetooth_low_energy_linux/example/lib/main.dart index e539942..813aa77 100644 --- a/bluetooth_low_energy_linux/example/lib/main.dart +++ b/bluetooth_low_energy_linux/example/lib/main.dart @@ -8,22 +8,35 @@ import 'package:convert/convert.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; +CentralManager get centralManager => CentralManager.instance; +PeripheralManager get peripheralManager => PeripheralManager.instance; + void main() { runZonedGuarded(onStartUp, onCrashed); } void onStartUp() async { + Logger.root.onRecord.listen(onLogRecord); WidgetsFlutterBinding.ensureInitialized(); - await CentralManager.instance.setUp(); - await PeripheralManager.instance.setUp(); + await centralManager.setUp(); + await peripheralManager.setUp(); runApp(const MyApp()); } void onCrashed(Object error, StackTrace stackTrace) { + Logger.root.shout('App crached.', error, stackTrace); +} + +void onLogRecord(LogRecord record) { log( - '$error', - error: error, - stackTrace: stackTrace, + record.message, + time: record.time, + sequenceNumber: record.sequenceNumber, + level: record.level.value, + name: record.loggerName, + zone: record.zone, + error: record.error, + stackTrace: record.stackTrace, ); } @@ -138,8 +151,6 @@ class _HomeViewState extends State { } } -CentralManager get centralManager => CentralManager.instance; - class ScannerView extends StatefulWidget { const ScannerView({super.key}); @@ -237,7 +248,7 @@ class _ScannerViewState extends State { builder: (context, discoveredEventArgs, child) { // final items = discoveredEventArgs; final items = discoveredEventArgs - .where((eventArgs) => eventArgs.advertiseData.name != null) + .where((eventArgs) => eventArgs.advertisement.name != null) .toList(); return ListView.separated( itemBuilder: (context, i) { @@ -245,8 +256,8 @@ class _ScannerViewState extends State { final item = items[i]; final uuid = item.peripheral.uuid; final rssi = item.rssi; - final advertiseData = item.advertiseData; - final name = advertiseData.name; + final advertisement = item.advertisement; + final name = advertisement.name; return ListTile( onTap: () async { final discovering = this.discovering.value; @@ -273,7 +284,7 @@ class _ScannerViewState extends State { clipBehavior: Clip.antiAlias, builder: (context) { final manufacturerSpecificData = - advertiseData.manufacturerSpecificData; + advertisement.manufacturerSpecificData; return ListView.separated( padding: const EdgeInsets.symmetric( horizontal: 16.0, @@ -428,7 +439,7 @@ class _PeripheralViewState extends State { }, ); rssiTimer = Timer.periodic( - const Duration(seconds: 1), + const Duration(seconds: 5), (timer) async { final state = this.state.value; if (state) { @@ -458,7 +469,7 @@ class _PeripheralViewState extends State { } PreferredSizeWidget buildAppBar(BuildContext context) { - final title = eventArgs.advertiseData.name ?? ''; + final title = eventArgs.advertisement.name ?? ''; return AppBar( title: Text(title), actions: [ @@ -804,8 +815,6 @@ class _PeripheralViewState extends State { } } -PeripheralManager get peripheralManager => PeripheralManager.instance; - class AdvertiserView extends StatefulWidget { const AdvertiserView({super.key}); @@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget { State createState() => _AdvertiserViewState(); } -class _AdvertiserViewState extends State { +class _AdvertiserViewState extends State + with SingleTickerProviderStateMixin { late final ValueNotifier state; late final ValueNotifier advertising; late final ValueNotifier> logs; @@ -856,11 +866,11 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x01, 0x02, 0x03]); await peripheralManager.sendReadCharacteristicReply( central, - characteristic, - id, - offset, - status, - value, + characteristic: characteristic, + id: id, + offset: offset, + status: status, + value: value, ); }, ); @@ -884,10 +894,10 @@ class _AdvertiserViewState extends State { const status = true; await peripheralManager.sendWriteCharacteristicReply( central, - characteristic, - id, - offset, - status, + characteristic: characteristic, + id: id, + offset: offset, + status: status, ); }, ); @@ -911,8 +921,8 @@ class _AdvertiserViewState extends State { final value = Uint8List.fromList([0x03, 0x02, 0x01]); await peripheralManager.notifyCharacteristicValueChanged( central, - characteristic, - value, + characteristic: characteristic, + value: value, ); } }, @@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State { ], ); await peripheralManager.addService(service); - final advertiseData = AdvertiseData( + final advertisement = Advertisement( name: 'flutter', manufacturerSpecificData: ManufacturerSpecificData( id: 0x2e19, data: Uint8List.fromList([0x01, 0x02, 0x03]), ), ); - await peripheralManager.startAdvertising(advertiseData); + await peripheralManager.startAdvertising(advertisement); advertising.value = true; } diff --git a/bluetooth_low_energy_linux/example/pubspec.lock b/bluetooth_low_energy_linux/example/pubspec.lock index 6c7e145..15358f2 100644 --- a/bluetooth_low_energy_linux/example/pubspec.lock +++ b/bluetooth_low_energy_linux/example/pubspec.lock @@ -23,15 +23,15 @@ packages: path: ".." relative: true source: path - version: "3.0.0" + version: "4.0.0" bluetooth_low_energy_platform_interface: dependency: "direct main" description: name: bluetooth_low_energy_platform_interface - sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" + sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356 url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "4.0.0" bluez: dependency: transitive description: @@ -134,10 +134,10 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5 url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "3.0.0" flutter_test: dependency: "direct dev" description: flutter @@ -165,10 +165,26 @@ packages: dependency: transitive description: name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.0.0" + log_service: + dependency: transitive + description: + name: log_service + sha256: "21124936899e227d1779268077921d46d57456e2592d1562e455be273594e2e4" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" matcher: dependency: transitive description: diff --git a/bluetooth_low_energy_linux/example/pubspec.yaml b/bluetooth_low_energy_linux/example/pubspec.yaml index 01adf70..e314fca 100644 --- a/bluetooth_low_energy_linux/example/pubspec.yaml +++ b/bluetooth_low_energy_linux/example/pubspec.yaml @@ -17,7 +17,7 @@ dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 bluetooth_low_energy_linux: # When depending on this package from a real application you should use: # bluetooth_low_energy: ^x.y.z @@ -43,7 +43,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec diff --git a/bluetooth_low_energy_linux/lib/bluetooth_low_energy_linux.dart b/bluetooth_low_energy_linux/lib/bluetooth_low_energy_linux.dart index fb8a4b9..f6bc83d 100644 --- a/bluetooth_low_energy_linux/lib/bluetooth_low_energy_linux.dart +++ b/bluetooth_low_energy_linux/lib/bluetooth_low_energy_linux.dart @@ -1,9 +1,9 @@ import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; -import 'src/my_bluetooth_low_energy.dart'; +import 'src/my_central_manager2.dart'; abstract class BluetoothLowEnergyLinux { static void registerWith() { - BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); + MyCentralManager.instance = MyCentralManager2(); } } diff --git a/bluetooth_low_energy_linux/lib/src/my_bluetooth_low_energy.dart b/bluetooth_low_energy_linux/lib/src/my_bluetooth_low_energy.dart deleted file mode 100644 index b25d715..0000000 --- a/bluetooth_low_energy_linux/lib/src/my_bluetooth_low_energy.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; - -import 'my_central_manager.dart'; - -class MyBluetoothLowEnergy extends BluetoothLowEnergy { - @override - final MyCentralManager centralManager; - @override - PeripheralManager get peripheralManager => throw UnimplementedError(); - - MyBluetoothLowEnergy() : centralManager = MyCentralManager(); -} diff --git a/bluetooth_low_energy_linux/lib/src/my_bluez.dart b/bluetooth_low_energy_linux/lib/src/my_bluez.dart index 2b40b07..c8ed459 100644 --- a/bluetooth_low_energy_linux/lib/src/my_bluez.dart +++ b/bluetooth_low_energy_linux/lib/src/my_bluez.dart @@ -27,7 +27,7 @@ extension BlueZDeviceX on BlueZDevice { List get myServices => gattServices.map((service) => MyGattService2(service)).toList(); - AdvertiseData get myAdvertiseData { + Advertisement get myAdvertisement { final myName = name.isNotEmpty ? name : null; final myServiceUUIDs = uuids.map((uuid) => uuid.toMyUUID()).toList(); final myServiceData = serviceData.map((uuid, data) { @@ -35,7 +35,7 @@ extension BlueZDeviceX on BlueZDevice { final myData = Uint8List.fromList(data); return MapEntry(myUUID, myData); }); - return AdvertiseData( + return Advertisement( name: myName, serviceUUIDs: myServiceUUIDs, serviceData: myServiceData, diff --git a/bluetooth_low_energy_linux/lib/src/my_central_manager.dart b/bluetooth_low_energy_linux/lib/src/my_central_manager2.dart similarity index 97% rename from bluetooth_low_energy_linux/lib/src/my_central_manager.dart rename to bluetooth_low_energy_linux/lib/src/my_central_manager2.dart index 63083e6..366c509 100644 --- a/bluetooth_low_energy_linux/lib/src/my_central_manager.dart +++ b/bluetooth_low_energy_linux/lib/src/my_central_manager2.dart @@ -11,8 +11,8 @@ import 'my_gatt_descriptor2.dart'; import 'my_gatt_service2.dart'; import 'my_peripheral2.dart'; -class MyCentralManager extends CentralManager { - MyCentralManager() +class MyCentralManager2 extends MyCentralManager { + MyCentralManager2() : _client = BlueZClient(), _stateChangedController = StreamController.broadcast(), _discoveredController = StreamController.broadcast(), @@ -60,9 +60,8 @@ class MyCentralManager extends CentralManager { Future _throwWithoutState(BluetoothLowEnergyState state) async { if (this.state != state) { - throw BluetoothLowEnergyError( - '$state is expected, but current state is ${this.state}.', - ); + throw StateError( + '$state is expected, but current state is ${this.state}.'); } } @@ -137,7 +136,7 @@ class MyCentralManager extends CentralManager { final myPeripheral = peripheral as MyPeripheral2; final device = myPeripheral.device; if (!device.connected) { - throw BluetoothLowEnergyError('Peripheral is disconnected.'); + throw StateError('Peripheral is disconnected.'); } if (!device.servicesResolved) { await _servicesResolved.firstWhere( @@ -241,7 +240,7 @@ class MyCentralManager extends CentralManager { void _onDiscovered(BlueZDevice device) { final myPeripheral = MyPeripheral2(device); final myRSSI = device.rssi; - final myAdvertiseData = device.myAdvertiseData; + final myAdvertiseData = device.myAdvertisement; final eventArgs = DiscoveredEventArgs( myPeripheral, myRSSI, diff --git a/bluetooth_low_energy_linux/pubspec.yaml b/bluetooth_low_energy_linux/pubspec.yaml index 3fa03ed..6b39a76 100644 --- a/bluetooth_low_energy_linux/pubspec.yaml +++ b/bluetooth_low_energy_linux/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy_linux description: Linux implementation of the bluetooth_low_energy plugin. -version: 3.0.0 +version: 4.0.0 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -10,13 +10,13 @@ environment: dependencies: flutter: sdk: flutter - bluetooth_low_energy_platform_interface: ^3.0.0 + bluetooth_low_energy_platform_interface: ^4.0.0 bluez: ^0.8.1 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0 flutter: plugin: diff --git a/bluetooth_low_energy_platform_interface/CHANGELOG.md b/bluetooth_low_energy_platform_interface/CHANGELOG.md index 3507f5a..9c5059e 100644 --- a/bluetooth_low_energy_platform_interface/CHANGELOG.md +++ b/bluetooth_low_energy_platform_interface/CHANGELOG.md @@ -1,3 +1,73 @@ +## 4.0.0 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Update `README.md`. +* Change some `PeripheralManager` methods' arguments to required optional arguments. +* Move `AdvertiseData` class to `Advertisement` class. +* Remove `BluetoothLowEnergyError` class. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Add `LogController` interface to `BluetoothLowEnergyManager`. +* Fix issues. + +## 4.0.0-dev.12 + +* Update `log_service` dependency. + +## 4.0.0-dev.11 + +* Use `log_service` instead of `logging` to simplify project structure. + +## 4.0.0-dev.10 + +* Fix the issue that messages were logged twice and other logger's messages were also logged by this logger. + +## 4.0.0-dev.9 + +* Remove `Logger`, use `logging` package instead. +* Add `SetUp` interface class and `MySetUp` mixin. +* Add `LoggerController` interface class and `MyLoggerController` mixin. +* Update `CentralManager` to implements `SetUp` and `LoggerController`. +* Update `PeripheralManager` to implements `SetUp` and `LoggerController`. + +## 4.0.0-dev.8 + +* Remove `BluetoothLowEnergyError`, use `PlatformException` instead. +* Add `MyCentralManager` and `MyPeripheralManager` abstract classes. +* Optimize project's structure. + +## 4.0.0-dev.7 + +* Remove `Logger.level` filed, as the level of `logging` package is a global option, which can be changed by anyone. + +## 4.0.0-dev.6 + +* Move `AdvertiseData` class to `Advertisement` class. + +## 4.0.0-dev.5 + +* Fix export error. + +## 4.0.0-dev.4 + +* Optimize project's structure. + +## 4.0.0-dev.3 + +* Change some `PeripheralManager` methods' arguments to required optional arguments. + +## 4.0.0-dev.2 + +* Add `Logger` class. + +## 4.0.0-dev.1 + +* Remove `BluetoothLowEnergy` class. +* Update `CentralManger` to extends `PlatformInterface`. +* Update `PeripheralManager` to extends `PlatformInterface`. +* Update `README.md`. + ## 3.0.0 * Add `PeripheralManager` api. diff --git a/bluetooth_low_energy_platform_interface/README.md b/bluetooth_low_energy_platform_interface/README.md index 589a8f2..0e3c975 100644 --- a/bluetooth_low_energy_platform_interface/README.md +++ b/bluetooth_low_energy_platform_interface/README.md @@ -8,11 +8,13 @@ same interface. # Usage -To implement a new platform-specific implementation of `bluetooth_low_energy`, extend -[`CentralController`][2] with an implementation that performs the +To implement a new platform-specific implementation of `bluetooth_low_energy`, +extend [`MyCentralManager`][2] with an implementation that performs the platform-specific behavior, and when you register your plugin, set the default -`CentralController` by calling -`CentralController.instance = MyCentralController()`. +`MyCentralManager` by calling `MyCentralManager.instance = MyCentralManagerImpl()`, +extend [`MyPeripheralManager`][3] with an implementation that performs the +platform-specific behavior, and when you register your plugin, set the default +`MyPeripheralManager` by calling `MyPeripheralManager.instance = MyPeripheralManagerImpl()`. # Note on breaking changes @@ -23,4 +25,5 @@ See https://flutter.dev/go/platform-interface-breaking-changes for a discussion on why a less-clean interface is preferable to a breaking change. [1]: https://pub.dev/packages/bluetooth_low_energy -[2]: lib/src/central_controller.dart +[2]: lib/src/central_manager.dart +[3]: lib/src/peripheral_manager.dart diff --git a/bluetooth_low_energy_platform_interface/lib/bluetooth_low_energy_platform_interface.dart b/bluetooth_low_energy_platform_interface/lib/bluetooth_low_energy_platform_interface.dart index 0b3623a..67d9b82 100644 --- a/bluetooth_low_energy_platform_interface/lib/bluetooth_low_energy_platform_interface.dart +++ b/bluetooth_low_energy_platform_interface/lib/bluetooth_low_energy_platform_interface.dart @@ -1,24 +1,38 @@ -export 'src/errors.dart'; +/// A common platform interface for the [`bluetooth_low_energy`][1] plugin. +/// +/// This interface allows platform-specific implementations of the `bluetooth_low_energy` +/// plugin, as well as the plugin itself, to ensure they are supporting the +/// same interface. +/// +/// [1]: https://pub.dev/packages/bluetooth_low_energy +library; + +export 'package:log_service/log_service.dart'; + export 'src/event_args.dart'; -export 'src/bluetooth_low_energy.dart'; -export 'src/bluetooth_low_energy_manager.dart'; export 'src/bluetooth_low_energy_state.dart'; -export 'src/central_manager.dart'; -export 'src/peripheral_manager.dart'; +export 'src/bluetooth_low_energy_event_args.dart'; +export 'src/bluetooth_low_energy_manager.dart'; export 'src/bluetooth_low_energy_peer.dart'; +export 'src/central_manager_event_args.dart'; +export 'src/central_manager.dart'; export 'src/central.dart'; +export 'src/peripheral_manager_event_args.dart'; +export 'src/peripheral_manager.dart'; export 'src/peripheral.dart'; export 'src/uuid.dart'; -export 'src/advertise_data.dart'; +export 'src/advertisement.dart'; export 'src/manufacturer_specific_data.dart'; export 'src/gatt_service.dart'; export 'src/gatt_characteristic.dart'; export 'src/gatt_characteristic_property.dart'; export 'src/gatt_characteristic_write_type.dart'; export 'src/gatt_descriptor.dart'; +export 'src/my_central_manager.dart'; +export 'src/my_peripheral_manager.dart'; export 'src/my_object.dart'; +export 'src/my_central.dart'; export 'src/my_peripheral.dart'; export 'src/my_gatt_service.dart'; export 'src/my_gatt_characteristic.dart'; export 'src/my_gatt_descriptor.dart'; -export 'src/my_central.dart'; diff --git a/bluetooth_low_energy_platform_interface/lib/src/advertise_data.dart b/bluetooth_low_energy_platform_interface/lib/src/advertisement.dart similarity index 81% rename from bluetooth_low_energy_platform_interface/lib/src/advertise_data.dart rename to bluetooth_low_energy_platform_interface/lib/src/advertisement.dart index 6a554c1..3ea7d40 100644 --- a/bluetooth_low_energy_platform_interface/lib/src/advertise_data.dart +++ b/bluetooth_low_energy_platform_interface/lib/src/advertisement.dart @@ -3,8 +3,8 @@ import 'dart:typed_data'; import 'manufacturer_specific_data.dart'; import 'uuid.dart'; -/// The advertise data discovered from a peripheral. -class AdvertiseData { +/// The advertisement of the peripheral. +class Advertisement { /// The name of the peripheral. final String? name; @@ -17,8 +17,8 @@ class AdvertiseData { /// The manufacturer specific data of the peripheral. final ManufacturerSpecificData? manufacturerSpecificData; - /// Constructs an [AdvertiseData]. - AdvertiseData({ + /// Constructs an [Advertisement]. + Advertisement({ this.name, this.serviceUUIDs = const [], this.serviceData = const {}, diff --git a/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy.dart b/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy.dart deleted file mode 100644 index fe0bb2c..0000000 --- a/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy.dart +++ /dev/null @@ -1,41 +0,0 @@ -import 'package:plugin_platform_interface/plugin_platform_interface.dart'; - -import 'central_manager.dart'; -import 'peripheral_manager.dart'; - -/// The bluetooth low energy interface. -/// -/// Call `setUp` before use any api. -abstract class BluetoothLowEnergy extends PlatformInterface { - /// Constructs a [BluetoothLowEnergy]. - BluetoothLowEnergy() : super(token: _token); - - static final Object _token = Object(); - - static BluetoothLowEnergy? _instance; - - /// The default instance of [BluetoothLowEnergy] to use. - static BluetoothLowEnergy get instance { - final instance = _instance; - if (instance == null) { - throw UnimplementedError( - '`BluetoothLowEnergy` is not implemented on this platform.', - ); - } - return instance; - } - - /// Platform-specific implementations should set this with their own - /// platform-specific class that extends [BluetoothLowEnergy] when - /// they register themselves. - static set instance(BluetoothLowEnergy instance) { - PlatformInterface.verifyToken(instance, _token); - _instance = instance; - } - - /// Gets the instance of central manager. - CentralManager get centralManager; - - /// Gets the instance of peripheral manager. - PeripheralManager get peripheralManager; -} diff --git a/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_event_args.dart b/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_event_args.dart new file mode 100644 index 0000000..4b1afb1 --- /dev/null +++ b/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_event_args.dart @@ -0,0 +1,11 @@ +import 'bluetooth_low_energy_state.dart'; +import 'event_args.dart'; + +/// The bluetooth low energy state changed event arguments. +class BluetoothLowEnergyStateChangedEventArgs extends EventArgs { + /// The new state of the bluetooth low energy. + final BluetoothLowEnergyState state; + + /// Constructs a [BluetoothLowEnergyStateChangedEventArgs]. + BluetoothLowEnergyStateChangedEventArgs(this.state); +} diff --git a/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_manager.dart b/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_manager.dart index b442f24..b432a17 100644 --- a/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_manager.dart +++ b/bluetooth_low_energy_platform_interface/lib/src/bluetooth_low_energy_manager.dart @@ -1,14 +1,16 @@ +import 'package:log_service/log_service.dart'; + +import 'bluetooth_low_energy_event_args.dart'; import 'bluetooth_low_energy_state.dart'; -import 'event_args.dart'; /// The abstract base class that manages central and peripheral objects. -abstract class BluetoothLowEnergyManager { +abstract class BluetoothLowEnergyManager implements LogController { /// The current state of the manager. BluetoothLowEnergyState get state; /// Tells the manager’s state updated. Stream get stateChanged; - /// Sets up this bluetooth low energy manager. + /// Sets up the manager. Future setUp(); } diff --git a/bluetooth_low_energy_platform_interface/lib/src/central_manager.dart b/bluetooth_low_energy_platform_interface/lib/src/central_manager.dart index 732b304..ed5bd53 100644 --- a/bluetooth_low_energy_platform_interface/lib/src/central_manager.dart +++ b/bluetooth_low_energy_platform_interface/lib/src/central_manager.dart @@ -1,19 +1,18 @@ import 'dart:typed_data'; -import 'bluetooth_low_energy.dart'; import 'bluetooth_low_energy_manager.dart'; -import 'event_args.dart'; +import 'central_manager_event_args.dart'; import 'gatt_characteristic.dart'; import 'gatt_characteristic_write_type.dart'; import 'gatt_descriptor.dart'; import 'gatt_service.dart'; +import 'my_central_manager.dart'; import 'peripheral.dart'; /// An object that scans for, discovers, connects to, and manages peripherals. abstract class CentralManager extends BluetoothLowEnergyManager { - /// Gets the instance of [CentralManager]. - static CentralManager get instance => - BluetoothLowEnergy.instance.centralManager; + /// The instance of [CentralManager] to use. + static CentralManager get instance => MyCentralManager.instance; /// Tells the central manager discovered a peripheral while scanning for devices. Stream get discovered; diff --git a/bluetooth_low_energy_platform_interface/lib/src/central_manager_event_args.dart b/bluetooth_low_energy_platform_interface/lib/src/central_manager_event_args.dart new file mode 100644 index 0000000..59c2482 --- /dev/null +++ b/bluetooth_low_energy_platform_interface/lib/src/central_manager_event_args.dart @@ -0,0 +1,45 @@ +import 'dart:typed_data'; + +import 'advertisement.dart'; +import 'event_args.dart'; +import 'gatt_characteristic.dart'; +import 'peripheral.dart'; + +/// The discovered event arguments. +class DiscoveredEventArgs extends EventArgs { + /// The disvered peripheral. + final Peripheral peripheral; + + /// The rssi of the peripheral. + final int rssi; + + /// The advertisement of the peripheral. + final Advertisement advertisement; + + /// Constructs a [DiscoveredEventArgs]. + DiscoveredEventArgs(this.peripheral, this.rssi, this.advertisement); +} + +/// The peripheral state changed event arguments. +class PeripheralStateChangedEventArgs extends EventArgs { + /// The peripheral which state is changed. + final Peripheral peripheral; + + /// The new state of the peripheral. + final bool state; + + /// Constructs a [PeripheralStateChangedEventArgs]. + PeripheralStateChangedEventArgs(this.peripheral, this.state); +} + +/// The GATT characteristic value changed event arguments. +class GattCharacteristicValueChangedEventArgs extends EventArgs { + /// The GATT characteristic which value is changed. + final GattCharacteristic characteristic; + + /// The changed value of the characteristic. + final Uint8List value; + + /// Constructs a [GattCharacteristicValueChangedEventArgs]. + GattCharacteristicValueChangedEventArgs(this.characteristic, this.value); +} diff --git a/bluetooth_low_energy_platform_interface/lib/src/errors.dart b/bluetooth_low_energy_platform_interface/lib/src/errors.dart deleted file mode 100644 index 6c4b83e..0000000 --- a/bluetooth_low_energy_platform_interface/lib/src/errors.dart +++ /dev/null @@ -1,13 +0,0 @@ -/// The bluetooth low energy error. -class BluetoothLowEnergyError extends Error { - /// The message of this error. - final String message; - - /// Constructs a [BluetoothLowEnergyError]. - BluetoothLowEnergyError(this.message); - - @override - String toString() { - return 'BluetoothLowEnergyError: $message'; - } -} diff --git a/bluetooth_low_energy_platform_interface/lib/src/event_args.dart b/bluetooth_low_energy_platform_interface/lib/src/event_args.dart index b5b5c95..1e449c7 100644 --- a/bluetooth_low_energy_platform_interface/lib/src/event_args.dart +++ b/bluetooth_low_energy_platform_interface/lib/src/event_args.dart @@ -1,100 +1,2 @@ -import 'dart:typed_data'; - -import 'advertise_data.dart'; -import 'bluetooth_low_energy_state.dart'; -import 'central.dart'; -import 'gatt_characteristic.dart'; -import 'peripheral.dart'; - /// The base event arguments. abstract class EventArgs {} - -/// The bluetooth low energy state changed event arguments. -class BluetoothLowEnergyStateChangedEventArgs extends EventArgs { - /// The new state of the bluetooth low energy. - final BluetoothLowEnergyState state; - - /// Constructs a [BluetoothLowEnergyStateChangedEventArgs]. - BluetoothLowEnergyStateChangedEventArgs(this.state); -} - -/// The discovered event arguments. -class DiscoveredEventArgs extends EventArgs { - /// The disvered peripheral. - final Peripheral peripheral; - - /// The rssi of the peripheral. - final int rssi; - - /// The advertise data of the peripheral. - final AdvertiseData advertiseData; - - /// Constructs a [DiscoveredEventArgs]. - DiscoveredEventArgs(this.peripheral, this.rssi, this.advertiseData); -} - -/// The peripheral state changed event arguments. -class PeripheralStateChangedEventArgs extends EventArgs { - /// The peripheral which state is changed. - final Peripheral peripheral; - - /// The new state of the peripheral. - final bool state; - - /// Constructs a [PeripheralStateChangedEventArgs]. - PeripheralStateChangedEventArgs(this.peripheral, this.state); -} - -/// The GATT characteristic value changed event arguments. -class GattCharacteristicValueChangedEventArgs extends EventArgs { - /// The GATT characteristic which value is changed. - final GattCharacteristic characteristic; - - /// The changed value of the characteristic. - final Uint8List value; - - /// Constructs a [GattCharacteristicValueChangedEventArgs]. - GattCharacteristicValueChangedEventArgs(this.characteristic, this.value); -} - -class ReadGattCharacteristicCommandEventArgs { - final Central central; - final GattCharacteristic characteristic; - final int id; - final int offset; - - ReadGattCharacteristicCommandEventArgs( - this.central, - this.characteristic, - this.id, - this.offset, - ); -} - -class WriteGattCharacteristicCommandEventArgs { - final Central central; - final GattCharacteristic characteristic; - final int id; - final int offset; - final Uint8List value; - - WriteGattCharacteristicCommandEventArgs( - this.central, - this.characteristic, - this.id, - this.offset, - this.value, - ); -} - -class NotifyGattCharacteristicCommandEventArgs { - final Central central; - final GattCharacteristic characteristic; - final bool state; - - NotifyGattCharacteristicCommandEventArgs( - this.central, - this.characteristic, - this.state, - ); -} diff --git a/bluetooth_low_energy_platform_interface/lib/src/my_central_manager.dart b/bluetooth_low_energy_platform_interface/lib/src/my_central_manager.dart new file mode 100644 index 0000000..256f840 --- /dev/null +++ b/bluetooth_low_energy_platform_interface/lib/src/my_central_manager.dart @@ -0,0 +1,41 @@ +import 'package:flutter/cupertino.dart'; +import 'package:log_service/log_service.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'central_manager.dart'; + +/// Platform-specific implementations should implement this class to support +/// [CentralManager]. +abstract class MyCentralManager extends PlatformInterface + with LoggerController + implements CentralManager { + static final Object _token = Object(); + + static MyCentralManager? _instance; + + /// The default instance of [MyCentralManager] to use. + static MyCentralManager get instance { + final instance = _instance; + if (instance == null) { + throw UnimplementedError( + 'CentralManager is not implemented on this platform.', + ); + } + return instance; + } + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [MyCentralManager] when + /// they register themselves. + static set instance(MyCentralManager instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + /// Constructs a [MyCentralManager]. + MyCentralManager() : super(token: _token); + + @protected + @override + Logger get logger => Logger('$CentralManager'); +} diff --git a/bluetooth_low_energy_platform_interface/lib/src/my_peripheral_manager.dart b/bluetooth_low_energy_platform_interface/lib/src/my_peripheral_manager.dart new file mode 100644 index 0000000..489eea7 --- /dev/null +++ b/bluetooth_low_energy_platform_interface/lib/src/my_peripheral_manager.dart @@ -0,0 +1,41 @@ +import 'package:flutter/cupertino.dart'; +import 'package:log_service/log_service.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +import 'peripheral_manager.dart'; + +/// Platform-specific implementations should implement this class to support +/// [PeripheralManager]. +abstract class MyPeripheralManager extends PlatformInterface + with LoggerController + implements PeripheralManager { + static final Object _token = Object(); + + static MyPeripheralManager? _instance; + + /// The default instance of [MyPeripheralManager] to use. + static MyPeripheralManager get instance { + final instance = _instance; + if (instance == null) { + throw UnimplementedError( + 'PeripheralManager is not implemented on this platform.', + ); + } + return instance; + } + + /// Platform-specific implementations should set this with their own + /// platform-specific class that extends [MyPeripheralManager] when + /// they register themselves. + static set instance(MyPeripheralManager instance) { + PlatformInterface.verifyToken(instance, _token); + _instance = instance; + } + + /// Constructs a [MyPeripheralManager]. + MyPeripheralManager() : super(token: _token); + + @protected + @override + Logger get logger => Logger('$PeripheralManager'); +} diff --git a/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager.dart b/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager.dart index 7bd8e31..52e92d7 100644 --- a/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager.dart +++ b/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager.dart @@ -1,18 +1,17 @@ import 'dart:typed_data'; -import 'advertise_data.dart'; -import 'bluetooth_low_energy.dart'; +import 'advertisement.dart'; import 'bluetooth_low_energy_manager.dart'; import 'central.dart'; -import 'event_args.dart'; import 'gatt_characteristic.dart'; import 'gatt_service.dart'; +import 'my_peripheral_manager.dart'; +import 'peripheral_manager_event_args.dart'; /// An object that manages and advertises peripheral services exposed by this app. abstract class PeripheralManager extends BluetoothLowEnergyManager { - /// Gets the instance of [PeripheralManager]. - static PeripheralManager get instance => - BluetoothLowEnergy.instance.peripheralManager; + /// The instance of [PeripheralManger] to use. + static PeripheralManager get instance => MyPeripheralManager.instance; /// Tells that the local peripheral received an Attribute Protocol (ATT) read request for a characteristic with a dynamic value. Stream @@ -36,7 +35,7 @@ abstract class PeripheralManager extends BluetoothLowEnergyManager { Future clearServices(); /// Advertises peripheral manager data. - Future startAdvertising(AdvertiseData advertiseData); + Future startAdvertising(Advertisement advertisement); /// Stops advertising peripheral manager data. Future stopAdvertising(); @@ -47,27 +46,27 @@ abstract class PeripheralManager extends BluetoothLowEnergyManager { /// Responds to a read request from a connected central. Future sendReadCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - Uint8List value, - ); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + required Uint8List value, + }); /// Responds to a write request from a connected central. Future sendWriteCharacteristicReply( - Central central, - GattCharacteristic characteristic, - int id, - int offset, - bool status, - ); + Central central, { + required GattCharacteristic characteristic, + required int id, + required int offset, + required bool status, + }); /// Send an updated characteristic value to one or more subscribed centrals, using a notification or indication. Future notifyCharacteristicValueChanged( - Central central, - GattCharacteristic characteristic, - Uint8List value, - ); + Central central, { + required GattCharacteristic characteristic, + required Uint8List value, + }); } diff --git a/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager_event_args.dart b/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager_event_args.dart new file mode 100644 index 0000000..2ecc096 --- /dev/null +++ b/bluetooth_low_energy_platform_interface/lib/src/peripheral_manager_event_args.dart @@ -0,0 +1,73 @@ +import 'dart:typed_data'; + +import 'central.dart'; +import 'gatt_characteristic.dart'; + +/// The read GATT characteristic command event arguments. +class ReadGattCharacteristicCommandEventArgs { + /// The central which send this read command. + final Central central; + + /// The GATT characteristic which value is to read. + final GattCharacteristic characteristic; + + /// The id of this read command. + final int id; + + /// The offset of this read command. + final int offset; + + /// Constructs a [ReadGattCharacteristicCommandEventArgs]. + ReadGattCharacteristicCommandEventArgs( + this.central, + this.characteristic, + this.id, + this.offset, + ); +} + +/// The write GATT characteristic command event arguments. +class WriteGattCharacteristicCommandEventArgs { + /// The central which send this write command. + final Central central; + + /// The GATT characteristic which value is to write. + final GattCharacteristic characteristic; + + /// The id of this write command. + final int id; + + /// The offset of this write command. + final int offset; + + /// The value of this write command. + final Uint8List value; + + /// Constructs a [WriteGattCharacteristicCommandEventArgs]. + WriteGattCharacteristicCommandEventArgs( + this.central, + this.characteristic, + this.id, + this.offset, + this.value, + ); +} + +/// The notify GATT characteristic command event arguments. +class NotifyGattCharacteristicCommandEventArgs { + /// The central which send this notify command. + final Central central; + + /// The GATT characteristic which value is to notify. + final GattCharacteristic characteristic; + + /// The state of this notify command. + final bool state; + + /// Constructs a [NotifyGattCharacteristicCommandEventArgs]. + NotifyGattCharacteristicCommandEventArgs( + this.central, + this.characteristic, + this.state, + ); +} diff --git a/bluetooth_low_energy_platform_interface/pubspec.yaml b/bluetooth_low_energy_platform_interface/pubspec.yaml index c7f8b51..1dde87b 100644 --- a/bluetooth_low_energy_platform_interface/pubspec.yaml +++ b/bluetooth_low_energy_platform_interface/pubspec.yaml @@ -1,6 +1,6 @@ name: bluetooth_low_energy_platform_interface description: A common platform interface for the bluetooth_low_energy plugin. -version: 3.0.0 +version: 4.0.0 homepage: https://github.com/yanshouwang/bluetooth_low_energy environment: @@ -11,8 +11,9 @@ dependencies: flutter: sdk: flutter plugin_platform_interface: ^2.0.2 + log_service: ^1.0.0 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^2.0.0 + flutter_lints: ^3.0.0