4.0.0 (#24)
* 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:
@ -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)
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
@ -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.", "")));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
@ -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}.',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
||||||
}
|
}
|
@ -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;
|
@ -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,
|
||||||
|
@ -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:
|
||||||
|
@ -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.
|
||||||
|
@ -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()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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() {
|
||||||
|
@ -26,4 +26,4 @@ SPEC CHECKSUMS:
|
|||||||
|
|
||||||
PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
|
PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
|
||||||
|
|
||||||
COCOAPODS: 1.11.3
|
COCOAPODS: 1.12.1
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,4 +20,4 @@ SPEC CHECKSUMS:
|
|||||||
|
|
||||||
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
|
PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367
|
||||||
|
|
||||||
COCOAPODS: 1.11.3
|
COCOAPODS: 1.12.1
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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()));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
@ -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}.',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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);
|
||||||
}
|
}
|
@ -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;
|
@ -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,
|
||||||
|
@ -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:
|
||||||
|
@ -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.
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
|
||||||
}
|
|
@ -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,
|
||||||
|
@ -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,
|
@ -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:
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
|
@ -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';
|
|
||||||
|
@ -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 {},
|
@ -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;
|
|
||||||
}
|
|
@ -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);
|
||||||
|
}
|
@ -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 manager’s state updated.
|
/// Tells the manager’s 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();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
}
|
@ -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';
|
|
||||||
}
|
|
||||||
}
|
|
@ -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,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
@ -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');
|
||||||
|
}
|
@ -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');
|
||||||
|
}
|
@ -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,
|
||||||
);
|
});
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
);
|
||||||
|
}
|
@ -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
|
||||||
|
Reference in New Issue
Block a user