* 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
This commit is contained in:
iAMD
2023-10-30 18:06:14 +08:00
committed by GitHub
parent 3c10caa5dd
commit cfe0eda4a3
68 changed files with 1316 additions and 814 deletions

View File

@ -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 ## 3.0.3
* `Android` Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22) * `Android` Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22)

View File

@ -39,7 +39,7 @@ dependencies:
bluetooth_low_energy: ^<latest-version> bluetooth_low_energy: ^<latest-version>
``` ```
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. *Note:* Bluetooth Low Energy doesn't work on emulators, so use physical devices which has bluetooth features for development.

View File

@ -8,22 +8,35 @@ import 'package:convert/convert.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
CentralManager get centralManager => CentralManager.instance;
PeripheralManager get peripheralManager => PeripheralManager.instance;
void main() { void main() {
runZonedGuarded(onStartUp, onCrashed); runZonedGuarded(onStartUp, onCrashed);
} }
void onStartUp() async { void onStartUp() async {
Logger.root.onRecord.listen(onLogRecord);
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await CentralManager.instance.setUp(); await centralManager.setUp();
await PeripheralManager.instance.setUp(); await peripheralManager.setUp();
runApp(const MyApp()); runApp(const MyApp());
} }
void onCrashed(Object error, StackTrace stackTrace) { void onCrashed(Object error, StackTrace stackTrace) {
Logger.root.shout('App crached.', error, stackTrace);
}
void onLogRecord(LogRecord record) {
log( log(
'$error', record.message,
error: error, time: record.time,
stackTrace: stackTrace, 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<HomeView> {
} }
} }
CentralManager get centralManager => CentralManager.instance;
class ScannerView extends StatefulWidget { class ScannerView extends StatefulWidget {
const ScannerView({super.key}); const ScannerView({super.key});
@ -237,7 +248,7 @@ class _ScannerViewState extends State<ScannerView> {
builder: (context, discoveredEventArgs, child) { builder: (context, discoveredEventArgs, child) {
// final items = discoveredEventArgs; // final items = discoveredEventArgs;
final items = discoveredEventArgs final items = discoveredEventArgs
.where((eventArgs) => eventArgs.advertiseData.name != null) .where((eventArgs) => eventArgs.advertisement.name != null)
.toList(); .toList();
return ListView.separated( return ListView.separated(
itemBuilder: (context, i) { itemBuilder: (context, i) {
@ -245,8 +256,8 @@ class _ScannerViewState extends State<ScannerView> {
final item = items[i]; final item = items[i];
final uuid = item.peripheral.uuid; final uuid = item.peripheral.uuid;
final rssi = item.rssi; final rssi = item.rssi;
final advertiseData = item.advertiseData; final advertisement = item.advertisement;
final name = advertiseData.name; final name = advertisement.name;
return ListTile( return ListTile(
onTap: () async { onTap: () async {
final discovering = this.discovering.value; final discovering = this.discovering.value;
@ -273,7 +284,7 @@ class _ScannerViewState extends State<ScannerView> {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
builder: (context) { builder: (context) {
final manufacturerSpecificData = final manufacturerSpecificData =
advertiseData.manufacturerSpecificData; advertisement.manufacturerSpecificData;
return ListView.separated( return ListView.separated(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 16.0, horizontal: 16.0,
@ -428,7 +439,7 @@ class _PeripheralViewState extends State<PeripheralView> {
}, },
); );
rssiTimer = Timer.periodic( rssiTimer = Timer.periodic(
const Duration(seconds: 1), const Duration(seconds: 5),
(timer) async { (timer) async {
final state = this.state.value; final state = this.state.value;
if (state) { if (state) {
@ -458,7 +469,7 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
PreferredSizeWidget buildAppBar(BuildContext context) { PreferredSizeWidget buildAppBar(BuildContext context) {
final title = eventArgs.advertiseData.name ?? '<EMPTY NAME>'; final title = eventArgs.advertisement.name ?? '';
return AppBar( return AppBar(
title: Text(title), title: Text(title),
actions: [ actions: [
@ -804,8 +815,6 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
} }
PeripheralManager get peripheralManager => PeripheralManager.instance;
class AdvertiserView extends StatefulWidget { class AdvertiserView extends StatefulWidget {
const AdvertiserView({super.key}); const AdvertiserView({super.key});
@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget {
State<AdvertiserView> createState() => _AdvertiserViewState(); State<AdvertiserView> createState() => _AdvertiserViewState();
} }
class _AdvertiserViewState extends State<AdvertiserView> { class _AdvertiserViewState extends State<AdvertiserView>
with SingleTickerProviderStateMixin {
late final ValueNotifier<BluetoothLowEnergyState> state; late final ValueNotifier<BluetoothLowEnergyState> state;
late final ValueNotifier<bool> advertising; late final ValueNotifier<bool> advertising;
late final ValueNotifier<List<Log>> logs; late final ValueNotifier<List<Log>> logs;
@ -856,11 +866,11 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x01, 0x02, 0x03]); final value = Uint8List.fromList([0x01, 0x02, 0x03]);
await peripheralManager.sendReadCharacteristicReply( await peripheralManager.sendReadCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
value, value: value,
); );
}, },
); );
@ -884,10 +894,10 @@ class _AdvertiserViewState extends State<AdvertiserView> {
const status = true; const status = true;
await peripheralManager.sendWriteCharacteristicReply( await peripheralManager.sendWriteCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
); );
}, },
); );
@ -911,8 +921,8 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x03, 0x02, 0x01]); final value = Uint8List.fromList([0x03, 0x02, 0x01]);
await peripheralManager.notifyCharacteristicValueChanged( await peripheralManager.notifyCharacteristicValueChanged(
central, central,
characteristic, characteristic: characteristic,
value, value: value,
); );
} }
}, },
@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State<AdvertiserView> {
], ],
); );
await peripheralManager.addService(service); await peripheralManager.addService(service);
final advertiseData = AdvertiseData( final advertisement = Advertisement(
name: 'flutter', name: 'flutter',
manufacturerSpecificData: ManufacturerSpecificData( manufacturerSpecificData: ManufacturerSpecificData(
id: 0x2e19, id: 0x2e19,
data: Uint8List.fromList([0x01, 0x02, 0x03]), data: Uint8List.fromList([0x01, 0x02, 0x03]),
), ),
); );
await peripheralManager.startAdvertising(advertiseData); await peripheralManager.startAdvertising(advertisement);
advertising.value = true; advertising.value = true;
} }

View File

@ -23,39 +23,39 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.0.3" version: "4.0.0"
bluetooth_low_energy_android: bluetooth_low_energy_android:
dependency: transitive dependency: transitive
description: description:
name: bluetooth_low_energy_android name: bluetooth_low_energy_android
sha256: "86e10541532c96607a0525edba1fd75516543e9beac2e391ac8a50c467aebf88" sha256: "7668f695f195ed67b9985a76a21f10d181a26ebfc2124b4cd272fb6f202c1ee9"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.4" version: "4.0.0"
bluetooth_low_energy_darwin: bluetooth_low_energy_darwin:
dependency: transitive dependency: transitive
description: description:
name: bluetooth_low_energy_darwin name: bluetooth_low_energy_darwin
sha256: "797d3803de3b124ffb13267910f8d727ae4884fdcc621ccc0995076107468bb6" sha256: "027b46d8efea5c726cc32ab6b2ca387f0ef15507afcd1077d75712ad4e7f941d"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "4.0.0"
bluetooth_low_energy_linux: bluetooth_low_energy_linux:
dependency: transitive dependency: transitive
description: description:
name: bluetooth_low_energy_linux name: bluetooth_low_energy_linux
sha256: "31a23704a4b34e7f6cea61d94c24b3e1c6698928645aaeaf1af947e4870996d7" sha256: "548a869579684ce7602577ef5e0498d18eef552fb2abb3ee7909814bef57807f"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "4.0.0"
bluetooth_low_energy_platform_interface: bluetooth_low_energy_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: bluetooth_low_energy_platform_interface name: bluetooth_low_energy_platform_interface
sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "4.0.0"
bluez: bluez:
dependency: transitive dependency: transitive
description: description:
@ -158,10 +158,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "3.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -189,10 +189,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev" url: "https://pub.dev"
source: hosted 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: logging:
dependency: transitive dependency: transitive
description: description:

View File

@ -42,7 +42,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # 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 # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@ -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' export 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'
hide hide
MyCentralManager,
MyPeripheralManager,
MyObject, MyObject,
MyCentral, MyCentral,
MyPeripheral, MyPeripheral,

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy name: bluetooth_low_energy
description: A Flutter plugin for controlling the bluetooth low energy. description: A Flutter plugin for controlling the bluetooth low energy, supports central and peripheral apis.
version: 3.0.3 version: 4.0.0
homepage: https://github.com/yanshouwang/bluetooth_low_energy homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment: environment:
@ -10,15 +10,15 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
bluetooth_low_energy_android: ^3.0.4 bluetooth_low_energy_android: ^4.0.0
bluetooth_low_energy_darwin: ^3.0.2 bluetooth_low_energy_darwin: ^4.0.0
bluetooth_low_energy_linux: ^3.0.0 bluetooth_low_energy_linux: ^4.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_lints: ^3.0.0
flutter: flutter:
plugin: plugin:

View File

@ -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 ## 3.0.4
* Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22) * Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22)

View File

@ -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 // See also: https://pub.dev/packages/pigeon
package dev.yanshouwang.bluetooth_low_energy_android package dev.yanshouwang.bluetooth_low_energy_android
@ -165,7 +165,7 @@ data class MyPeripheralArgs (
} }
/** Generated class from Pigeon that represents data sent in messages. */ /** Generated class from Pigeon that represents data sent in messages. */
data class MyAdvertiseDataArgs ( data class MyAdvertisementArgs (
val nameArgs: String? = null, val nameArgs: String? = null,
val serviceUUIDsArgs: List<String?>, val serviceUUIDsArgs: List<String?>,
val serviceDataArgs: Map<String?, ByteArray?>, val serviceDataArgs: Map<String?, ByteArray?>,
@ -174,14 +174,14 @@ data class MyAdvertiseDataArgs (
) { ) {
companion object { companion object {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
fun fromList(list: List<Any?>): MyAdvertiseDataArgs { fun fromList(list: List<Any?>): MyAdvertisementArgs {
val nameArgs = list[0] as String? val nameArgs = list[0] as String?
val serviceUUIDsArgs = list[1] as List<String?> val serviceUUIDsArgs = list[1] as List<String?>
val serviceDataArgs = list[2] as Map<String?, ByteArray?> val serviceDataArgs = list[2] as Map<String?, ByteArray?>
val manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = (list[3] as List<Any?>?)?.let { val manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = (list[3] as List<Any?>?)?.let {
MyManufacturerSpecificDataArgs.fromList(it) MyManufacturerSpecificDataArgs.fromList(it)
} }
return MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) return MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
} }
} }
fun toList(): List<Any?> { fun toList(): List<Any?> {
@ -654,7 +654,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() {
return when (type) { return when (type) {
128.toByte() -> { 128.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyAdvertiseDataArgs.fromList(it) MyAdvertisementArgs.fromList(it)
} }
} }
129.toByte() -> { 129.toByte() -> {
@ -682,7 +682,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() {
} }
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
when (value) { when (value) {
is MyAdvertiseDataArgs -> { is MyAdvertisementArgs -> {
stream.write(128) stream.write(128)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
@ -716,28 +716,60 @@ class MyCentralManagerFlutterApi(private val binaryMessenger: BinaryMessenger) {
MyCentralManagerFlutterApiCodec MyCentralManagerFlutterApiCodec
} }
} }
fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) { fun onStateChanged(stateNumberArgsArg: Long, callback: (Result<Unit>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged", codec)
channel.send(listOf(stateNumberArgsArg)) { 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>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered", codec)
channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertiseDataArgsArg)) { channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertisementArgsArg)) {
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 onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: () -> Unit) { fun onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: (Result<Unit>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged", codec)
channel.send(listOf(peripheralArgsArg, stateArgsArg)) { 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>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged", codec)
channel.send(listOf(characteristicArgsArg, valueArgsArg)) { 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) { return when (type) {
128.toByte() -> { 128.toByte() -> {
return (readValue(buffer) as? List<Any?>)?.let { return (readValue(buffer) as? List<Any?>)?.let {
MyAdvertiseDataArgs.fromList(it) MyAdvertisementArgs.fromList(it)
} }
} }
129.toByte() -> { 129.toByte() -> {
@ -780,7 +812,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() {
} }
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) { override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
when (value) { when (value) {
is MyAdvertiseDataArgs -> { is MyAdvertisementArgs -> {
stream.write(128) stream.write(128)
writeValue(stream, value.toList()) writeValue(stream, value.toList())
} }
@ -815,7 +847,7 @@ interface MyPeripheralManagerHostApi {
fun addService(serviceArgs: MyGattServiceArgs, callback: (Result<Unit>) -> Unit) fun addService(serviceArgs: MyGattServiceArgs, callback: (Result<Unit>) -> Unit)
fun removeService(serviceHashCodeArgs: Long) fun removeService(serviceHashCodeArgs: Long)
fun clearServices() fun clearServices()
fun startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> Unit) fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit)
fun stopAdvertising() fun stopAdvertising()
fun getMaximumWriteLength(centralHashCodeArgs: Long): Long fun getMaximumWriteLength(centralHashCodeArgs: Long): Long
fun sendReadCharacteristicReply(centralHashCodeArgs: Long, characteristicHashCodeArgs: Long, idArgs: Long, offsetArgs: Long, statusArgs: Boolean, valueArgs: ByteArray) fun sendReadCharacteristicReply(centralHashCodeArgs: Long, characteristicHashCodeArgs: Long, idArgs: Long, offsetArgs: Long, statusArgs: Boolean, valueArgs: ByteArray)
@ -908,8 +940,8 @@ interface MyPeripheralManagerHostApi {
if (api != null) { if (api != null) {
channel.setMessageHandler { message, reply -> channel.setMessageHandler { message, reply ->
val args = message as List<Any?> val args = message as List<Any?>
val advertiseDataArgsArg = args[0] as MyAdvertiseDataArgs val advertisementArgsArg = args[0] as MyAdvertisementArgs
api.startAdvertising(advertiseDataArgsArg) { result: Result<Unit> -> api.startAdvertising(advertisementArgsArg) { result: Result<Unit> ->
val error = result.exceptionOrNull() val error = result.exceptionOrNull()
if (error != null) { if (error != null) {
reply.reply(wrapError(error)) reply.reply(wrapError(error))
@ -1078,28 +1110,60 @@ class MyPeripheralManagerFlutterApi(private val binaryMessenger: BinaryMessenger
MyPeripheralManagerFlutterApiCodec MyPeripheralManagerFlutterApiCodec
} }
} }
fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) { fun onStateChanged(stateNumberArgsArg: Long, callback: (Result<Unit>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged", codec)
channel.send(listOf(stateNumberArgsArg)) { 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>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", codec)
channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg)) { 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>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", codec)
channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg, valueArgsArg)) { 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>) -> Unit) {
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", codec) val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", codec)
channel.send(listOf(centralArgsArg, characteristicArgsArg, stateArgsArg)) { 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.", "")));
}
} }
} }
} }

View File

@ -43,7 +43,7 @@ val BluetoothDevice.uuid: UUID
return UUID.fromString("00000000-0000-0000-0000-$node") return UUID.fromString("00000000-0000-0000-0000-$node")
} }
val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs val ScanResult.advertisementArgs: MyAdvertisementArgs
get() { get() {
val record = scanRecord val record = scanRecord
return if (record == null) { return if (record == null) {
@ -51,7 +51,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs
val serviceUUIDsArgs = emptyList<String?>() val serviceUUIDsArgs = emptyList<String?>()
val serviceDataArgs = emptyMap<String?, ByteArray>() val serviceDataArgs = emptyMap<String?, ByteArray>()
val manufacturerSpecificDataArgs = null val manufacturerSpecificDataArgs = null
MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
} else { } else {
val nameArgs = record.deviceName val nameArgs = record.deviceName
val serviceUUIDsArgs = record.serviceUuids?.map { uuid -> uuid.toString() } val serviceUUIDsArgs = record.serviceUuids?.map { uuid -> uuid.toString() }
@ -62,7 +62,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs
}.toTypedArray() }.toTypedArray()
val serviceDataArgs = mapOf<String?, ByteArray?>(*pairs) val serviceDataArgs = mapOf<String?, ByteArray?>(*pairs)
val manufacturerSpecificDataArgs = record.manufacturerSpecificData.toManufacturerSpecificDataArgs() val manufacturerSpecificDataArgs = record.manufacturerSpecificData.toManufacturerSpecificDataArgs()
MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs) MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
} }
} }
@ -99,7 +99,7 @@ val ScanRecord.rawValues: Map<Byte, ByteArray>
return rawValues.toMap() return rawValues.toMap()
} }
fun MyAdvertiseDataArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData { fun MyAdvertisementArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData {
val advertiseDataBuilder = AdvertiseData.Builder() val advertiseDataBuilder = AdvertiseData.Builder()
if (nameArgs == null) { if (nameArgs == null) {
advertiseDataBuilder.setIncludeDeviceName(false) advertiseDataBuilder.setIncludeDeviceName(false)

View File

@ -417,8 +417,8 @@ class MyCentralManager(private val context: Context, binaryMessenger: BinaryMess
this.devices[hashCodeArgs] = device this.devices[hashCodeArgs] = device
this.peripheralsArgs[hashCode] = peripheralArgs this.peripheralsArgs[hashCode] = peripheralArgs
val rssiArgs = result.rssi.toLong() val rssiArgs = result.rssi.toLong()
val advertiseDataArgs = result.advertiseDataArgs val advertisementArgs = result.advertisementArgs
api.onDiscovered(peripheralArgs, rssiArgs, advertiseDataArgs) {} api.onDiscovered(peripheralArgs, rssiArgs, advertisementArgs) {}
} }
fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {

View File

@ -203,13 +203,13 @@ class MyPeripheralManager(private val context: Context, binaryMessenger: BinaryM
} }
} }
override fun startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> Unit) { override fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit) {
try { try {
if (startAdvertisingCallback != null) { if (startAdvertisingCallback != null) {
throw IllegalStateException() throw IllegalStateException()
} }
val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).build() 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) advertiser.startAdvertising(settings, advertiseData, advertiseCallback)
startAdvertisingCallback = callback startAdvertisingCallback = callback
} catch (e: Throwable) { } catch (e: Throwable) {

View File

@ -8,22 +8,35 @@ import 'package:convert/convert.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
CentralManager get centralManager => CentralManager.instance;
PeripheralManager get peripheralManager => PeripheralManager.instance;
void main() { void main() {
runZonedGuarded(onStartUp, onCrashed); runZonedGuarded(onStartUp, onCrashed);
} }
void onStartUp() async { void onStartUp() async {
Logger.root.onRecord.listen(onLogRecord);
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await CentralManager.instance.setUp(); await centralManager.setUp();
await PeripheralManager.instance.setUp(); await peripheralManager.setUp();
runApp(const MyApp()); runApp(const MyApp());
} }
void onCrashed(Object error, StackTrace stackTrace) { void onCrashed(Object error, StackTrace stackTrace) {
Logger.root.shout('App crached.', error, stackTrace);
}
void onLogRecord(LogRecord record) {
log( log(
'$error', record.message,
error: error, time: record.time,
stackTrace: stackTrace, 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<HomeView> {
} }
} }
CentralManager get centralManager => CentralManager.instance;
class ScannerView extends StatefulWidget { class ScannerView extends StatefulWidget {
const ScannerView({super.key}); const ScannerView({super.key});
@ -237,7 +248,7 @@ class _ScannerViewState extends State<ScannerView> {
builder: (context, discoveredEventArgs, child) { builder: (context, discoveredEventArgs, child) {
// final items = discoveredEventArgs; // final items = discoveredEventArgs;
final items = discoveredEventArgs final items = discoveredEventArgs
.where((eventArgs) => eventArgs.advertiseData.name != null) .where((eventArgs) => eventArgs.advertisement.name != null)
.toList(); .toList();
return ListView.separated( return ListView.separated(
itemBuilder: (context, i) { itemBuilder: (context, i) {
@ -245,8 +256,8 @@ class _ScannerViewState extends State<ScannerView> {
final item = items[i]; final item = items[i];
final uuid = item.peripheral.uuid; final uuid = item.peripheral.uuid;
final rssi = item.rssi; final rssi = item.rssi;
final advertiseData = item.advertiseData; final advertisement = item.advertisement;
final name = advertiseData.name; final name = advertisement.name;
return ListTile( return ListTile(
onTap: () async { onTap: () async {
final discovering = this.discovering.value; final discovering = this.discovering.value;
@ -273,7 +284,7 @@ class _ScannerViewState extends State<ScannerView> {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
builder: (context) { builder: (context) {
final manufacturerSpecificData = final manufacturerSpecificData =
advertiseData.manufacturerSpecificData; advertisement.manufacturerSpecificData;
return ListView.separated( return ListView.separated(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 16.0, horizontal: 16.0,
@ -428,7 +439,7 @@ class _PeripheralViewState extends State<PeripheralView> {
}, },
); );
rssiTimer = Timer.periodic( rssiTimer = Timer.periodic(
const Duration(seconds: 1), const Duration(seconds: 5),
(timer) async { (timer) async {
final state = this.state.value; final state = this.state.value;
if (state) { if (state) {
@ -458,7 +469,7 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
PreferredSizeWidget buildAppBar(BuildContext context) { PreferredSizeWidget buildAppBar(BuildContext context) {
final title = eventArgs.advertiseData.name ?? '<EMPTY NAME>'; final title = eventArgs.advertisement.name ?? '';
return AppBar( return AppBar(
title: Text(title), title: Text(title),
actions: [ actions: [
@ -804,8 +815,6 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
} }
PeripheralManager get peripheralManager => PeripheralManager.instance;
class AdvertiserView extends StatefulWidget { class AdvertiserView extends StatefulWidget {
const AdvertiserView({super.key}); const AdvertiserView({super.key});
@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget {
State<AdvertiserView> createState() => _AdvertiserViewState(); State<AdvertiserView> createState() => _AdvertiserViewState();
} }
class _AdvertiserViewState extends State<AdvertiserView> { class _AdvertiserViewState extends State<AdvertiserView>
with SingleTickerProviderStateMixin {
late final ValueNotifier<BluetoothLowEnergyState> state; late final ValueNotifier<BluetoothLowEnergyState> state;
late final ValueNotifier<bool> advertising; late final ValueNotifier<bool> advertising;
late final ValueNotifier<List<Log>> logs; late final ValueNotifier<List<Log>> logs;
@ -856,11 +866,11 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x01, 0x02, 0x03]); final value = Uint8List.fromList([0x01, 0x02, 0x03]);
await peripheralManager.sendReadCharacteristicReply( await peripheralManager.sendReadCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
value, value: value,
); );
}, },
); );
@ -884,10 +894,10 @@ class _AdvertiserViewState extends State<AdvertiserView> {
const status = true; const status = true;
await peripheralManager.sendWriteCharacteristicReply( await peripheralManager.sendWriteCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
); );
}, },
); );
@ -911,8 +921,8 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x03, 0x02, 0x01]); final value = Uint8List.fromList([0x03, 0x02, 0x01]);
await peripheralManager.notifyCharacteristicValueChanged( await peripheralManager.notifyCharacteristicValueChanged(
central, central,
characteristic, characteristic: characteristic,
value, value: value,
); );
} }
}, },
@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State<AdvertiserView> {
], ],
); );
await peripheralManager.addService(service); await peripheralManager.addService(service);
final advertiseData = AdvertiseData( final advertisement = Advertisement(
name: 'flutter', name: 'flutter',
manufacturerSpecificData: ManufacturerSpecificData( manufacturerSpecificData: ManufacturerSpecificData(
id: 0x2e19, id: 0x2e19,
data: Uint8List.fromList([0x01, 0x02, 0x03]), data: Uint8List.fromList([0x01, 0x02, 0x03]),
), ),
); );
await peripheralManager.startAdvertising(advertiseData); await peripheralManager.startAdvertising(advertisement);
advertising.value = true; advertising.value = true;
} }

View File

@ -15,15 +15,15 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.0.4" version: "4.0.0"
bluetooth_low_energy_platform_interface: bluetooth_low_energy_platform_interface:
dependency: "direct main" dependency: "direct main"
description: description:
name: bluetooth_low_energy_platform_interface name: bluetooth_low_energy_platform_interface
sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "4.0.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -102,10 +102,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "3.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -133,10 +133,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev" url: "https://pub.dev"
source: hosted 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: logging:
dependency: transitive dependency: transitive
description: description:

View File

@ -17,7 +17,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
bluetooth_low_energy_android: bluetooth_low_energy_android:
# When depending on this package from a real application you should use: # When depending on this package from a real application you should use:
# bluetooth_low_energy: ^x.y.z # 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 # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # 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 # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@ -1,9 +1,11 @@
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; 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 { abstract class BluetoothLowEnergyAndroid {
static void registerWith() { static void registerWith() {
BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); MyCentralManager.instance = MyCentralManager2();
MyPeripheralManager.instance = MyPeripheralManager2();
} }
} }

View File

@ -15,8 +15,8 @@ extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs {
} }
} }
extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { extension MyAdvertisementArgsX on MyAdvertisementArgs {
AdvertiseData toAdvertiseData() { Advertisement toAdvertisement() {
final name = nameArgs; final name = nameArgs;
final serviceUUIDs = serviceUUIDsArgs final serviceUUIDs = serviceUUIDsArgs
.cast<String>() .cast<String>()
@ -31,7 +31,7 @@ extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs {
); );
final manufacturerSpecificData = final manufacturerSpecificData =
manufacturerSpecificDataArgs?.toManufacturerSpecificData(); manufacturerSpecificDataArgs?.toManufacturerSpecificData();
return AdvertiseData( return Advertisement(
name: name, name: name,
serviceUUIDs: serviceUUIDs, serviceUUIDs: serviceUUIDs,
serviceData: serviceData, serviceData: serviceData,
@ -136,8 +136,8 @@ extension MyCentralArgsX on MyCentralArgs {
} }
} }
extension AdvertiseDataX on AdvertiseData { extension AdvertisementX on Advertisement {
MyAdvertiseDataArgs toArgs() { MyAdvertisementArgs toArgs() {
final nameArgs = name; final nameArgs = name;
final serviceUUIDsArgs = final serviceUUIDsArgs =
serviceUUIDs.map((uuid) => uuid.toString()).toList(); serviceUUIDs.map((uuid) => uuid.toString()).toList();
@ -147,7 +147,7 @@ extension AdvertiseDataX on AdvertiseData {
return MapEntry(uuidArgs, dataArgs); return MapEntry(uuidArgs, dataArgs);
}); });
final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs(); final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs();
return MyAdvertiseDataArgs( return MyAdvertisementArgs(
nameArgs: nameArgs, nameArgs: nameArgs,
serviceUUIDsArgs: serviceUUIDsArgs, serviceUUIDsArgs: serviceUUIDsArgs,
serviceDataArgs: serviceDataArgs, serviceDataArgs: serviceDataArgs,

View File

@ -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 // 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 // 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/foundation.dart' show ReadBuffer, WriteBuffer;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
List<Object?> wrapResponse({Object? result, PlatformException? error, bool empty = false}) {
if (empty) {
return <Object?>[];
}
if (error == null) {
return <Object?>[result];
}
return <Object?>[error.code, error.message, error.details];
}
enum MyBluetoothLowEnergyStateArgs { enum MyBluetoothLowEnergyStateArgs {
unknown, unknown,
@ -123,8 +132,8 @@ class MyPeripheralArgs {
} }
} }
class MyAdvertiseDataArgs { class MyAdvertisementArgs {
MyAdvertiseDataArgs({ MyAdvertisementArgs({
this.nameArgs, this.nameArgs,
required this.serviceUUIDsArgs, required this.serviceUUIDsArgs,
required this.serviceDataArgs, required this.serviceDataArgs,
@ -148,9 +157,9 @@ class MyAdvertiseDataArgs {
]; ];
} }
static MyAdvertiseDataArgs decode(Object result) { static MyAdvertisementArgs decode(Object result) {
result as List<Object?>; result as List<Object?>;
return MyAdvertiseDataArgs( return MyAdvertisementArgs(
nameArgs: result[0] as String?, nameArgs: result[0] as String?,
serviceUUIDsArgs: (result[1] as List<Object?>?)!.cast<String?>(), serviceUUIDsArgs: (result[1] as List<Object?>?)!.cast<String?>(),
serviceDataArgs: (result[2] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(), serviceDataArgs: (result[2] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(),
@ -681,7 +690,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
const _MyCentralManagerFlutterApiCodec(); const _MyCentralManagerFlutterApiCodec();
@override @override
void writeValue(WriteBuffer buffer, Object? value) { void writeValue(WriteBuffer buffer, Object? value) {
if (value is MyAdvertiseDataArgs) { if (value is MyAdvertisementArgs) {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyGattCharacteristicArgs) { } else if (value is MyGattCharacteristicArgs) {
@ -705,7 +714,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
Object? readValueOfType(int type, ReadBuffer buffer) { Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) { switch (type) {
case 128: case 128:
return MyAdvertiseDataArgs.decode(readValue(buffer)!); return MyAdvertisementArgs.decode(readValue(buffer)!);
case 129: case 129:
return MyGattCharacteristicArgs.decode(readValue(buffer)!); return MyGattCharacteristicArgs.decode(readValue(buffer)!);
case 130: case 130:
@ -725,7 +734,7 @@ abstract class MyCentralManagerFlutterApi {
void onStateChanged(int stateNumberArgs); 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); void onPeripheralStateChanged(MyPeripheralArgs peripheralArgs, bool stateArgs);
@ -746,8 +755,14 @@ abstract class MyCentralManagerFlutterApi {
final int? arg_stateNumberArgs = (args[0] as int?); final int? arg_stateNumberArgs = (args[0] as int?);
assert(arg_stateNumberArgs != null, assert(arg_stateNumberArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.');
api.onStateChanged(arg_stateNumberArgs!); try {
return; 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?); final int? arg_rssiArgs = (args[1] as int?);
assert(arg_rssiArgs != null, assert(arg_rssiArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null int.'); '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?); final MyAdvertisementArgs? arg_advertisementArgs = (args[2] as MyAdvertisementArgs?);
assert(arg_advertiseDataArgs != null, assert(arg_advertisementArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertiseDataArgs.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertisementArgs.');
api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertiseDataArgs!); try {
return; 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?); final bool? arg_stateArgs = (args[1] as bool?);
assert(arg_stateArgs != null, assert(arg_stateArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.');
api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); try {
return; 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?); final Uint8List? arg_valueArgs = (args[1] as Uint8List?);
assert(arg_valueArgs != null, assert(arg_valueArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.');
api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); try {
return; 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(); const _MyPeripheralManagerHostApiCodec();
@override @override
void writeValue(WriteBuffer buffer, Object? value) { void writeValue(WriteBuffer buffer, Object? value) {
if (value is MyAdvertiseDataArgs) { if (value is MyAdvertisementArgs) {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyGattCharacteristicArgs) { } else if (value is MyGattCharacteristicArgs) {
@ -854,7 +887,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec {
Object? readValueOfType(int type, ReadBuffer buffer) { Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) { switch (type) {
case 128: case 128:
return MyAdvertiseDataArgs.decode(readValue(buffer)!); return MyAdvertisementArgs.decode(readValue(buffer)!);
case 129: case 129:
return MyGattCharacteristicArgs.decode(readValue(buffer)!); return MyGattCharacteristicArgs.decode(readValue(buffer)!);
case 130: case 130:
@ -974,12 +1007,12 @@ class MyPeripheralManagerHostApi {
} }
} }
Future<void> startAdvertising(MyAdvertiseDataArgs arg_advertiseDataArgs) async { Future<void> startAdvertising(MyAdvertisementArgs arg_advertisementArgs) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>( final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostApi.startAdvertising', codec, 'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostApi.startAdvertising', codec,
binaryMessenger: _binaryMessenger); binaryMessenger: _binaryMessenger);
final List<Object?>? replyList = final List<Object?>? replyList =
await channel.send(<Object?>[arg_advertiseDataArgs]) as List<Object?>?; await channel.send(<Object?>[arg_advertisementArgs]) as List<Object?>?;
if (replyList == null) { if (replyList == null) {
throw PlatformException( throw PlatformException(
code: 'channel-error', code: 'channel-error',
@ -1171,8 +1204,14 @@ abstract class MyPeripheralManagerFlutterApi {
final int? arg_stateNumberArgs = (args[0] as int?); final int? arg_stateNumberArgs = (args[0] as int?);
assert(arg_stateNumberArgs != null, assert(arg_stateNumberArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.');
api.onStateChanged(arg_stateNumberArgs!); try {
return; 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?); final int? arg_offsetArgs = (args[3] as int?);
assert(arg_offsetArgs != null, assert(arg_offsetArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived was null, expected non-null int.'); '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!); try {
return; 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?); final Uint8List? arg_valueArgs = (args[4] as Uint8List?);
assert(arg_valueArgs != null, assert(arg_valueArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived was null, expected non-null Uint8List.'); '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!); try {
return; 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?); final bool? arg_stateArgs = (args[2] as bool?);
assert(arg_stateArgs != null, assert(arg_stateArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived was null, expected non-null bool.'); '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!); try {
return; 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()));
}
}); });
} }
} }

View File

@ -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();
}

View File

@ -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<BluetoothLowEnergyStateChangedEventArgs>
_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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@protected
Future<void> throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw BluetoothLowEnergyError(
'$state is expected, but current state is ${this.state}.',
);
}
}
}

View File

@ -1,32 +1,48 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; 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_api.dart';
import 'my_bluetooth_low_energy_manager.dart';
import 'my_gatt_characteristic2.dart'; import 'my_gatt_characteristic2.dart';
import 'my_gatt_descriptor2.dart'; import 'my_gatt_descriptor2.dart';
class MyCentralManager extends MyBluetoothLowEnergyManager class MyCentralManager2 extends MyCentralManager
implements CentralManager, MyCentralManagerFlutterApi { implements MyCentralManagerFlutterApi {
final Logger _logger;
final MyCentralManagerHostApi _api; final MyCentralManagerHostApi _api;
BluetoothLowEnergyState _state;
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
_stateChangedController;
final StreamController<DiscoveredEventArgs> _discoveredController; final StreamController<DiscoveredEventArgs> _discoveredController;
final StreamController<PeripheralStateChangedEventArgs> final StreamController<PeripheralStateChangedEventArgs>
_peripheralStateChangedController; _peripheralStateChangedController;
final StreamController<GattCharacteristicValueChangedEventArgs> final StreamController<GattCharacteristicValueChangedEventArgs>
_characteristicValueChangedController; _characteristicValueChangedController;
MyCentralManager() MyCentralManager2()
: _logger = Logger('MyCentralManager'), : _api = MyCentralManagerHostApi(),
_api = MyCentralManagerHostApi(), _state = BluetoothLowEnergyState.unknown,
_stateChangedController = StreamController.broadcast(),
_discoveredController = StreamController.broadcast(), _discoveredController = StreamController.broadcast(),
_peripheralStateChangedController = StreamController.broadcast(), _peripheralStateChangedController = StreamController.broadcast(),
_characteristicValueChangedController = StreamController.broadcast(); _characteristicValueChangedController = StreamController.broadcast();
@override @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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@override
Stream<DiscoveredEventArgs> get discovered => _discoveredController.stream; Stream<DiscoveredEventArgs> get discovered => _discoveredController.stream;
@override @override
Stream<PeripheralStateChangedEventArgs> get peripheralStateChanged => Stream<PeripheralStateChangedEventArgs> get peripheralStateChanged =>
@ -36,6 +52,13 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
get characteristicValueChanged => get characteristicValueChanged =>
_characteristicValueChangedController.stream; _characteristicValueChangedController.stream;
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw StateError(
'$state is expected, but current state is ${this.state}.');
}
}
@override @override
Future<void> setUp() async { Future<void> setUp() async {
final args = await _api.setUp(); final args = await _api.setUp();
@ -47,26 +70,26 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> startDiscovery() async { Future<void> startDiscovery() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.startDiscovery(); await _api.startDiscovery();
} }
@override @override
Future<void> stopDiscovery() async { Future<void> stopDiscovery() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.stopDiscovery(); await _api.stopDiscovery();
} }
@override @override
Future<void> connect(Peripheral peripheral) async { Future<void> connect(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
await _api.connect(peripheralHashCodeArgs); await _api.connect(peripheralHashCodeArgs);
} }
@override @override
Future<void> disconnect(Peripheral peripheral) async { Future<void> disconnect(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
await _api.disconnect(peripheralHashCodeArgs); await _api.disconnect(peripheralHashCodeArgs);
} }
@ -76,7 +99,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
Peripheral peripheral, { Peripheral peripheral, {
required GattCharacteristicWriteType type, required GattCharacteristicWriteType type,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
final typeArgs = type.toArgs(); final typeArgs = type.toArgs();
final typeNumberArgs = typeArgs.index; final typeNumberArgs = typeArgs.index;
@ -89,7 +112,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<int> readRSSI(Peripheral peripheral) async { Future<int> readRSSI(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
final rssi = await _api.readRSSI(peripheralHashCodeArgs); final rssi = await _api.readRSSI(peripheralHashCodeArgs);
return rssi; return rssi;
@ -97,7 +120,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<List<GattService>> discoverGATT(Peripheral peripheral) async { Future<List<GattService>> discoverGATT(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (peripheral is! MyPeripheral) { if (peripheral is! MyPeripheral) {
throw TypeError(); throw TypeError();
} }
@ -123,9 +146,9 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
// TODO: MTU // TODO: MTU
const mtuArgs = 517; const mtuArgs = 517;
await _api.requestMTU(peripheralHashCodeArgs, mtuArgs); await _api.requestMTU(peripheralHashCodeArgs, mtuArgs);
} catch (error, stack) { } catch (error, stackTrace) {
// MTU // MTU
_logger.warning('requst MTU failed.', error, stack); logger.warning('requst MTU failed.', error, stackTrace);
} }
return services; return services;
} }
@ -134,7 +157,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
Future<Uint8List> readCharacteristic( Future<Uint8List> readCharacteristic(
GattCharacteristic characteristic, GattCharacteristic characteristic,
) async { ) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -155,7 +178,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
required Uint8List value, required Uint8List value,
required GattCharacteristicWriteType type, required GattCharacteristicWriteType type,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -179,7 +202,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
GattCharacteristic characteristic, { GattCharacteristic characteristic, {
required bool state, required bool state,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -197,7 +220,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<Uint8List> readDescriptor(GattDescriptor descriptor) async { Future<Uint8List> readDescriptor(GattDescriptor descriptor) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (descriptor is! MyGattDescriptor2) { if (descriptor is! MyGattDescriptor2) {
throw TypeError(); throw TypeError();
} }
@ -218,7 +241,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
GattDescriptor descriptor, { GattDescriptor descriptor, {
required Uint8List value, required Uint8List value,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (descriptor is! MyGattDescriptor2) { if (descriptor is! MyGattDescriptor2) {
throw TypeError(); throw TypeError();
} }
@ -245,15 +268,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
void onDiscovered( void onDiscovered(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
int rssiArgs, int rssiArgs,
MyAdvertiseDataArgs advertiseDataArgs, MyAdvertisementArgs advertisementArgs,
) { ) {
final peripheral = peripheralArgs.toPeripheral(); final peripheral = peripheralArgs.toPeripheral();
final rssi = rssiArgs; final rssi = rssiArgs;
final advertiseData = advertiseDataArgs.toAdvertiseData(); final advertisement = advertisementArgs.toAdvertisement();
final eventArgs = DiscoveredEventArgs( final eventArgs = DiscoveredEventArgs(
peripheral, peripheral,
rssi, rssi,
advertiseData, advertisement,
); );
_discoveredController.add(eventArgs); _discoveredController.add(eventArgs);
} }

View File

@ -1,14 +1,16 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
import 'package:flutter/foundation.dart';
import 'my_api.dart'; import 'my_api.dart';
import 'my_bluetooth_low_energy_manager.dart';
class MyPeripheralManager extends MyBluetoothLowEnergyManager class MyPeripheralManager2 extends MyPeripheralManager
implements PeripheralManager, MyPeripheralManagerFlutterApi { implements MyPeripheralManagerFlutterApi {
final MyPeripheralManagerHostApi _api; final MyPeripheralManagerHostApi _api;
BluetoothLowEnergyState _state;
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
_stateChangedController;
final StreamController<ReadGattCharacteristicCommandEventArgs> final StreamController<ReadGattCharacteristicCommandEventArgs>
_readCharacteristicCommandReceivedController; _readCharacteristicCommandReceivedController;
final StreamController<WriteGattCharacteristicCommandEventArgs> final StreamController<WriteGattCharacteristicCommandEventArgs>
@ -16,8 +18,10 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
final StreamController<NotifyGattCharacteristicCommandEventArgs> final StreamController<NotifyGattCharacteristicCommandEventArgs>
_notifyCharacteristicCommandReceivedController; _notifyCharacteristicCommandReceivedController;
MyPeripheralManager() MyPeripheralManager2()
: _api = MyPeripheralManagerHostApi(), : _api = MyPeripheralManagerHostApi(),
_state = BluetoothLowEnergyState.unknown,
_stateChangedController = StreamController.broadcast(),
_readCharacteristicCommandReceivedController = _readCharacteristicCommandReceivedController =
StreamController.broadcast(), StreamController.broadcast(),
_writeCharacteristicCommandReceivedController = _writeCharacteristicCommandReceivedController =
@ -26,20 +30,40 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
StreamController.broadcast(); StreamController.broadcast();
@override @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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@override
Stream<ReadGattCharacteristicCommandEventArgs> Stream<ReadGattCharacteristicCommandEventArgs>
get readCharacteristicCommandReceived => get readCharacteristicCommandReceived =>
_readCharacteristicCommandReceivedController.stream; _readCharacteristicCommandReceivedController.stream;
@override @override
Stream<WriteGattCharacteristicCommandEventArgs> Stream<WriteGattCharacteristicCommandEventArgs>
get writeCharacteristicCommandReceived => get writeCharacteristicCommandReceived =>
_writeCharacteristicCommandReceivedController.stream; _writeCharacteristicCommandReceivedController.stream;
@override @override
Stream<NotifyGattCharacteristicCommandEventArgs> Stream<NotifyGattCharacteristicCommandEventArgs>
get notifyCharacteristicCommandReceived => get notifyCharacteristicCommandReceived =>
_notifyCharacteristicCommandReceivedController.stream; _notifyCharacteristicCommandReceivedController.stream;
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw StateError(
'$state is expected, but current state is ${this.state}.');
}
}
@override @override
Future<void> setUp() async { Future<void> setUp() async {
final args = await _api.setUp(); final args = await _api.setUp();
@ -51,7 +75,7 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> addService(GattService service) async { Future<void> addService(GattService service) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (service is! MyGattService) { if (service is! MyGattService) {
throw TypeError(); throw TypeError();
} }
@ -61,33 +85,33 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> removeService(GattService service) async { Future<void> removeService(GattService service) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final serviceHashCodeArgs = service.hashCode; final serviceHashCodeArgs = service.hashCode;
await _api.removeService(serviceHashCodeArgs); await _api.removeService(serviceHashCodeArgs);
} }
@override @override
Future<void> clearServices() async { Future<void> clearServices() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.clearServices(); await _api.clearServices();
} }
@override @override
Future<void> startAdvertising(AdvertiseData advertiseData) async { Future<void> startAdvertising(Advertisement advertisement) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final advertiseDataArgs = advertiseData.toArgs(); final advertisementArgs = advertisement.toArgs();
await _api.startAdvertising(advertiseDataArgs); await _api.startAdvertising(advertisementArgs);
} }
@override @override
Future<void> stopAdvertising() async { Future<void> stopAdvertising() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.stopAdvertising(); await _api.stopAdvertising();
} }
@override @override
Future<int> getMaximumWriteLength(Central central) async { Future<int> getMaximumWriteLength(Central central) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final maximumWriteLength = final maximumWriteLength =
await _api.getMaximumWriteLength(centralHashCodeArgs); await _api.getMaximumWriteLength(centralHashCodeArgs);
@ -96,14 +120,14 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> sendReadCharacteristicReply( Future<void> sendReadCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
Uint8List value, required Uint8List value,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final idArgs = id; final idArgs = id;
@ -122,13 +146,13 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> sendWriteCharacteristicReply( Future<void> sendWriteCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final idArgs = id; final idArgs = id;
@ -145,11 +169,11 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> notifyCharacteristicValueChanged( Future<void> notifyCharacteristicValueChanged(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
Uint8List value, required Uint8List value,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final valueArgs = value; final valueArgs = value;

View File

@ -66,7 +66,7 @@ abstract class MyCentralManagerFlutterApi {
void onDiscovered( void onDiscovered(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
int rssiArgs, int rssiArgs,
MyAdvertiseDataArgs advertiseDataArgs, MyAdvertisementArgs advertisementArgs,
); );
void onPeripheralStateChanged( void onPeripheralStateChanged(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
@ -87,7 +87,7 @@ abstract class MyPeripheralManagerHostApi {
void removeService(int serviceHashCodeArgs); void removeService(int serviceHashCodeArgs);
void clearServices(); void clearServices();
@async @async
void startAdvertising(MyAdvertiseDataArgs advertiseDataArgs); void startAdvertising(MyAdvertisementArgs advertisementArgs);
void stopAdvertising(); void stopAdvertising();
int getMaximumWriteLength(int centralHashCodeArgs); int getMaximumWriteLength(int centralHashCodeArgs);
void sendReadCharacteristicReply( void sendReadCharacteristicReply(
@ -162,13 +162,13 @@ class MyPeripheralArgs {
MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs); MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs);
} }
class MyAdvertiseDataArgs { class MyAdvertisementArgs {
final String? nameArgs; final String? nameArgs;
final List<String?> serviceUUIDsArgs; final List<String?> serviceUUIDsArgs;
final Map<String?, Uint8List?> serviceDataArgs; final Map<String?, Uint8List?> serviceDataArgs;
final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs; final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs;
MyAdvertiseDataArgs( MyAdvertisementArgs(
this.nameArgs, this.nameArgs,
this.serviceUUIDsArgs, this.serviceUUIDsArgs,
this.serviceDataArgs, this.serviceDataArgs,

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_android name: bluetooth_low_energy_android
description: Android implementation of the bluetooth_low_energy plugin. 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment: environment:
@ -10,14 +10,13 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
logging: ^1.2.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_lints: ^3.0.0
pigeon: ^11.0.1 pigeon: ^12.0.1
flutter: flutter:
plugin: plugin:

View File

@ -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 ## 3.0.2
* Fix the issue that `getMaximumWriteLength` is wrong and coerce the value from 20 to 512. * Fix the issue that `getMaximumWriteLength` is wrong and coerce the value from 20 to 512.

View File

@ -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 // See also: https://pub.dev/packages/pigeon
import Foundation import Foundation
@ -140,13 +140,13 @@ struct MyPeripheralArgs {
} }
/// Generated class from Pigeon that represents data sent in messages. /// Generated class from Pigeon that represents data sent in messages.
struct MyAdvertiseDataArgs { struct MyAdvertisementArgs {
var nameArgs: String? = nil var nameArgs: String? = nil
var serviceUUIDsArgs: [String?] var serviceUUIDsArgs: [String?]
var serviceDataArgs: [String?: FlutterStandardTypedData?] var serviceDataArgs: [String?: FlutterStandardTypedData?]
var manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = nil var manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = nil
static func fromList(_ list: [Any?]) -> MyAdvertiseDataArgs? { static func fromList(_ list: [Any?]) -> MyAdvertisementArgs? {
let nameArgs: String? = nilOrValue(list[0]) let nameArgs: String? = nilOrValue(list[0])
let serviceUUIDsArgs = list[1] as! [String?] let serviceUUIDsArgs = list[1] as! [String?]
let serviceDataArgs = list[2] as! [String?: FlutterStandardTypedData?] let serviceDataArgs = list[2] as! [String?: FlutterStandardTypedData?]
@ -155,7 +155,7 @@ struct MyAdvertiseDataArgs {
manufacturerSpecificDataArgs = MyManufacturerSpecificDataArgs.fromList(manufacturerSpecificDataArgsList) manufacturerSpecificDataArgs = MyManufacturerSpecificDataArgs.fromList(manufacturerSpecificDataArgsList)
} }
return MyAdvertiseDataArgs( return MyAdvertisementArgs(
nameArgs: nameArgs, nameArgs: nameArgs,
serviceUUIDsArgs: serviceUUIDsArgs, serviceUUIDsArgs: serviceUUIDsArgs,
serviceDataArgs: serviceDataArgs, serviceDataArgs: serviceDataArgs,
@ -575,7 +575,7 @@ private class MyCentralManagerFlutterApiCodecReader: FlutterStandardReader {
override func readValue(ofType type: UInt8) -> Any? { override func readValue(ofType type: UInt8) -> Any? {
switch type { switch type {
case 128: case 128:
return MyAdvertiseDataArgs.fromList(self.readValue() as! [Any?]) return MyAdvertisementArgs.fromList(self.readValue() as! [Any?])
case 129: case 129:
return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?]) return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?])
case 130: case 130:
@ -592,7 +592,7 @@ private class MyCentralManagerFlutterApiCodecReader: FlutterStandardReader {
private class MyCentralManagerFlutterApiCodecWriter: FlutterStandardWriter { private class MyCentralManagerFlutterApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) { override func writeValue(_ value: Any) {
if let value = value as? MyAdvertiseDataArgs { if let value = value as? MyAdvertisementArgs {
super.writeByte(128) super.writeByte(128)
super.writeValue(value.toList()) super.writeValue(value.toList())
} else if let value = value as? MyGattCharacteristicArgs { } else if let value = value as? MyGattCharacteristicArgs {
@ -627,8 +627,14 @@ class MyCentralManagerFlutterApiCodec: FlutterStandardMessageCodec {
static let shared = MyCentralManagerFlutterApiCodec(readerWriter: MyCentralManagerFlutterApiCodecReaderWriter()) static let shared = MyCentralManagerFlutterApiCodec(readerWriter: MyCentralManagerFlutterApiCodecReaderWriter())
} }
/// Generated class from Pigeon that represents Flutter messages that can be called from Swift. /// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift.
class MyCentralManagerFlutterApi { protocol MyCentralManagerFlutterApiProtocol {
func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onDiscovered(peripheralArgs peripheralArgsArg: MyPeripheralArgs, rssiArgs rssiArgsArg: Int64, advertisementArgs advertisementArgsArg: MyAdvertisementArgs, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onPeripheralStateChanged(peripheralArgs peripheralArgsArg: MyPeripheralArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onCharacteristicValueChanged(characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result<Void, FlutterError>) -> Void)
}
class MyCentralManagerFlutterApi: MyCentralManagerFlutterApiProtocol {
private let binaryMessenger: FlutterBinaryMessenger private let binaryMessenger: FlutterBinaryMessenger
init(binaryMessenger: FlutterBinaryMessenger){ init(binaryMessenger: FlutterBinaryMessenger){
self.binaryMessenger = binaryMessenger self.binaryMessenger = binaryMessenger
@ -636,28 +642,28 @@ class MyCentralManagerFlutterApi {
var codec: FlutterStandardMessageCodec { var codec: FlutterStandardMessageCodec {
return MyCentralManagerFlutterApiCodec.shared return MyCentralManagerFlutterApiCodec.shared
} }
func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping () -> Void) { func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result<Void, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec) let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec)
channel.sendMessage([stateNumberArgsArg] as [Any?]) { _ in 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered", binaryMessenger: binaryMessenger, codec: codec) 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 channel.sendMessage([peripheralArgsArg, rssiArgsArg, advertisementArgsArg] as [Any?]) { _ in
completion() 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged", binaryMessenger: binaryMessenger, codec: codec) let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged", binaryMessenger: binaryMessenger, codec: codec)
channel.sendMessage([peripheralArgsArg, stateArgsArg] as [Any?]) { _ in 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged", binaryMessenger: binaryMessenger, codec: codec) let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged", binaryMessenger: binaryMessenger, codec: codec)
channel.sendMessage([characteristicArgsArg, valueArgsArg] as [Any?]) { _ in 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? { override func readValue(ofType type: UInt8) -> Any? {
switch type { switch type {
case 128: case 128:
return MyAdvertiseDataArgs.fromList(self.readValue() as! [Any?]) return MyAdvertisementArgs.fromList(self.readValue() as! [Any?])
case 129: case 129:
return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?]) return MyGattCharacteristicArgs.fromList(self.readValue() as! [Any?])
case 130: case 130:
@ -684,7 +690,7 @@ private class MyPeripheralManagerHostApiCodecReader: FlutterStandardReader {
private class MyPeripheralManagerHostApiCodecWriter: FlutterStandardWriter { private class MyPeripheralManagerHostApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) { override func writeValue(_ value: Any) {
if let value = value as? MyAdvertiseDataArgs { if let value = value as? MyAdvertisementArgs {
super.writeByte(128) super.writeByte(128)
super.writeValue(value.toList()) super.writeValue(value.toList())
} else if let value = value as? MyGattCharacteristicArgs { } else if let value = value as? MyGattCharacteristicArgs {
@ -728,7 +734,7 @@ protocol MyPeripheralManagerHostApi {
func addService(serviceArgs: MyGattServiceArgs, completion: @escaping (Result<Void, Error>) -> Void) func addService(serviceArgs: MyGattServiceArgs, completion: @escaping (Result<Void, Error>) -> Void)
func removeService(serviceHashCodeArgs: Int64) throws func removeService(serviceHashCodeArgs: Int64) throws
func clearServices() throws func clearServices() throws
func startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, completion: @escaping (Result<Void, Error>) -> Void) func startAdvertising(advertisementArgs: MyAdvertisementArgs, completion: @escaping (Result<Void, Error>) -> Void)
func stopAdvertising() throws func stopAdvertising() throws
func getMaximumWriteLength(centralHashCodeArgs: Int64) throws -> Int64 func getMaximumWriteLength(centralHashCodeArgs: Int64) throws -> Int64
func sendReadCharacteristicReply(centralHashCodeArgs: Int64, characteristicHashCodeArgs: Int64, idArgs: Int64, offsetArgs: Int64, statusArgs: Bool, valueArgs: FlutterStandardTypedData) throws 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 { if let api = api {
startAdvertisingChannel.setMessageHandler { message, reply in startAdvertisingChannel.setMessageHandler { message, reply in
let args = message as! [Any?] let args = message as! [Any?]
let advertiseDataArgsArg = args[0] as! MyAdvertiseDataArgs let advertisementArgsArg = args[0] as! MyAdvertisementArgs
api.startAdvertising(advertiseDataArgs: advertiseDataArgsArg) { result in api.startAdvertising(advertisementArgs: advertisementArgsArg) { result in
switch result { switch result {
case .success: case .success:
reply(wrapResult(nil)) reply(wrapResult(nil))
@ -953,8 +959,14 @@ class MyPeripheralManagerFlutterApiCodec: FlutterStandardMessageCodec {
static let shared = MyPeripheralManagerFlutterApiCodec(readerWriter: MyPeripheralManagerFlutterApiCodecReaderWriter()) static let shared = MyPeripheralManagerFlutterApiCodec(readerWriter: MyPeripheralManagerFlutterApiCodecReaderWriter())
} }
/// Generated class from Pigeon that represents Flutter messages that can be called from Swift. /// Generated protocol from Pigeon that represents Flutter messages that can be called from Swift.
class MyPeripheralManagerFlutterApi { protocol MyPeripheralManagerFlutterApiProtocol {
func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onReadCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onWriteCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, idArgs idArgsArg: Int64, offsetArgs offsetArgsArg: Int64, valueArgs valueArgsArg: FlutterStandardTypedData, completion: @escaping (Result<Void, FlutterError>) -> Void)
func onNotifyCharacteristicCommandReceived(centralArgs centralArgsArg: MyCentralArgs, characteristicArgs characteristicArgsArg: MyGattCharacteristicArgs, stateArgs stateArgsArg: Bool, completion: @escaping (Result<Void, FlutterError>) -> Void)
}
class MyPeripheralManagerFlutterApi: MyPeripheralManagerFlutterApiProtocol {
private let binaryMessenger: FlutterBinaryMessenger private let binaryMessenger: FlutterBinaryMessenger
init(binaryMessenger: FlutterBinaryMessenger){ init(binaryMessenger: FlutterBinaryMessenger){
self.binaryMessenger = binaryMessenger self.binaryMessenger = binaryMessenger
@ -962,28 +974,28 @@ class MyPeripheralManagerFlutterApi {
var codec: FlutterStandardMessageCodec { var codec: FlutterStandardMessageCodec {
return MyPeripheralManagerFlutterApiCodec.shared return MyPeripheralManagerFlutterApiCodec.shared
} }
func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping () -> Void) { func onStateChanged(stateNumberArgs stateNumberArgsArg: Int64, completion: @escaping (Result<Void, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec) let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged", binaryMessenger: binaryMessenger, codec: codec)
channel.sendMessage([stateNumberArgsArg] as [Any?]) { _ in 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) 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 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) 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 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, FlutterError>) -> Void) {
let channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", binaryMessenger: binaryMessenger, codec: codec) 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 channel.sendMessage([centralArgsArg, characteristicArgsArg, stateArgsArg] as [Any?]) { _ in
completion() completion(.success(Void()))
} }
} }
} }

View File

@ -16,6 +16,9 @@ import FlutterMacOS
#error("Unsupported platform.") #error("Unsupported platform.")
#endif #endif
// This extension of Error is required to do use FlutterError in any Swift code.
extension FlutterError: Error {}
extension CBManagerState { extension CBManagerState {
func toArgs() -> MyBluetoothLowEnergyStateArgs { func toArgs() -> MyBluetoothLowEnergyStateArgs {
switch self { switch self {
@ -125,7 +128,7 @@ extension UInt16 {
} }
extension [String: Any] { extension [String: Any] {
func toAdvertiseDataArgs() -> MyAdvertiseDataArgs { func toAdvertisementArgs() -> MyAdvertisementArgs {
let nameArgs = self[CBAdvertisementDataLocalNameKey] as? String let nameArgs = self[CBAdvertisementDataLocalNameKey] as? String
let serviceUUIDs = self[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] ?? [] let serviceUUIDs = self[CBAdvertisementDataServiceUUIDsKey] as? [CBUUID] ?? []
let serviceUUIDsArgs = serviceUUIDs.map { uuid in uuid.uuidString } let serviceUUIDsArgs = serviceUUIDs.map { uuid in uuid.uuidString }
@ -138,7 +141,7 @@ extension [String: Any] {
let serviceDataArgs = [String?: FlutterStandardTypedData?](uniqueKeysWithValues: serviceDataArgsKeyWithValues) let serviceDataArgs = [String?: FlutterStandardTypedData?](uniqueKeysWithValues: serviceDataArgsKeyWithValues)
let manufacturerSpecificData = self[CBAdvertisementDataManufacturerDataKey] as? Data let manufacturerSpecificData = self[CBAdvertisementDataManufacturerDataKey] as? Data
let manufacturerSpecificDataArgs = manufacturerSpecificData?.toManufacturerSpecificDataArgs() 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 { extension MyAdvertisementArgs {
func toAdvertiseData() throws -> [String : Any] { func toAdvertisement() throws -> [String : Any] {
// CoreBluetooth only support `CBAdvertisementDataLocalNameKey` and `CBAdvertisementDataServiceUUIDsKey`, see https://developer.apple.com/documentation/corebluetooth/cbperipheralmanager/1393252-startadvertising // 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 { if nameArgs != nil {
let name = nameArgs! let name = nameArgs!
advertiseData[CBAdvertisementDataLocalNameKey] = name advertisement[CBAdvertisementDataLocalNameKey] = name
} }
if serviceUUIDsArgs.count > 0 { if serviceUUIDsArgs.count > 0 {
var serviceUUIDs = [CBUUID]() var serviceUUIDs = [CBUUID]()
@ -172,7 +175,7 @@ extension MyAdvertiseDataArgs {
let uuid = CBUUID(string: uuidArgs) let uuid = CBUUID(string: uuidArgs)
serviceUUIDs.append(uuid) serviceUUIDs.append(uuid)
} }
advertiseData[CBAdvertisementDataServiceUUIDsKey] = serviceUUIDs advertisement[CBAdvertisementDataServiceUUIDsKey] = serviceUUIDs
} }
// if serviceDataArgs.count > 0 { // if serviceDataArgs.count > 0 {
// var serviceData = [CBUUID: Data]() // var serviceData = [CBUUID: Data]()
@ -187,13 +190,13 @@ extension MyAdvertiseDataArgs {
// let data = dataArgs.data // let data = dataArgs.data
// serviceData[uuid] = data // serviceData[uuid] = data
// } // }
// advertiseData[CBAdvertisementDataServiceDataKey] = serviceData // advertisement[CBAdvertisementDataServiceDataKey] = serviceData
// } // }
// if manufacturerSpecificDataArgs != nil { // if manufacturerSpecificDataArgs != nil {
// let manufacturerSpecificData = manufacturerSpecificDataArgs!.toManufacturerSpecificData() // let manufacturerSpecificData = manufacturerSpecificDataArgs!.toManufacturerSpecificData()
// advertiseData[CBAdvertisementDataManufacturerDataKey] = manufacturerSpecificData // advertisement[CBAdvertisementDataManufacturerDataKey] = manufacturerSpecificData
// } // }
return advertiseData return advertisement
} }
} }

View File

@ -307,7 +307,7 @@ class MyCentralManager: MyCentralManagerHostApi {
setUpCompletion!(.success(args)) setUpCompletion!(.success(args))
setUpCompletion = nil setUpCompletion = nil
} }
api.onStateChanged(stateNumberArgs: stateNumberArgs) {} api.onStateChanged(stateNumberArgs: stateNumberArgs) {_ in }
} }
func didDiscover(_ peripheral: CBPeripheral, _ advertisementData: [String : Any], _ rssi: NSNumber) { func didDiscover(_ peripheral: CBPeripheral, _ advertisementData: [String : Any], _ rssi: NSNumber) {
@ -318,8 +318,8 @@ class MyCentralManager: MyCentralManagerHostApi {
peripherals[peripheralHashCodeArgs] = peripheral peripherals[peripheralHashCodeArgs] = peripheral
peripheralsArgs[peripheralHashCode] = peripheralArgs peripheralsArgs[peripheralHashCode] = peripheralArgs
let rssiArgs = rssi.int64Value let rssiArgs = rssi.int64Value
let advertiseDataArgs = advertisementData.toAdvertiseDataArgs() let advertisementArgs = advertisementData.toAdvertisementArgs()
api.onDiscovered(peripheralArgs: peripheralArgs, rssiArgs: rssiArgs, advertiseDataArgs: advertiseDataArgs) {} api.onDiscovered(peripheralArgs: peripheralArgs, rssiArgs: rssiArgs, advertisementArgs: advertisementArgs) {_ in }
} }
func didConnect(_ peripheral: CBPeripheral) { func didConnect(_ peripheral: CBPeripheral) {
@ -329,7 +329,7 @@ class MyCentralManager: MyCentralManagerHostApi {
} }
let peripheralHashCodeArgs = peripheralArgs.hashCodeArgs let peripheralHashCodeArgs = peripheralArgs.hashCodeArgs
let stateArgs = true let stateArgs = true
api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {} api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {_ in }
guard let completion = connectCompletions.removeValue(forKey: peripheralHashCodeArgs) else { guard let completion = connectCompletions.removeValue(forKey: peripheralHashCodeArgs) else {
return return
} }
@ -390,7 +390,7 @@ class MyCentralManager: MyCentralManagerHostApi {
} }
} }
let stateArgs = false let stateArgs = false
api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {} api.onPeripheralStateChanged(peripheralArgs: peripheralArgs, stateArgs: stateArgs) {_ in }
guard let completion = disconnectCompletions.removeValue(forKey: peripheralHashCodeArgs) else { guard let completion = disconnectCompletions.removeValue(forKey: peripheralHashCodeArgs) else {
return return
} }
@ -550,7 +550,7 @@ class MyCentralManager: MyCentralManagerHostApi {
guard let completion = readCharacteristicCompletions.removeValue(forKey: characteristicHashCodeArgs) else { guard let completion = readCharacteristicCompletions.removeValue(forKey: characteristicHashCodeArgs) else {
let value = characteristic.value ?? Data() let value = characteristic.value ?? Data()
let valueArgs = FlutterStandardTypedData(bytes: value) let valueArgs = FlutterStandardTypedData(bytes: value)
api.onCharacteristicValueChanged(characteristicArgs: characteristicArgs, valueArgs: valueArgs) {} api.onCharacteristicValueChanged(characteristicArgs: characteristicArgs, valueArgs: valueArgs) {_ in }
return return
} }
if error == nil { if error == nil {

View File

@ -181,13 +181,13 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
self.servicesArgs.removeValue(forKey: serviceHashCode) self.servicesArgs.removeValue(forKey: serviceHashCode)
} }
func startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, completion: @escaping (Result<Void, Error>) -> Void) { func startAdvertising(advertisementArgs: MyAdvertisementArgs, completion: @escaping (Result<Void, Error>) -> Void) {
do { do {
if startAdvertisingCompletion != nil { if startAdvertisingCompletion != nil {
throw MyError.illegalState throw MyError.illegalState
} }
let advertisementData = try advertiseDataArgs.toAdvertiseData() let advertisement = try advertisementArgs.toAdvertisement()
peripheralManager.startAdvertising(advertisementData) peripheralManager.startAdvertising(advertisement)
startAdvertisingCompletion = completion startAdvertisingCompletion = completion
} catch { } catch {
completion(.failure(error)) completion(.failure(error))
@ -264,7 +264,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
setUpCompletion!(.success(args)) setUpCompletion!(.success(args))
setUpCompletion = nil setUpCompletion = nil
} }
api.onStateChanged(stateNumberArgs: stateNumberArgs) {} api.onStateChanged(stateNumberArgs: stateNumberArgs) {_ in }
} }
func didAdd(_ service: CBService, _ error: Error?) { func didAdd(_ service: CBService, _ error: Error?) {
@ -311,7 +311,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
let idArgs = Int64(request.hash) let idArgs = Int64(request.hash)
requests[idArgs] = request requests[idArgs] = request
let offsetArgs = Int64(request.offset) 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]) { func didReceiveWrite(_ requests: [CBATTRequest]) {
@ -343,7 +343,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
return return
} }
let valueArgs = FlutterStandardTypedData(bytes: value) 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) { func didSubscribeTo(_ central: CBCentral, _ characteristic: CBCharacteristic) {
@ -356,7 +356,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
return return
} }
let stateArgs = true 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) { func didUnsubscribeFrom(_ central: CBCentral, _ characteristic: CBCharacteristic) {
@ -369,7 +369,7 @@ class MyPeripheralManager: MyPeripheralManagerHostApi {
return return
} }
let stateArgs = false let stateArgs = false
api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {} api.onNotifyCharacteristicCommandReceived(centralArgs: centralArgs, characteristicArgs: characteristicArgs, stateArgs: stateArgs) {_ in }
} }
func isReadyToUpdateSubscribers() { func isReadyToUpdateSubscribers() {

View File

@ -26,4 +26,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189 PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
COCOAPODS: 1.11.3 COCOAPODS: 1.12.1

View File

@ -8,22 +8,35 @@ import 'package:convert/convert.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
CentralManager get centralManager => CentralManager.instance;
PeripheralManager get peripheralManager => PeripheralManager.instance;
void main() { void main() {
runZonedGuarded(onStartUp, onCrashed); runZonedGuarded(onStartUp, onCrashed);
} }
void onStartUp() async { void onStartUp() async {
Logger.root.onRecord.listen(onLogRecord);
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await CentralManager.instance.setUp(); await centralManager.setUp();
await PeripheralManager.instance.setUp(); await peripheralManager.setUp();
runApp(const MyApp()); runApp(const MyApp());
} }
void onCrashed(Object error, StackTrace stackTrace) { void onCrashed(Object error, StackTrace stackTrace) {
Logger.root.shout('App crached.', error, stackTrace);
}
void onLogRecord(LogRecord record) {
log( log(
'$error', record.message,
error: error, time: record.time,
stackTrace: stackTrace, 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<HomeView> {
} }
} }
CentralManager get centralManager => CentralManager.instance;
class ScannerView extends StatefulWidget { class ScannerView extends StatefulWidget {
const ScannerView({super.key}); const ScannerView({super.key});
@ -237,7 +248,7 @@ class _ScannerViewState extends State<ScannerView> {
builder: (context, discoveredEventArgs, child) { builder: (context, discoveredEventArgs, child) {
// final items = discoveredEventArgs; // final items = discoveredEventArgs;
final items = discoveredEventArgs final items = discoveredEventArgs
.where((eventArgs) => eventArgs.advertiseData.name != null) .where((eventArgs) => eventArgs.advertisement.name != null)
.toList(); .toList();
return ListView.separated( return ListView.separated(
itemBuilder: (context, i) { itemBuilder: (context, i) {
@ -245,8 +256,8 @@ class _ScannerViewState extends State<ScannerView> {
final item = items[i]; final item = items[i];
final uuid = item.peripheral.uuid; final uuid = item.peripheral.uuid;
final rssi = item.rssi; final rssi = item.rssi;
final advertiseData = item.advertiseData; final advertisement = item.advertisement;
final name = advertiseData.name; final name = advertisement.name;
return ListTile( return ListTile(
onTap: () async { onTap: () async {
final discovering = this.discovering.value; final discovering = this.discovering.value;
@ -273,7 +284,7 @@ class _ScannerViewState extends State<ScannerView> {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
builder: (context) { builder: (context) {
final manufacturerSpecificData = final manufacturerSpecificData =
advertiseData.manufacturerSpecificData; advertisement.manufacturerSpecificData;
return ListView.separated( return ListView.separated(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 16.0, horizontal: 16.0,
@ -428,7 +439,7 @@ class _PeripheralViewState extends State<PeripheralView> {
}, },
); );
rssiTimer = Timer.periodic( rssiTimer = Timer.periodic(
const Duration(seconds: 1), const Duration(seconds: 5),
(timer) async { (timer) async {
final state = this.state.value; final state = this.state.value;
if (state) { if (state) {
@ -458,7 +469,7 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
PreferredSizeWidget buildAppBar(BuildContext context) { PreferredSizeWidget buildAppBar(BuildContext context) {
final title = eventArgs.advertiseData.name ?? '<EMPTY NAME>'; final title = eventArgs.advertisement.name ?? '';
return AppBar( return AppBar(
title: Text(title), title: Text(title),
actions: [ actions: [
@ -804,8 +815,6 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
} }
PeripheralManager get peripheralManager => PeripheralManager.instance;
class AdvertiserView extends StatefulWidget { class AdvertiserView extends StatefulWidget {
const AdvertiserView({super.key}); const AdvertiserView({super.key});
@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget {
State<AdvertiserView> createState() => _AdvertiserViewState(); State<AdvertiserView> createState() => _AdvertiserViewState();
} }
class _AdvertiserViewState extends State<AdvertiserView> { class _AdvertiserViewState extends State<AdvertiserView>
with SingleTickerProviderStateMixin {
late final ValueNotifier<BluetoothLowEnergyState> state; late final ValueNotifier<BluetoothLowEnergyState> state;
late final ValueNotifier<bool> advertising; late final ValueNotifier<bool> advertising;
late final ValueNotifier<List<Log>> logs; late final ValueNotifier<List<Log>> logs;
@ -856,11 +866,11 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x01, 0x02, 0x03]); final value = Uint8List.fromList([0x01, 0x02, 0x03]);
await peripheralManager.sendReadCharacteristicReply( await peripheralManager.sendReadCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
value, value: value,
); );
}, },
); );
@ -884,10 +894,10 @@ class _AdvertiserViewState extends State<AdvertiserView> {
const status = true; const status = true;
await peripheralManager.sendWriteCharacteristicReply( await peripheralManager.sendWriteCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
); );
}, },
); );
@ -911,8 +921,8 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x03, 0x02, 0x01]); final value = Uint8List.fromList([0x03, 0x02, 0x01]);
await peripheralManager.notifyCharacteristicValueChanged( await peripheralManager.notifyCharacteristicValueChanged(
central, central,
characteristic, characteristic: characteristic,
value, value: value,
); );
} }
}, },
@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State<AdvertiserView> {
], ],
); );
await peripheralManager.addService(service); await peripheralManager.addService(service);
final advertiseData = AdvertiseData( final advertisement = Advertisement(
name: 'flutter', name: 'flutter',
manufacturerSpecificData: ManufacturerSpecificData( manufacturerSpecificData: ManufacturerSpecificData(
id: 0x2e19, id: 0x2e19,
data: Uint8List.fromList([0x01, 0x02, 0x03]), data: Uint8List.fromList([0x01, 0x02, 0x03]),
), ),
); );
await peripheralManager.startAdvertising(advertiseData); await peripheralManager.startAdvertising(advertisement);
advertising.value = true; advertising.value = true;
} }

View File

@ -20,4 +20,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
COCOAPODS: 1.11.3 COCOAPODS: 1.12.1

View File

@ -15,15 +15,15 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.0.2" version: "4.0.0"
bluetooth_low_energy_platform_interface: bluetooth_low_energy_platform_interface:
dependency: "direct main" dependency: "direct main"
description: description:
name: bluetooth_low_energy_platform_interface name: bluetooth_low_energy_platform_interface
sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "4.0.0"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
@ -102,10 +102,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "3.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -133,10 +133,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev" url: "https://pub.dev"
source: hosted 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: matcher:
dependency: transitive dependency: transitive
description: description:

View File

@ -17,7 +17,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
bluetooth_low_energy_darwin: bluetooth_low_energy_darwin:
# When depending on this package from a real application you should use: # When depending on this package from a real application you should use:
# bluetooth_low_energy: ^x.y.z # bluetooth_low_energy: ^x.y.z
@ -31,6 +31,7 @@ dependencies:
cupertino_icons: ^1.0.2 cupertino_icons: ^1.0.2
convert: ^3.1.1 convert: ^3.1.1
intl: ^0.18.1 intl: ^0.18.1
logging: ^1.2.0
dev_dependencies: dev_dependencies:
integration_test: integration_test:
@ -43,7 +44,7 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # 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 # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@ -1,9 +1,11 @@
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; 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 { abstract class BluetoothLowEnergyDarwin {
static void registerWith() { static void registerWith() {
BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); MyCentralManager.instance = MyCentralManager2();
MyPeripheralManager.instance = MyPeripheralManager2();
} }
} }

View File

@ -15,8 +15,8 @@ extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs {
} }
} }
extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs { extension MyAdvertisementArgsX on MyAdvertisementArgs {
AdvertiseData toAdvertiseData() { Advertisement toAdvertisement() {
final name = nameArgs; final name = nameArgs;
final serviceUUIDs = serviceUUIDsArgs final serviceUUIDs = serviceUUIDsArgs
.cast<String>() .cast<String>()
@ -31,7 +31,7 @@ extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs {
); );
final manufacturerSpecificData = final manufacturerSpecificData =
manufacturerSpecificDataArgs?.toManufacturerSpecificData(); manufacturerSpecificDataArgs?.toManufacturerSpecificData();
return AdvertiseData( return Advertisement(
name: name, name: name,
serviceUUIDs: serviceUUIDs, serviceUUIDs: serviceUUIDs,
serviceData: serviceData, serviceData: serviceData,
@ -136,8 +136,8 @@ extension MyCentralArgsX on MyCentralArgs {
} }
} }
extension AdvertiseDataX on AdvertiseData { extension AdvertisementX on Advertisement {
MyAdvertiseDataArgs toArgs() { MyAdvertisementArgs toArgs() {
final nameArgs = name; final nameArgs = name;
final serviceUUIDsArgs = final serviceUUIDsArgs =
serviceUUIDs.map((uuid) => uuid.toString()).toList(); serviceUUIDs.map((uuid) => uuid.toString()).toList();
@ -147,7 +147,7 @@ extension AdvertiseDataX on AdvertiseData {
return MapEntry(uuidArgs, dataArgs); return MapEntry(uuidArgs, dataArgs);
}); });
final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs(); final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs();
return MyAdvertiseDataArgs( return MyAdvertisementArgs(
nameArgs: nameArgs, nameArgs: nameArgs,
serviceUUIDsArgs: serviceUUIDsArgs, serviceUUIDsArgs: serviceUUIDsArgs,
serviceDataArgs: serviceDataArgs, serviceDataArgs: serviceDataArgs,

View File

@ -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 // 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 // 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/foundation.dart' show ReadBuffer, WriteBuffer;
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
List<Object?> wrapResponse({Object? result, PlatformException? error, bool empty = false}) {
if (empty) {
return <Object?>[];
}
if (error == null) {
return <Object?>[result];
}
return <Object?>[error.code, error.message, error.details];
}
enum MyBluetoothLowEnergyStateArgs { enum MyBluetoothLowEnergyStateArgs {
unknown, unknown,
@ -123,8 +132,8 @@ class MyPeripheralArgs {
} }
} }
class MyAdvertiseDataArgs { class MyAdvertisementArgs {
MyAdvertiseDataArgs({ MyAdvertisementArgs({
this.nameArgs, this.nameArgs,
required this.serviceUUIDsArgs, required this.serviceUUIDsArgs,
required this.serviceDataArgs, required this.serviceDataArgs,
@ -148,9 +157,9 @@ class MyAdvertiseDataArgs {
]; ];
} }
static MyAdvertiseDataArgs decode(Object result) { static MyAdvertisementArgs decode(Object result) {
result as List<Object?>; result as List<Object?>;
return MyAdvertiseDataArgs( return MyAdvertisementArgs(
nameArgs: result[0] as String?, nameArgs: result[0] as String?,
serviceUUIDsArgs: (result[1] as List<Object?>?)!.cast<String?>(), serviceUUIDsArgs: (result[1] as List<Object?>?)!.cast<String?>(),
serviceDataArgs: (result[2] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(), serviceDataArgs: (result[2] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(),
@ -654,7 +663,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
const _MyCentralManagerFlutterApiCodec(); const _MyCentralManagerFlutterApiCodec();
@override @override
void writeValue(WriteBuffer buffer, Object? value) { void writeValue(WriteBuffer buffer, Object? value) {
if (value is MyAdvertiseDataArgs) { if (value is MyAdvertisementArgs) {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyGattCharacteristicArgs) { } else if (value is MyGattCharacteristicArgs) {
@ -678,7 +687,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
Object? readValueOfType(int type, ReadBuffer buffer) { Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) { switch (type) {
case 128: case 128:
return MyAdvertiseDataArgs.decode(readValue(buffer)!); return MyAdvertisementArgs.decode(readValue(buffer)!);
case 129: case 129:
return MyGattCharacteristicArgs.decode(readValue(buffer)!); return MyGattCharacteristicArgs.decode(readValue(buffer)!);
case 130: case 130:
@ -698,7 +707,7 @@ abstract class MyCentralManagerFlutterApi {
void onStateChanged(int stateNumberArgs); 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); void onPeripheralStateChanged(MyPeripheralArgs peripheralArgs, bool stateArgs);
@ -719,8 +728,14 @@ abstract class MyCentralManagerFlutterApi {
final int? arg_stateNumberArgs = (args[0] as int?); final int? arg_stateNumberArgs = (args[0] as int?);
assert(arg_stateNumberArgs != null, assert(arg_stateNumberArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.');
api.onStateChanged(arg_stateNumberArgs!); try {
return; 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?); final int? arg_rssiArgs = (args[1] as int?);
assert(arg_rssiArgs != null, assert(arg_rssiArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null int.'); '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?); final MyAdvertisementArgs? arg_advertisementArgs = (args[2] as MyAdvertisementArgs?);
assert(arg_advertiseDataArgs != null, assert(arg_advertisementArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertiseDataArgs.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertisementArgs.');
api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertiseDataArgs!); try {
return; 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?); final bool? arg_stateArgs = (args[1] as bool?);
assert(arg_stateArgs != null, assert(arg_stateArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.');
api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!); try {
return; 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?); final Uint8List? arg_valueArgs = (args[1] as Uint8List?);
assert(arg_valueArgs != null, assert(arg_valueArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.');
api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!); try {
return; 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(); const _MyPeripheralManagerHostApiCodec();
@override @override
void writeValue(WriteBuffer buffer, Object? value) { void writeValue(WriteBuffer buffer, Object? value) {
if (value is MyAdvertiseDataArgs) { if (value is MyAdvertisementArgs) {
buffer.putUint8(128); buffer.putUint8(128);
writeValue(buffer, value.encode()); writeValue(buffer, value.encode());
} else if (value is MyGattCharacteristicArgs) { } else if (value is MyGattCharacteristicArgs) {
@ -827,7 +860,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec {
Object? readValueOfType(int type, ReadBuffer buffer) { Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) { switch (type) {
case 128: case 128:
return MyAdvertiseDataArgs.decode(readValue(buffer)!); return MyAdvertisementArgs.decode(readValue(buffer)!);
case 129: case 129:
return MyGattCharacteristicArgs.decode(readValue(buffer)!); return MyGattCharacteristicArgs.decode(readValue(buffer)!);
case 130: case 130:
@ -947,12 +980,12 @@ class MyPeripheralManagerHostApi {
} }
} }
Future<void> startAdvertising(MyAdvertiseDataArgs arg_advertiseDataArgs) async { Future<void> startAdvertising(MyAdvertisementArgs arg_advertisementArgs) async {
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>( final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
'dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerHostApi.startAdvertising', codec, 'dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerHostApi.startAdvertising', codec,
binaryMessenger: _binaryMessenger); binaryMessenger: _binaryMessenger);
final List<Object?>? replyList = final List<Object?>? replyList =
await channel.send(<Object?>[arg_advertiseDataArgs]) as List<Object?>?; await channel.send(<Object?>[arg_advertisementArgs]) as List<Object?>?;
if (replyList == null) { if (replyList == null) {
throw PlatformException( throw PlatformException(
code: 'channel-error', code: 'channel-error',
@ -1144,8 +1177,14 @@ abstract class MyPeripheralManagerFlutterApi {
final int? arg_stateNumberArgs = (args[0] as int?); final int? arg_stateNumberArgs = (args[0] as int?);
assert(arg_stateNumberArgs != null, assert(arg_stateNumberArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.'); 'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.');
api.onStateChanged(arg_stateNumberArgs!); try {
return; 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?); final int? arg_offsetArgs = (args[3] as int?);
assert(arg_offsetArgs != null, assert(arg_offsetArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived was null, expected non-null int.'); '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!); try {
return; 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?); final Uint8List? arg_valueArgs = (args[4] as Uint8List?);
assert(arg_valueArgs != null, assert(arg_valueArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived was null, expected non-null Uint8List.'); '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!); try {
return; 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?); final bool? arg_stateArgs = (args[2] as bool?);
assert(arg_stateArgs != null, assert(arg_stateArgs != null,
'Argument for dev.flutter.pigeon.bluetooth_low_energy_darwin.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived was null, expected non-null bool.'); '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!); try {
return; 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()));
}
}); });
} }
} }

View File

@ -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();
}

View File

@ -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<BluetoothLowEnergyStateChangedEventArgs>
_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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@protected
Future<void> throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw BluetoothLowEnergyError(
'$state is expected, but current state is ${this.state}.',
);
}
}
}

View File

@ -1,28 +1,47 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
import 'package:flutter/foundation.dart';
import 'my_api.dart'; import 'my_api.dart';
import 'my_bluetooth_low_energy_manager.dart';
import 'my_gatt_characteristic2.dart'; import 'my_gatt_characteristic2.dart';
import 'my_gatt_descriptor2.dart'; import 'my_gatt_descriptor2.dart';
class MyCentralManager extends MyBluetoothLowEnergyManager class MyCentralManager2 extends MyCentralManager
implements CentralManager, MyCentralManagerFlutterApi { implements MyCentralManagerFlutterApi {
MyCentralManager()
: _api = MyCentralManagerHostApi(),
_discoveredController = StreamController.broadcast(),
_peripheralStateChangedController = StreamController.broadcast(),
_characteristicValueChangedController = StreamController.broadcast();
final MyCentralManagerHostApi _api; final MyCentralManagerHostApi _api;
BluetoothLowEnergyState _state;
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
_stateChangedController;
final StreamController<DiscoveredEventArgs> _discoveredController; final StreamController<DiscoveredEventArgs> _discoveredController;
final StreamController<PeripheralStateChangedEventArgs> final StreamController<PeripheralStateChangedEventArgs>
_peripheralStateChangedController; _peripheralStateChangedController;
final StreamController<GattCharacteristicValueChangedEventArgs> final StreamController<GattCharacteristicValueChangedEventArgs>
_characteristicValueChangedController; _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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@override @override
Stream<DiscoveredEventArgs> get discovered => _discoveredController.stream; Stream<DiscoveredEventArgs> get discovered => _discoveredController.stream;
@override @override
@ -33,9 +52,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
get characteristicValueChanged => get characteristicValueChanged =>
_characteristicValueChangedController.stream; _characteristicValueChangedController.stream;
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw StateError(
'$state is expected, but current state is ${this.state}.');
}
}
@override @override
Future<void> setUp() async { Future<void> setUp() async {
await throwWithoutState(BluetoothLowEnergyState.unknown);
final args = await _api.setUp(); final args = await _api.setUp();
final stateArgs = final stateArgs =
MyBluetoothLowEnergyStateArgs.values[args.stateNumberArgs]; MyBluetoothLowEnergyStateArgs.values[args.stateNumberArgs];
@ -45,26 +70,26 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> startDiscovery() async { Future<void> startDiscovery() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.startDiscovery(); await _api.startDiscovery();
} }
@override @override
Future<void> stopDiscovery() async { Future<void> stopDiscovery() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.stopDiscovery(); await _api.stopDiscovery();
} }
@override @override
Future<void> connect(Peripheral peripheral) async { Future<void> connect(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
await _api.connect(peripheralHashCodeArgs); await _api.connect(peripheralHashCodeArgs);
} }
@override @override
Future<void> disconnect(Peripheral peripheral) async { Future<void> disconnect(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
await _api.disconnect(peripheralHashCodeArgs); await _api.disconnect(peripheralHashCodeArgs);
} }
@ -74,7 +99,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
Peripheral peripheral, { Peripheral peripheral, {
required GattCharacteristicWriteType type, required GattCharacteristicWriteType type,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
final typeArgs = type.toArgs(); final typeArgs = type.toArgs();
final typeNumberArgs = typeArgs.index; final typeNumberArgs = typeArgs.index;
@ -87,7 +112,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<int> readRSSI(Peripheral peripheral) async { Future<int> readRSSI(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final peripheralHashCodeArgs = peripheral.hashCode; final peripheralHashCodeArgs = peripheral.hashCode;
final rssi = await _api.readRSSI(peripheralHashCodeArgs); final rssi = await _api.readRSSI(peripheralHashCodeArgs);
return rssi; return rssi;
@ -95,7 +120,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<List<GattService>> discoverGATT(Peripheral peripheral) async { Future<List<GattService>> discoverGATT(Peripheral peripheral) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (peripheral is! MyPeripheral) { if (peripheral is! MyPeripheral) {
throw TypeError(); throw TypeError();
} }
@ -121,7 +146,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
Future<Uint8List> readCharacteristic( Future<Uint8List> readCharacteristic(
GattCharacteristic characteristic, GattCharacteristic characteristic,
) async { ) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -142,7 +167,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
required Uint8List value, required Uint8List value,
required GattCharacteristicWriteType type, required GattCharacteristicWriteType type,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -166,7 +191,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
GattCharacteristic characteristic, { GattCharacteristic characteristic, {
required bool state, required bool state,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (characteristic is! MyGattCharacteristic2) { if (characteristic is! MyGattCharacteristic2) {
throw TypeError(); throw TypeError();
} }
@ -184,7 +209,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
@override @override
Future<Uint8List> readDescriptor(GattDescriptor descriptor) async { Future<Uint8List> readDescriptor(GattDescriptor descriptor) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (descriptor is! MyGattDescriptor2) { if (descriptor is! MyGattDescriptor2) {
throw TypeError(); throw TypeError();
} }
@ -205,7 +230,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
GattDescriptor descriptor, { GattDescriptor descriptor, {
required Uint8List value, required Uint8List value,
}) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (descriptor is! MyGattDescriptor2) { if (descriptor is! MyGattDescriptor2) {
throw TypeError(); throw TypeError();
} }
@ -232,15 +257,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
void onDiscovered( void onDiscovered(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
int rssiArgs, int rssiArgs,
MyAdvertiseDataArgs advertiseDataArgs, MyAdvertisementArgs advertisementArgs,
) { ) {
final peripheral = peripheralArgs.toPeripheral(); final peripheral = peripheralArgs.toPeripheral();
final rssi = rssiArgs; final rssi = rssiArgs;
final advertiseData = advertiseDataArgs.toAdvertiseData(); final advertisement = advertisementArgs.toAdvertisement();
final eventArgs = DiscoveredEventArgs( final eventArgs = DiscoveredEventArgs(
peripheral, peripheral,
rssi, rssi,
advertiseData, advertisement,
); );
_discoveredController.add(eventArgs); _discoveredController.add(eventArgs);
} }

View File

@ -1,14 +1,16 @@
import 'dart:async'; import 'dart:async';
import 'dart:typed_data';
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
import 'package:flutter/foundation.dart';
import 'my_api.dart'; import 'my_api.dart';
import 'my_bluetooth_low_energy_manager.dart';
class MyPeripheralManager extends MyBluetoothLowEnergyManager class MyPeripheralManager2 extends MyPeripheralManager
implements PeripheralManager, MyPeripheralManagerFlutterApi { implements MyPeripheralManagerFlutterApi {
final MyPeripheralManagerHostApi _api; final MyPeripheralManagerHostApi _api;
BluetoothLowEnergyState _state;
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
_stateChangedController;
final StreamController<ReadGattCharacteristicCommandEventArgs> final StreamController<ReadGattCharacteristicCommandEventArgs>
_readCharacteristicCommandReceivedController; _readCharacteristicCommandReceivedController;
final StreamController<WriteGattCharacteristicCommandEventArgs> final StreamController<WriteGattCharacteristicCommandEventArgs>
@ -16,8 +18,10 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
final StreamController<NotifyGattCharacteristicCommandEventArgs> final StreamController<NotifyGattCharacteristicCommandEventArgs>
_notifyCharacteristicCommandReceivedController; _notifyCharacteristicCommandReceivedController;
MyPeripheralManager() MyPeripheralManager2()
: _api = MyPeripheralManagerHostApi(), : _api = MyPeripheralManagerHostApi(),
_state = BluetoothLowEnergyState.unknown,
_stateChangedController = StreamController.broadcast(),
_readCharacteristicCommandReceivedController = _readCharacteristicCommandReceivedController =
StreamController.broadcast(), StreamController.broadcast(),
_writeCharacteristicCommandReceivedController = _writeCharacteristicCommandReceivedController =
@ -26,20 +30,40 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
StreamController.broadcast(); StreamController.broadcast();
@override @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<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
_stateChangedController.stream;
@override
Stream<ReadGattCharacteristicCommandEventArgs> Stream<ReadGattCharacteristicCommandEventArgs>
get readCharacteristicCommandReceived => get readCharacteristicCommandReceived =>
_readCharacteristicCommandReceivedController.stream; _readCharacteristicCommandReceivedController.stream;
@override @override
Stream<WriteGattCharacteristicCommandEventArgs> Stream<WriteGattCharacteristicCommandEventArgs>
get writeCharacteristicCommandReceived => get writeCharacteristicCommandReceived =>
_writeCharacteristicCommandReceivedController.stream; _writeCharacteristicCommandReceivedController.stream;
@override @override
Stream<NotifyGattCharacteristicCommandEventArgs> Stream<NotifyGattCharacteristicCommandEventArgs>
get notifyCharacteristicCommandReceived => get notifyCharacteristicCommandReceived =>
_notifyCharacteristicCommandReceivedController.stream; _notifyCharacteristicCommandReceivedController.stream;
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) {
throw StateError(
'$state is expected, but current state is ${this.state}.');
}
}
@override @override
Future<void> setUp() async { Future<void> setUp() async {
final args = await _api.setUp(); final args = await _api.setUp();
@ -51,7 +75,7 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> addService(GattService service) async { Future<void> addService(GattService service) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
if (service is! MyGattService) { if (service is! MyGattService) {
throw TypeError(); throw TypeError();
} }
@ -61,33 +85,33 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> removeService(GattService service) async { Future<void> removeService(GattService service) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final serviceHashCodeArgs = service.hashCode; final serviceHashCodeArgs = service.hashCode;
await _api.removeService(serviceHashCodeArgs); await _api.removeService(serviceHashCodeArgs);
} }
@override @override
Future<void> clearServices() async { Future<void> clearServices() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.clearServices(); await _api.clearServices();
} }
@override @override
Future<void> startAdvertising(AdvertiseData advertiseData) async { Future<void> startAdvertising(Advertisement advertisement) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final advertiseDataArgs = advertiseData.toArgs(); final advertisementArgs = advertisement.toArgs();
await _api.startAdvertising(advertiseDataArgs); await _api.startAdvertising(advertisementArgs);
} }
@override @override
Future<void> stopAdvertising() async { Future<void> stopAdvertising() async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
await _api.stopAdvertising(); await _api.stopAdvertising();
} }
@override @override
Future<int> getMaximumWriteLength(Central central) async { Future<int> getMaximumWriteLength(Central central) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final maximumWriteLength = final maximumWriteLength =
await _api.getMaximumWriteLength(centralHashCodeArgs); await _api.getMaximumWriteLength(centralHashCodeArgs);
@ -96,14 +120,14 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> sendReadCharacteristicReply( Future<void> sendReadCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
Uint8List value, required Uint8List value,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final idArgs = id; final idArgs = id;
@ -122,13 +146,13 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> sendWriteCharacteristicReply( Future<void> sendWriteCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final idArgs = id; final idArgs = id;
@ -145,11 +169,11 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
@override @override
Future<void> notifyCharacteristicValueChanged( Future<void> notifyCharacteristicValueChanged(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
Uint8List value, required Uint8List value,
) async { }) async {
await throwWithoutState(BluetoothLowEnergyState.poweredOn); await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
final centralHashCodeArgs = central.hashCode; final centralHashCodeArgs = central.hashCode;
final characteristicHashCodeArgs = characteristic.hashCode; final characteristicHashCodeArgs = characteristic.hashCode;
final valueArgs = value; final valueArgs = value;

View File

@ -60,7 +60,7 @@ abstract class MyCentralManagerFlutterApi {
void onDiscovered( void onDiscovered(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
int rssiArgs, int rssiArgs,
MyAdvertiseDataArgs advertiseDataArgs, MyAdvertisementArgs advertisementArgs,
); );
void onPeripheralStateChanged( void onPeripheralStateChanged(
MyPeripheralArgs peripheralArgs, MyPeripheralArgs peripheralArgs,
@ -81,7 +81,7 @@ abstract class MyPeripheralManagerHostApi {
void removeService(int serviceHashCodeArgs); void removeService(int serviceHashCodeArgs);
void clearServices(); void clearServices();
@async @async
void startAdvertising(MyAdvertiseDataArgs advertiseDataArgs); void startAdvertising(MyAdvertisementArgs advertisementArgs);
void stopAdvertising(); void stopAdvertising();
int getMaximumWriteLength(int centralHashCodeArgs); int getMaximumWriteLength(int centralHashCodeArgs);
void sendReadCharacteristicReply( void sendReadCharacteristicReply(
@ -156,13 +156,13 @@ class MyPeripheralArgs {
MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs); MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs);
} }
class MyAdvertiseDataArgs { class MyAdvertisementArgs {
final String? nameArgs; final String? nameArgs;
final List<String?> serviceUUIDsArgs; final List<String?> serviceUUIDsArgs;
final Map<String?, Uint8List?> serviceDataArgs; final Map<String?, Uint8List?> serviceDataArgs;
final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs; final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs;
MyAdvertiseDataArgs( MyAdvertisementArgs(
this.nameArgs, this.nameArgs,
this.serviceUUIDsArgs, this.serviceUUIDsArgs,
this.serviceDataArgs, this.serviceDataArgs,

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_darwin name: bluetooth_low_energy_darwin
description: iOS and macOS implementation of the bluetooth_low_energy plugin. 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment: environment:
@ -10,13 +10,13 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_lints: ^3.0.0
pigeon: ^11.0.1 pigeon: ^12.0.1
flutter: flutter:
plugin: plugin:

View File

@ -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 ## 3.0.0
* Add `PeripheralManager` api. * Add `PeripheralManager` api.

View File

@ -8,22 +8,35 @@ import 'package:convert/convert.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
CentralManager get centralManager => CentralManager.instance;
PeripheralManager get peripheralManager => PeripheralManager.instance;
void main() { void main() {
runZonedGuarded(onStartUp, onCrashed); runZonedGuarded(onStartUp, onCrashed);
} }
void onStartUp() async { void onStartUp() async {
Logger.root.onRecord.listen(onLogRecord);
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();
await CentralManager.instance.setUp(); await centralManager.setUp();
await PeripheralManager.instance.setUp(); await peripheralManager.setUp();
runApp(const MyApp()); runApp(const MyApp());
} }
void onCrashed(Object error, StackTrace stackTrace) { void onCrashed(Object error, StackTrace stackTrace) {
Logger.root.shout('App crached.', error, stackTrace);
}
void onLogRecord(LogRecord record) {
log( log(
'$error', record.message,
error: error, time: record.time,
stackTrace: stackTrace, 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<HomeView> {
} }
} }
CentralManager get centralManager => CentralManager.instance;
class ScannerView extends StatefulWidget { class ScannerView extends StatefulWidget {
const ScannerView({super.key}); const ScannerView({super.key});
@ -237,7 +248,7 @@ class _ScannerViewState extends State<ScannerView> {
builder: (context, discoveredEventArgs, child) { builder: (context, discoveredEventArgs, child) {
// final items = discoveredEventArgs; // final items = discoveredEventArgs;
final items = discoveredEventArgs final items = discoveredEventArgs
.where((eventArgs) => eventArgs.advertiseData.name != null) .where((eventArgs) => eventArgs.advertisement.name != null)
.toList(); .toList();
return ListView.separated( return ListView.separated(
itemBuilder: (context, i) { itemBuilder: (context, i) {
@ -245,8 +256,8 @@ class _ScannerViewState extends State<ScannerView> {
final item = items[i]; final item = items[i];
final uuid = item.peripheral.uuid; final uuid = item.peripheral.uuid;
final rssi = item.rssi; final rssi = item.rssi;
final advertiseData = item.advertiseData; final advertisement = item.advertisement;
final name = advertiseData.name; final name = advertisement.name;
return ListTile( return ListTile(
onTap: () async { onTap: () async {
final discovering = this.discovering.value; final discovering = this.discovering.value;
@ -273,7 +284,7 @@ class _ScannerViewState extends State<ScannerView> {
clipBehavior: Clip.antiAlias, clipBehavior: Clip.antiAlias,
builder: (context) { builder: (context) {
final manufacturerSpecificData = final manufacturerSpecificData =
advertiseData.manufacturerSpecificData; advertisement.manufacturerSpecificData;
return ListView.separated( return ListView.separated(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
horizontal: 16.0, horizontal: 16.0,
@ -428,7 +439,7 @@ class _PeripheralViewState extends State<PeripheralView> {
}, },
); );
rssiTimer = Timer.periodic( rssiTimer = Timer.periodic(
const Duration(seconds: 1), const Duration(seconds: 5),
(timer) async { (timer) async {
final state = this.state.value; final state = this.state.value;
if (state) { if (state) {
@ -458,7 +469,7 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
PreferredSizeWidget buildAppBar(BuildContext context) { PreferredSizeWidget buildAppBar(BuildContext context) {
final title = eventArgs.advertiseData.name ?? '<EMPTY NAME>'; final title = eventArgs.advertisement.name ?? '';
return AppBar( return AppBar(
title: Text(title), title: Text(title),
actions: [ actions: [
@ -804,8 +815,6 @@ class _PeripheralViewState extends State<PeripheralView> {
} }
} }
PeripheralManager get peripheralManager => PeripheralManager.instance;
class AdvertiserView extends StatefulWidget { class AdvertiserView extends StatefulWidget {
const AdvertiserView({super.key}); const AdvertiserView({super.key});
@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget {
State<AdvertiserView> createState() => _AdvertiserViewState(); State<AdvertiserView> createState() => _AdvertiserViewState();
} }
class _AdvertiserViewState extends State<AdvertiserView> { class _AdvertiserViewState extends State<AdvertiserView>
with SingleTickerProviderStateMixin {
late final ValueNotifier<BluetoothLowEnergyState> state; late final ValueNotifier<BluetoothLowEnergyState> state;
late final ValueNotifier<bool> advertising; late final ValueNotifier<bool> advertising;
late final ValueNotifier<List<Log>> logs; late final ValueNotifier<List<Log>> logs;
@ -856,11 +866,11 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x01, 0x02, 0x03]); final value = Uint8List.fromList([0x01, 0x02, 0x03]);
await peripheralManager.sendReadCharacteristicReply( await peripheralManager.sendReadCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
value, value: value,
); );
}, },
); );
@ -884,10 +894,10 @@ class _AdvertiserViewState extends State<AdvertiserView> {
const status = true; const status = true;
await peripheralManager.sendWriteCharacteristicReply( await peripheralManager.sendWriteCharacteristicReply(
central, central,
characteristic, characteristic: characteristic,
id, id: id,
offset, offset: offset,
status, status: status,
); );
}, },
); );
@ -911,8 +921,8 @@ class _AdvertiserViewState extends State<AdvertiserView> {
final value = Uint8List.fromList([0x03, 0x02, 0x01]); final value = Uint8List.fromList([0x03, 0x02, 0x01]);
await peripheralManager.notifyCharacteristicValueChanged( await peripheralManager.notifyCharacteristicValueChanged(
central, central,
characteristic, characteristic: characteristic,
value, value: value,
); );
} }
}, },
@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State<AdvertiserView> {
], ],
); );
await peripheralManager.addService(service); await peripheralManager.addService(service);
final advertiseData = AdvertiseData( final advertisement = Advertisement(
name: 'flutter', name: 'flutter',
manufacturerSpecificData: ManufacturerSpecificData( manufacturerSpecificData: ManufacturerSpecificData(
id: 0x2e19, id: 0x2e19,
data: Uint8List.fromList([0x01, 0x02, 0x03]), data: Uint8List.fromList([0x01, 0x02, 0x03]),
), ),
); );
await peripheralManager.startAdvertising(advertiseData); await peripheralManager.startAdvertising(advertisement);
advertising.value = true; advertising.value = true;
} }

View File

@ -23,15 +23,15 @@ packages:
path: ".." path: ".."
relative: true relative: true
source: path source: path
version: "3.0.0" version: "4.0.0"
bluetooth_low_energy_platform_interface: bluetooth_low_energy_platform_interface:
dependency: "direct main" dependency: "direct main"
description: description:
name: bluetooth_low_energy_platform_interface name: bluetooth_low_energy_platform_interface
sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473" sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.0" version: "4.0.0"
bluez: bluez:
dependency: transitive dependency: transitive
description: description:
@ -134,10 +134,10 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.3" version: "3.0.0"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -165,10 +165,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev" url: "https://pub.dev"
source: hosted 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: matcher:
dependency: transitive dependency: transitive
description: description:

View File

@ -17,7 +17,7 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
bluetooth_low_energy_linux: bluetooth_low_energy_linux:
# When depending on this package from a real application you should use: # When depending on this package from a real application you should use:
# bluetooth_low_energy: ^x.y.z # 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 # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # 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 # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec

View File

@ -1,9 +1,9 @@
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart'; 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 { abstract class BluetoothLowEnergyLinux {
static void registerWith() { static void registerWith() {
BluetoothLowEnergy.instance = MyBluetoothLowEnergy(); MyCentralManager.instance = MyCentralManager2();
} }
} }

View File

@ -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();
}

View File

@ -27,7 +27,7 @@ extension BlueZDeviceX on BlueZDevice {
List<MyGattService2> get myServices => List<MyGattService2> get myServices =>
gattServices.map((service) => MyGattService2(service)).toList(); gattServices.map((service) => MyGattService2(service)).toList();
AdvertiseData get myAdvertiseData { Advertisement get myAdvertisement {
final myName = name.isNotEmpty ? name : null; final myName = name.isNotEmpty ? name : null;
final myServiceUUIDs = uuids.map((uuid) => uuid.toMyUUID()).toList(); final myServiceUUIDs = uuids.map((uuid) => uuid.toMyUUID()).toList();
final myServiceData = serviceData.map((uuid, data) { final myServiceData = serviceData.map((uuid, data) {
@ -35,7 +35,7 @@ extension BlueZDeviceX on BlueZDevice {
final myData = Uint8List.fromList(data); final myData = Uint8List.fromList(data);
return MapEntry(myUUID, myData); return MapEntry(myUUID, myData);
}); });
return AdvertiseData( return Advertisement(
name: myName, name: myName,
serviceUUIDs: myServiceUUIDs, serviceUUIDs: myServiceUUIDs,
serviceData: myServiceData, serviceData: myServiceData,

View File

@ -11,8 +11,8 @@ import 'my_gatt_descriptor2.dart';
import 'my_gatt_service2.dart'; import 'my_gatt_service2.dart';
import 'my_peripheral2.dart'; import 'my_peripheral2.dart';
class MyCentralManager extends CentralManager { class MyCentralManager2 extends MyCentralManager {
MyCentralManager() MyCentralManager2()
: _client = BlueZClient(), : _client = BlueZClient(),
_stateChangedController = StreamController.broadcast(), _stateChangedController = StreamController.broadcast(),
_discoveredController = StreamController.broadcast(), _discoveredController = StreamController.broadcast(),
@ -60,9 +60,8 @@ class MyCentralManager extends CentralManager {
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async { Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
if (this.state != state) { if (this.state != state) {
throw BluetoothLowEnergyError( throw StateError(
'$state is expected, but current state is ${this.state}.', '$state is expected, but current state is ${this.state}.');
);
} }
} }
@ -137,7 +136,7 @@ class MyCentralManager extends CentralManager {
final myPeripheral = peripheral as MyPeripheral2; final myPeripheral = peripheral as MyPeripheral2;
final device = myPeripheral.device; final device = myPeripheral.device;
if (!device.connected) { if (!device.connected) {
throw BluetoothLowEnergyError('Peripheral is disconnected.'); throw StateError('Peripheral is disconnected.');
} }
if (!device.servicesResolved) { if (!device.servicesResolved) {
await _servicesResolved.firstWhere( await _servicesResolved.firstWhere(
@ -241,7 +240,7 @@ class MyCentralManager extends CentralManager {
void _onDiscovered(BlueZDevice device) { void _onDiscovered(BlueZDevice device) {
final myPeripheral = MyPeripheral2(device); final myPeripheral = MyPeripheral2(device);
final myRSSI = device.rssi; final myRSSI = device.rssi;
final myAdvertiseData = device.myAdvertiseData; final myAdvertiseData = device.myAdvertisement;
final eventArgs = DiscoveredEventArgs( final eventArgs = DiscoveredEventArgs(
myPeripheral, myPeripheral,
myRSSI, myRSSI,

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_linux name: bluetooth_low_energy_linux
description: Linux implementation of the bluetooth_low_energy plugin. 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment: environment:
@ -10,13 +10,13 @@ environment:
dependencies: dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
bluetooth_low_energy_platform_interface: ^3.0.0 bluetooth_low_energy_platform_interface: ^4.0.0
bluez: ^0.8.1 bluez: ^0.8.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_lints: ^3.0.0
flutter: flutter:
plugin: plugin:

View File

@ -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 ## 3.0.0
* Add `PeripheralManager` api. * Add `PeripheralManager` api.

View File

@ -8,11 +8,13 @@ same interface.
# Usage # Usage
To implement a new platform-specific implementation of `bluetooth_low_energy`, extend To implement a new platform-specific implementation of `bluetooth_low_energy`,
[`CentralController`][2] with an implementation that performs the extend [`MyCentralManager`][2] with an implementation that performs the
platform-specific behavior, and when you register your plugin, set the default platform-specific behavior, and when you register your plugin, set the default
`CentralController` by calling `MyCentralManager` by calling `MyCentralManager.instance = MyCentralManagerImpl()`,
`CentralController.instance = MyCentralController()`. 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 # 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. on why a less-clean interface is preferable to a breaking change.
[1]: https://pub.dev/packages/bluetooth_low_energy [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

View File

@ -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/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/bluetooth_low_energy_state.dart';
export 'src/central_manager.dart'; export 'src/bluetooth_low_energy_event_args.dart';
export 'src/peripheral_manager.dart'; export 'src/bluetooth_low_energy_manager.dart';
export 'src/bluetooth_low_energy_peer.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/central.dart';
export 'src/peripheral_manager_event_args.dart';
export 'src/peripheral_manager.dart';
export 'src/peripheral.dart'; export 'src/peripheral.dart';
export 'src/uuid.dart'; export 'src/uuid.dart';
export 'src/advertise_data.dart'; export 'src/advertisement.dart';
export 'src/manufacturer_specific_data.dart'; export 'src/manufacturer_specific_data.dart';
export 'src/gatt_service.dart'; export 'src/gatt_service.dart';
export 'src/gatt_characteristic.dart'; export 'src/gatt_characteristic.dart';
export 'src/gatt_characteristic_property.dart'; export 'src/gatt_characteristic_property.dart';
export 'src/gatt_characteristic_write_type.dart'; export 'src/gatt_characteristic_write_type.dart';
export 'src/gatt_descriptor.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_object.dart';
export 'src/my_central.dart';
export 'src/my_peripheral.dart'; export 'src/my_peripheral.dart';
export 'src/my_gatt_service.dart'; export 'src/my_gatt_service.dart';
export 'src/my_gatt_characteristic.dart'; export 'src/my_gatt_characteristic.dart';
export 'src/my_gatt_descriptor.dart'; export 'src/my_gatt_descriptor.dart';
export 'src/my_central.dart';

View File

@ -3,8 +3,8 @@ import 'dart:typed_data';
import 'manufacturer_specific_data.dart'; import 'manufacturer_specific_data.dart';
import 'uuid.dart'; import 'uuid.dart';
/// The advertise data discovered from a peripheral. /// The advertisement of the peripheral.
class AdvertiseData { class Advertisement {
/// The name of the peripheral. /// The name of the peripheral.
final String? name; final String? name;
@ -17,8 +17,8 @@ class AdvertiseData {
/// The manufacturer specific data of the peripheral. /// The manufacturer specific data of the peripheral.
final ManufacturerSpecificData? manufacturerSpecificData; final ManufacturerSpecificData? manufacturerSpecificData;
/// Constructs an [AdvertiseData]. /// Constructs an [Advertisement].
AdvertiseData({ Advertisement({
this.name, this.name,
this.serviceUUIDs = const [], this.serviceUUIDs = const [],
this.serviceData = const {}, this.serviceData = const {},

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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 'bluetooth_low_energy_state.dart';
import 'event_args.dart';
/// The abstract base class that manages central and peripheral objects. /// The abstract base class that manages central and peripheral objects.
abstract class BluetoothLowEnergyManager { abstract class BluetoothLowEnergyManager implements LogController {
/// The current state of the manager. /// The current state of the manager.
BluetoothLowEnergyState get state; BluetoothLowEnergyState get state;
/// Tells the managers state updated. /// Tells the managers state updated.
Stream<BluetoothLowEnergyStateChangedEventArgs> get stateChanged; Stream<BluetoothLowEnergyStateChangedEventArgs> get stateChanged;
/// Sets up this bluetooth low energy manager. /// Sets up the manager.
Future<void> setUp(); Future<void> setUp();
} }

View File

@ -1,19 +1,18 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'bluetooth_low_energy.dart';
import 'bluetooth_low_energy_manager.dart'; import 'bluetooth_low_energy_manager.dart';
import 'event_args.dart'; import 'central_manager_event_args.dart';
import 'gatt_characteristic.dart'; import 'gatt_characteristic.dart';
import 'gatt_characteristic_write_type.dart'; import 'gatt_characteristic_write_type.dart';
import 'gatt_descriptor.dart'; import 'gatt_descriptor.dart';
import 'gatt_service.dart'; import 'gatt_service.dart';
import 'my_central_manager.dart';
import 'peripheral.dart'; import 'peripheral.dart';
/// An object that scans for, discovers, connects to, and manages peripherals. /// An object that scans for, discovers, connects to, and manages peripherals.
abstract class CentralManager extends BluetoothLowEnergyManager { abstract class CentralManager extends BluetoothLowEnergyManager {
/// Gets the instance of [CentralManager]. /// The instance of [CentralManager] to use.
static CentralManager get instance => static CentralManager get instance => MyCentralManager.instance;
BluetoothLowEnergy.instance.centralManager;
/// Tells the central manager discovered a peripheral while scanning for devices. /// Tells the central manager discovered a peripheral while scanning for devices.
Stream<DiscoveredEventArgs> get discovered; Stream<DiscoveredEventArgs> get discovered;

View File

@ -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);
}

View File

@ -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';
}
}

View File

@ -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. /// The base event arguments.
abstract class EventArgs {} 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,
);
}

View File

@ -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');
}

View File

@ -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');
}

View File

@ -1,18 +1,17 @@
import 'dart:typed_data'; import 'dart:typed_data';
import 'advertise_data.dart'; import 'advertisement.dart';
import 'bluetooth_low_energy.dart';
import 'bluetooth_low_energy_manager.dart'; import 'bluetooth_low_energy_manager.dart';
import 'central.dart'; import 'central.dart';
import 'event_args.dart';
import 'gatt_characteristic.dart'; import 'gatt_characteristic.dart';
import 'gatt_service.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. /// An object that manages and advertises peripheral services exposed by this app.
abstract class PeripheralManager extends BluetoothLowEnergyManager { abstract class PeripheralManager extends BluetoothLowEnergyManager {
/// Gets the instance of [PeripheralManager]. /// The instance of [PeripheralManger] to use.
static PeripheralManager get instance => static PeripheralManager get instance => MyPeripheralManager.instance;
BluetoothLowEnergy.instance.peripheralManager;
/// Tells that the local peripheral received an Attribute Protocol (ATT) read request for a characteristic with a dynamic value. /// Tells that the local peripheral received an Attribute Protocol (ATT) read request for a characteristic with a dynamic value.
Stream<ReadGattCharacteristicCommandEventArgs> Stream<ReadGattCharacteristicCommandEventArgs>
@ -36,7 +35,7 @@ abstract class PeripheralManager extends BluetoothLowEnergyManager {
Future<void> clearServices(); Future<void> clearServices();
/// Advertises peripheral manager data. /// Advertises peripheral manager data.
Future<void> startAdvertising(AdvertiseData advertiseData); Future<void> startAdvertising(Advertisement advertisement);
/// Stops advertising peripheral manager data. /// Stops advertising peripheral manager data.
Future<void> stopAdvertising(); Future<void> stopAdvertising();
@ -47,27 +46,27 @@ abstract class PeripheralManager extends BluetoothLowEnergyManager {
/// Responds to a read request from a connected central. /// Responds to a read request from a connected central.
Future<void> sendReadCharacteristicReply( Future<void> sendReadCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
Uint8List value, required Uint8List value,
); });
/// Responds to a write request from a connected central. /// Responds to a write request from a connected central.
Future<void> sendWriteCharacteristicReply( Future<void> sendWriteCharacteristicReply(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
int id, required int id,
int offset, required int offset,
bool status, required bool status,
); });
/// Send an updated characteristic value to one or more subscribed centrals, using a notification or indication. /// Send an updated characteristic value to one or more subscribed centrals, using a notification or indication.
Future<void> notifyCharacteristicValueChanged( Future<void> notifyCharacteristicValueChanged(
Central central, Central central, {
GattCharacteristic characteristic, required GattCharacteristic characteristic,
Uint8List value, required Uint8List value,
); });
} }

View File

@ -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,
);
}

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_platform_interface name: bluetooth_low_energy_platform_interface
description: A common platform interface for the bluetooth_low_energy plugin. 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 homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment: environment:
@ -11,8 +11,9 @@ dependencies:
flutter: flutter:
sdk: flutter sdk: flutter
plugin_platform_interface: ^2.0.2 plugin_platform_interface: ^2.0.2
log_service: ^1.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_lints: ^3.0.0