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,32 @@
|
||||
## 4.0.0
|
||||
|
||||
* Remove `BluetoothLowEnergy` class.
|
||||
* Update `CentralManger` to extends `PlatformInterface`.
|
||||
* Update `PeripheralManager` to extends `PlatformInterface`.
|
||||
* Change some `PeripheralManager` methods' arguments to required optional arguments.
|
||||
* Move `AdvertiseData` class to `Advertisement` class.
|
||||
* Remove `BluetoothLowEnergyError` class.
|
||||
* Add `MyCentralManager` and `MyPeripheralManager` abstract classes.
|
||||
* Add `LogController` interface to `BluetoothLowEnergyManager`.
|
||||
* Fix issues.
|
||||
|
||||
## 4.0.0-dev.3
|
||||
|
||||
* Optimize project structure.
|
||||
|
||||
## 4.0.0-dev.2
|
||||
|
||||
* Optimize the import method of the `example`.
|
||||
|
||||
## 4.0.0-dev.1
|
||||
|
||||
* Remove `BluetoothLowEnergy` class.
|
||||
* Update `CentralManger` to extends `PlatformInterface`.
|
||||
* Update `PeripheralManager` to extends `PlatformInterface`.
|
||||
* Move `AdvertiseData` class to `Advertisement` class.
|
||||
* Remove `logging` dependency.
|
||||
* Update `example`.
|
||||
|
||||
## 3.0.4
|
||||
|
||||
* Fix the issue [android device: requestMtu issue #22](https://github.com/yanshouwang/bluetooth_low_energy/issues/22)
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Autogenerated from Pigeon (v11.0.1), do not edit directly.
|
||||
// Autogenerated from Pigeon (v12.0.1), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
package dev.yanshouwang.bluetooth_low_energy_android
|
||||
@ -165,7 +165,7 @@ data class MyPeripheralArgs (
|
||||
}
|
||||
|
||||
/** Generated class from Pigeon that represents data sent in messages. */
|
||||
data class MyAdvertiseDataArgs (
|
||||
data class MyAdvertisementArgs (
|
||||
val nameArgs: String? = null,
|
||||
val serviceUUIDsArgs: List<String?>,
|
||||
val serviceDataArgs: Map<String?, ByteArray?>,
|
||||
@ -174,14 +174,14 @@ data class MyAdvertiseDataArgs (
|
||||
) {
|
||||
companion object {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun fromList(list: List<Any?>): MyAdvertiseDataArgs {
|
||||
fun fromList(list: List<Any?>): MyAdvertisementArgs {
|
||||
val nameArgs = list[0] as String?
|
||||
val serviceUUIDsArgs = list[1] as List<String?>
|
||||
val serviceDataArgs = list[2] as Map<String?, ByteArray?>
|
||||
val manufacturerSpecificDataArgs: MyManufacturerSpecificDataArgs? = (list[3] as List<Any?>?)?.let {
|
||||
MyManufacturerSpecificDataArgs.fromList(it)
|
||||
}
|
||||
return MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
|
||||
return MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
|
||||
}
|
||||
}
|
||||
fun toList(): List<Any?> {
|
||||
@ -654,7 +654,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() {
|
||||
return when (type) {
|
||||
128.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyAdvertiseDataArgs.fromList(it)
|
||||
MyAdvertisementArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
129.toByte() -> {
|
||||
@ -682,7 +682,7 @@ private object MyCentralManagerFlutterApiCodec : StandardMessageCodec() {
|
||||
}
|
||||
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
|
||||
when (value) {
|
||||
is MyAdvertiseDataArgs -> {
|
||||
is MyAdvertisementArgs -> {
|
||||
stream.write(128)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
@ -716,28 +716,60 @@ class MyCentralManagerFlutterApi(private val binaryMessenger: BinaryMessenger) {
|
||||
MyCentralManagerFlutterApiCodec
|
||||
}
|
||||
}
|
||||
fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) {
|
||||
fun onStateChanged(stateNumberArgsArg: Long, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged", codec)
|
||||
channel.send(listOf(stateNumberArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onDiscovered(peripheralArgsArg: MyPeripheralArgs, rssiArgsArg: Long, advertiseDataArgsArg: MyAdvertiseDataArgs, callback: () -> Unit) {
|
||||
fun onDiscovered(peripheralArgsArg: MyPeripheralArgs, rssiArgsArg: Long, advertisementArgsArg: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered", codec)
|
||||
channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertiseDataArgsArg)) {
|
||||
callback()
|
||||
channel.send(listOf(peripheralArgsArg, rssiArgsArg, advertisementArgsArg)) {
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: () -> Unit) {
|
||||
fun onPeripheralStateChanged(peripheralArgsArg: MyPeripheralArgs, stateArgsArg: Boolean, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged", codec)
|
||||
channel.send(listOf(peripheralArgsArg, stateArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onCharacteristicValueChanged(characteristicArgsArg: MyGattCharacteristicArgs, valueArgsArg: ByteArray, callback: () -> Unit) {
|
||||
fun onCharacteristicValueChanged(characteristicArgsArg: MyGattCharacteristicArgs, valueArgsArg: ByteArray, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged", codec)
|
||||
channel.send(listOf(characteristicArgsArg, valueArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -747,7 +779,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() {
|
||||
return when (type) {
|
||||
128.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
MyAdvertiseDataArgs.fromList(it)
|
||||
MyAdvertisementArgs.fromList(it)
|
||||
}
|
||||
}
|
||||
129.toByte() -> {
|
||||
@ -780,7 +812,7 @@ private object MyPeripheralManagerHostApiCodec : StandardMessageCodec() {
|
||||
}
|
||||
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
|
||||
when (value) {
|
||||
is MyAdvertiseDataArgs -> {
|
||||
is MyAdvertisementArgs -> {
|
||||
stream.write(128)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
@ -815,7 +847,7 @@ interface MyPeripheralManagerHostApi {
|
||||
fun addService(serviceArgs: MyGattServiceArgs, callback: (Result<Unit>) -> Unit)
|
||||
fun removeService(serviceHashCodeArgs: Long)
|
||||
fun clearServices()
|
||||
fun startAdvertising(advertiseDataArgs: MyAdvertiseDataArgs, callback: (Result<Unit>) -> Unit)
|
||||
fun startAdvertising(advertisementArgs: MyAdvertisementArgs, callback: (Result<Unit>) -> Unit)
|
||||
fun stopAdvertising()
|
||||
fun getMaximumWriteLength(centralHashCodeArgs: Long): Long
|
||||
fun sendReadCharacteristicReply(centralHashCodeArgs: Long, characteristicHashCodeArgs: Long, idArgs: Long, offsetArgs: Long, statusArgs: Boolean, valueArgs: ByteArray)
|
||||
@ -908,8 +940,8 @@ interface MyPeripheralManagerHostApi {
|
||||
if (api != null) {
|
||||
channel.setMessageHandler { message, reply ->
|
||||
val args = message as List<Any?>
|
||||
val advertiseDataArgsArg = args[0] as MyAdvertiseDataArgs
|
||||
api.startAdvertising(advertiseDataArgsArg) { result: Result<Unit> ->
|
||||
val advertisementArgsArg = args[0] as MyAdvertisementArgs
|
||||
api.startAdvertising(advertisementArgsArg) { result: Result<Unit> ->
|
||||
val error = result.exceptionOrNull()
|
||||
if (error != null) {
|
||||
reply.reply(wrapError(error))
|
||||
@ -1078,28 +1110,60 @@ class MyPeripheralManagerFlutterApi(private val binaryMessenger: BinaryMessenger
|
||||
MyPeripheralManagerFlutterApiCodec
|
||||
}
|
||||
}
|
||||
fun onStateChanged(stateNumberArgsArg: Long, callback: () -> Unit) {
|
||||
fun onStateChanged(stateNumberArgsArg: Long, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged", codec)
|
||||
channel.send(listOf(stateNumberArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onReadCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, callback: () -> Unit) {
|
||||
fun onReadCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived", codec)
|
||||
channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onWriteCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, valueArgsArg: ByteArray, callback: () -> Unit) {
|
||||
fun onWriteCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, idArgsArg: Long, offsetArgsArg: Long, valueArgsArg: ByteArray, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived", codec)
|
||||
channel.send(listOf(centralArgsArg, characteristicArgsArg, idArgsArg, offsetArgsArg, valueArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
fun onNotifyCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, stateArgsArg: Boolean, callback: () -> Unit) {
|
||||
fun onNotifyCharacteristicCommandReceived(centralArgsArg: MyCentralArgs, characteristicArgsArg: MyGattCharacteristicArgs, stateArgsArg: Boolean, callback: (Result<Unit>) -> Unit) {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived", codec)
|
||||
channel.send(listOf(centralArgsArg, characteristicArgsArg, stateArgsArg)) {
|
||||
callback()
|
||||
if (it is List<*>) {
|
||||
if (it.size > 1) {
|
||||
callback(Result.failure(FlutterError(it[0] as String, it[1] as String, it[2] as String?)));
|
||||
} else {
|
||||
callback(Result.success(Unit));
|
||||
}
|
||||
} else {
|
||||
callback(Result.failure(FlutterError("channel-error", "Unable to establish connection on channel.", "")));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ val BluetoothDevice.uuid: UUID
|
||||
return UUID.fromString("00000000-0000-0000-0000-$node")
|
||||
}
|
||||
|
||||
val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs
|
||||
val ScanResult.advertisementArgs: MyAdvertisementArgs
|
||||
get() {
|
||||
val record = scanRecord
|
||||
return if (record == null) {
|
||||
@ -51,7 +51,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs
|
||||
val serviceUUIDsArgs = emptyList<String?>()
|
||||
val serviceDataArgs = emptyMap<String?, ByteArray>()
|
||||
val manufacturerSpecificDataArgs = null
|
||||
MyAdvertiseDataArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
|
||||
MyAdvertisementArgs(nameArgs, serviceUUIDsArgs, serviceDataArgs, manufacturerSpecificDataArgs)
|
||||
} else {
|
||||
val nameArgs = record.deviceName
|
||||
val serviceUUIDsArgs = record.serviceUuids?.map { uuid -> uuid.toString() }
|
||||
@ -62,7 +62,7 @@ val ScanResult.advertiseDataArgs: MyAdvertiseDataArgs
|
||||
}.toTypedArray()
|
||||
val serviceDataArgs = mapOf<String?, ByteArray?>(*pairs)
|
||||
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()
|
||||
}
|
||||
|
||||
fun MyAdvertiseDataArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData {
|
||||
fun MyAdvertisementArgs.toAdvertiseData(adapter: BluetoothAdapter): AdvertiseData {
|
||||
val advertiseDataBuilder = AdvertiseData.Builder()
|
||||
if (nameArgs == null) {
|
||||
advertiseDataBuilder.setIncludeDeviceName(false)
|
||||
|
@ -417,8 +417,8 @@ class MyCentralManager(private val context: Context, binaryMessenger: BinaryMess
|
||||
this.devices[hashCodeArgs] = device
|
||||
this.peripheralsArgs[hashCode] = peripheralArgs
|
||||
val rssiArgs = result.rssi.toLong()
|
||||
val advertiseDataArgs = result.advertiseDataArgs
|
||||
api.onDiscovered(peripheralArgs, rssiArgs, advertiseDataArgs) {}
|
||||
val advertisementArgs = result.advertisementArgs
|
||||
api.onDiscovered(peripheralArgs, rssiArgs, advertisementArgs) {}
|
||||
}
|
||||
|
||||
fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
|
||||
|
@ -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 {
|
||||
if (startAdvertisingCallback != null) {
|
||||
throw IllegalStateException()
|
||||
}
|
||||
val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).build()
|
||||
val advertiseData = advertiseDataArgs.toAdvertiseData(adapter)
|
||||
val advertiseData = advertisementArgs.toAdvertiseData(adapter)
|
||||
advertiser.startAdvertising(settings, advertiseData, advertiseCallback)
|
||||
startAdvertisingCallback = callback
|
||||
} catch (e: Throwable) {
|
||||
|
@ -8,22 +8,35 @@ import 'package:convert/convert.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
CentralManager get centralManager => CentralManager.instance;
|
||||
PeripheralManager get peripheralManager => PeripheralManager.instance;
|
||||
|
||||
void main() {
|
||||
runZonedGuarded(onStartUp, onCrashed);
|
||||
}
|
||||
|
||||
void onStartUp() async {
|
||||
Logger.root.onRecord.listen(onLogRecord);
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
await CentralManager.instance.setUp();
|
||||
await PeripheralManager.instance.setUp();
|
||||
await centralManager.setUp();
|
||||
await peripheralManager.setUp();
|
||||
runApp(const MyApp());
|
||||
}
|
||||
|
||||
void onCrashed(Object error, StackTrace stackTrace) {
|
||||
Logger.root.shout('App crached.', error, stackTrace);
|
||||
}
|
||||
|
||||
void onLogRecord(LogRecord record) {
|
||||
log(
|
||||
'$error',
|
||||
error: error,
|
||||
stackTrace: stackTrace,
|
||||
record.message,
|
||||
time: record.time,
|
||||
sequenceNumber: record.sequenceNumber,
|
||||
level: record.level.value,
|
||||
name: record.loggerName,
|
||||
zone: record.zone,
|
||||
error: record.error,
|
||||
stackTrace: record.stackTrace,
|
||||
);
|
||||
}
|
||||
|
||||
@ -138,8 +151,6 @@ class _HomeViewState extends State<HomeView> {
|
||||
}
|
||||
}
|
||||
|
||||
CentralManager get centralManager => CentralManager.instance;
|
||||
|
||||
class ScannerView extends StatefulWidget {
|
||||
const ScannerView({super.key});
|
||||
|
||||
@ -237,7 +248,7 @@ class _ScannerViewState extends State<ScannerView> {
|
||||
builder: (context, discoveredEventArgs, child) {
|
||||
// final items = discoveredEventArgs;
|
||||
final items = discoveredEventArgs
|
||||
.where((eventArgs) => eventArgs.advertiseData.name != null)
|
||||
.where((eventArgs) => eventArgs.advertisement.name != null)
|
||||
.toList();
|
||||
return ListView.separated(
|
||||
itemBuilder: (context, i) {
|
||||
@ -245,8 +256,8 @@ class _ScannerViewState extends State<ScannerView> {
|
||||
final item = items[i];
|
||||
final uuid = item.peripheral.uuid;
|
||||
final rssi = item.rssi;
|
||||
final advertiseData = item.advertiseData;
|
||||
final name = advertiseData.name;
|
||||
final advertisement = item.advertisement;
|
||||
final name = advertisement.name;
|
||||
return ListTile(
|
||||
onTap: () async {
|
||||
final discovering = this.discovering.value;
|
||||
@ -273,7 +284,7 @@ class _ScannerViewState extends State<ScannerView> {
|
||||
clipBehavior: Clip.antiAlias,
|
||||
builder: (context) {
|
||||
final manufacturerSpecificData =
|
||||
advertiseData.manufacturerSpecificData;
|
||||
advertisement.manufacturerSpecificData;
|
||||
return ListView.separated(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 16.0,
|
||||
@ -428,7 +439,7 @@ class _PeripheralViewState extends State<PeripheralView> {
|
||||
},
|
||||
);
|
||||
rssiTimer = Timer.periodic(
|
||||
const Duration(seconds: 1),
|
||||
const Duration(seconds: 5),
|
||||
(timer) async {
|
||||
final state = this.state.value;
|
||||
if (state) {
|
||||
@ -458,7 +469,7 @@ class _PeripheralViewState extends State<PeripheralView> {
|
||||
}
|
||||
|
||||
PreferredSizeWidget buildAppBar(BuildContext context) {
|
||||
final title = eventArgs.advertiseData.name ?? '<EMPTY NAME>';
|
||||
final title = eventArgs.advertisement.name ?? '';
|
||||
return AppBar(
|
||||
title: Text(title),
|
||||
actions: [
|
||||
@ -804,8 +815,6 @@ class _PeripheralViewState extends State<PeripheralView> {
|
||||
}
|
||||
}
|
||||
|
||||
PeripheralManager get peripheralManager => PeripheralManager.instance;
|
||||
|
||||
class AdvertiserView extends StatefulWidget {
|
||||
const AdvertiserView({super.key});
|
||||
|
||||
@ -813,7 +822,8 @@ class AdvertiserView extends StatefulWidget {
|
||||
State<AdvertiserView> createState() => _AdvertiserViewState();
|
||||
}
|
||||
|
||||
class _AdvertiserViewState extends State<AdvertiserView> {
|
||||
class _AdvertiserViewState extends State<AdvertiserView>
|
||||
with SingleTickerProviderStateMixin {
|
||||
late final ValueNotifier<BluetoothLowEnergyState> state;
|
||||
late final ValueNotifier<bool> advertising;
|
||||
late final ValueNotifier<List<Log>> logs;
|
||||
@ -856,11 +866,11 @@ class _AdvertiserViewState extends State<AdvertiserView> {
|
||||
final value = Uint8List.fromList([0x01, 0x02, 0x03]);
|
||||
await peripheralManager.sendReadCharacteristicReply(
|
||||
central,
|
||||
characteristic,
|
||||
id,
|
||||
offset,
|
||||
status,
|
||||
value,
|
||||
characteristic: characteristic,
|
||||
id: id,
|
||||
offset: offset,
|
||||
status: status,
|
||||
value: value,
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -884,10 +894,10 @@ class _AdvertiserViewState extends State<AdvertiserView> {
|
||||
const status = true;
|
||||
await peripheralManager.sendWriteCharacteristicReply(
|
||||
central,
|
||||
characteristic,
|
||||
id,
|
||||
offset,
|
||||
status,
|
||||
characteristic: characteristic,
|
||||
id: id,
|
||||
offset: offset,
|
||||
status: status,
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -911,8 +921,8 @@ class _AdvertiserViewState extends State<AdvertiserView> {
|
||||
final value = Uint8List.fromList([0x03, 0x02, 0x01]);
|
||||
await peripheralManager.notifyCharacteristicValueChanged(
|
||||
central,
|
||||
characteristic,
|
||||
value,
|
||||
characteristic: characteristic,
|
||||
value: value,
|
||||
);
|
||||
}
|
||||
},
|
||||
@ -991,14 +1001,14 @@ class _AdvertiserViewState extends State<AdvertiserView> {
|
||||
],
|
||||
);
|
||||
await peripheralManager.addService(service);
|
||||
final advertiseData = AdvertiseData(
|
||||
final advertisement = Advertisement(
|
||||
name: 'flutter',
|
||||
manufacturerSpecificData: ManufacturerSpecificData(
|
||||
id: 0x2e19,
|
||||
data: Uint8List.fromList([0x01, 0x02, 0x03]),
|
||||
),
|
||||
);
|
||||
await peripheralManager.startAdvertising(advertiseData);
|
||||
await peripheralManager.startAdvertising(advertisement);
|
||||
advertising.value = true;
|
||||
}
|
||||
|
||||
|
@ -15,15 +15,15 @@ packages:
|
||||
path: ".."
|
||||
relative: true
|
||||
source: path
|
||||
version: "3.0.4"
|
||||
version: "4.0.0"
|
||||
bluetooth_low_energy_platform_interface:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: bluetooth_low_energy_platform_interface
|
||||
sha256: "200e686247808591b6d3e355642ba296f0f651466c72efdd701be34116971473"
|
||||
sha256: a01819f4ef89d033edaa979465ec8c3af13b2618dc718d90fe681be91b6c4356
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "4.0.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
@ -102,10 +102,10 @@ packages:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
|
||||
sha256: ad76540d21c066228ee3f9d1dad64a9f7e46530e8bb7c85011a88bc1fd874bc5
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.3"
|
||||
version: "3.0.0"
|
||||
flutter_test:
|
||||
dependency: "direct dev"
|
||||
description: flutter
|
||||
@ -133,10 +133,18 @@ packages:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: lints
|
||||
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
|
||||
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
version: "3.0.0"
|
||||
log_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: log_service
|
||||
sha256: "21124936899e227d1779268077921d46d57456e2592d1562e455be273594e2e4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.0"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -17,7 +17,7 @@ dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
|
||||
bluetooth_low_energy_platform_interface: ^3.0.0
|
||||
bluetooth_low_energy_platform_interface: ^4.0.0
|
||||
bluetooth_low_energy_android:
|
||||
# When depending on this package from a real application you should use:
|
||||
# bluetooth_low_energy: ^x.y.z
|
||||
@ -43,7 +43,7 @@ dev_dependencies:
|
||||
# activated in the `analysis_options.yaml` file located at the root of your
|
||||
# package. See that file for information about deactivating specific lint
|
||||
# rules and activating additional ones.
|
||||
flutter_lints: ^2.0.0
|
||||
flutter_lints: ^3.0.0
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
@ -1,9 +1,11 @@
|
||||
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
|
||||
|
||||
import 'src/my_bluetooth_low_energy.dart';
|
||||
import 'src/my_central_manager2.dart';
|
||||
import 'src/my_peripheral_manager2.dart';
|
||||
|
||||
abstract class BluetoothLowEnergyAndroid {
|
||||
static void registerWith() {
|
||||
BluetoothLowEnergy.instance = MyBluetoothLowEnergy();
|
||||
MyCentralManager.instance = MyCentralManager2();
|
||||
MyPeripheralManager.instance = MyPeripheralManager2();
|
||||
}
|
||||
}
|
||||
|
@ -15,8 +15,8 @@ extension MyBluetoothLowEnergyStateArgsX on MyBluetoothLowEnergyStateArgs {
|
||||
}
|
||||
}
|
||||
|
||||
extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs {
|
||||
AdvertiseData toAdvertiseData() {
|
||||
extension MyAdvertisementArgsX on MyAdvertisementArgs {
|
||||
Advertisement toAdvertisement() {
|
||||
final name = nameArgs;
|
||||
final serviceUUIDs = serviceUUIDsArgs
|
||||
.cast<String>()
|
||||
@ -31,7 +31,7 @@ extension MyAdvertiseDataArgsX on MyAdvertiseDataArgs {
|
||||
);
|
||||
final manufacturerSpecificData =
|
||||
manufacturerSpecificDataArgs?.toManufacturerSpecificData();
|
||||
return AdvertiseData(
|
||||
return Advertisement(
|
||||
name: name,
|
||||
serviceUUIDs: serviceUUIDs,
|
||||
serviceData: serviceData,
|
||||
@ -136,8 +136,8 @@ extension MyCentralArgsX on MyCentralArgs {
|
||||
}
|
||||
}
|
||||
|
||||
extension AdvertiseDataX on AdvertiseData {
|
||||
MyAdvertiseDataArgs toArgs() {
|
||||
extension AdvertisementX on Advertisement {
|
||||
MyAdvertisementArgs toArgs() {
|
||||
final nameArgs = name;
|
||||
final serviceUUIDsArgs =
|
||||
serviceUUIDs.map((uuid) => uuid.toString()).toList();
|
||||
@ -147,7 +147,7 @@ extension AdvertiseDataX on AdvertiseData {
|
||||
return MapEntry(uuidArgs, dataArgs);
|
||||
});
|
||||
final manufacturerSpecificDataArgs = manufacturerSpecificData?.toArgs();
|
||||
return MyAdvertiseDataArgs(
|
||||
return MyAdvertisementArgs(
|
||||
nameArgs: nameArgs,
|
||||
serviceUUIDsArgs: serviceUUIDsArgs,
|
||||
serviceDataArgs: serviceDataArgs,
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Autogenerated from Pigeon (v11.0.1), do not edit directly.
|
||||
// Autogenerated from Pigeon (v12.0.1), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import
|
||||
|
||||
@ -7,6 +7,15 @@ import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;
|
||||
|
||||
import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;
|
||||
import 'package:flutter/services.dart';
|
||||
List<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 {
|
||||
unknown,
|
||||
@ -123,8 +132,8 @@ class MyPeripheralArgs {
|
||||
}
|
||||
}
|
||||
|
||||
class MyAdvertiseDataArgs {
|
||||
MyAdvertiseDataArgs({
|
||||
class MyAdvertisementArgs {
|
||||
MyAdvertisementArgs({
|
||||
this.nameArgs,
|
||||
required this.serviceUUIDsArgs,
|
||||
required this.serviceDataArgs,
|
||||
@ -148,9 +157,9 @@ class MyAdvertiseDataArgs {
|
||||
];
|
||||
}
|
||||
|
||||
static MyAdvertiseDataArgs decode(Object result) {
|
||||
static MyAdvertisementArgs decode(Object result) {
|
||||
result as List<Object?>;
|
||||
return MyAdvertiseDataArgs(
|
||||
return MyAdvertisementArgs(
|
||||
nameArgs: result[0] as String?,
|
||||
serviceUUIDsArgs: (result[1] as List<Object?>?)!.cast<String?>(),
|
||||
serviceDataArgs: (result[2] as Map<Object?, Object?>?)!.cast<String?, Uint8List?>(),
|
||||
@ -681,7 +690,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
|
||||
const _MyCentralManagerFlutterApiCodec();
|
||||
@override
|
||||
void writeValue(WriteBuffer buffer, Object? value) {
|
||||
if (value is MyAdvertiseDataArgs) {
|
||||
if (value is MyAdvertisementArgs) {
|
||||
buffer.putUint8(128);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is MyGattCharacteristicArgs) {
|
||||
@ -705,7 +714,7 @@ class _MyCentralManagerFlutterApiCodec extends StandardMessageCodec {
|
||||
Object? readValueOfType(int type, ReadBuffer buffer) {
|
||||
switch (type) {
|
||||
case 128:
|
||||
return MyAdvertiseDataArgs.decode(readValue(buffer)!);
|
||||
return MyAdvertisementArgs.decode(readValue(buffer)!);
|
||||
case 129:
|
||||
return MyGattCharacteristicArgs.decode(readValue(buffer)!);
|
||||
case 130:
|
||||
@ -725,7 +734,7 @@ abstract class MyCentralManagerFlutterApi {
|
||||
|
||||
void onStateChanged(int stateNumberArgs);
|
||||
|
||||
void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertiseDataArgs advertiseDataArgs);
|
||||
void onDiscovered(MyPeripheralArgs peripheralArgs, int rssiArgs, MyAdvertisementArgs advertisementArgs);
|
||||
|
||||
void onPeripheralStateChanged(MyPeripheralArgs peripheralArgs, bool stateArgs);
|
||||
|
||||
@ -746,8 +755,14 @@ abstract class MyCentralManagerFlutterApi {
|
||||
final int? arg_stateNumberArgs = (args[0] as int?);
|
||||
assert(arg_stateNumberArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onStateChanged was null, expected non-null int.');
|
||||
api.onStateChanged(arg_stateNumberArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onStateChanged(arg_stateNumberArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -768,11 +783,17 @@ abstract class MyCentralManagerFlutterApi {
|
||||
final int? arg_rssiArgs = (args[1] as int?);
|
||||
assert(arg_rssiArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null int.');
|
||||
final MyAdvertiseDataArgs? arg_advertiseDataArgs = (args[2] as MyAdvertiseDataArgs?);
|
||||
assert(arg_advertiseDataArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertiseDataArgs.');
|
||||
api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertiseDataArgs!);
|
||||
return;
|
||||
final MyAdvertisementArgs? arg_advertisementArgs = (args[2] as MyAdvertisementArgs?);
|
||||
assert(arg_advertisementArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onDiscovered was null, expected non-null MyAdvertisementArgs.');
|
||||
try {
|
||||
api.onDiscovered(arg_peripheralArgs!, arg_rssiArgs!, arg_advertisementArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -793,8 +814,14 @@ abstract class MyCentralManagerFlutterApi {
|
||||
final bool? arg_stateArgs = (args[1] as bool?);
|
||||
assert(arg_stateArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onPeripheralStateChanged was null, expected non-null bool.');
|
||||
api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onPeripheralStateChanged(arg_peripheralArgs!, arg_stateArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -815,8 +842,14 @@ abstract class MyCentralManagerFlutterApi {
|
||||
final Uint8List? arg_valueArgs = (args[1] as Uint8List?);
|
||||
assert(arg_valueArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyCentralManagerFlutterApi.onCharacteristicValueChanged was null, expected non-null Uint8List.');
|
||||
api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onCharacteristicValueChanged(arg_characteristicArgs!, arg_valueArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -827,7 +860,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec {
|
||||
const _MyPeripheralManagerHostApiCodec();
|
||||
@override
|
||||
void writeValue(WriteBuffer buffer, Object? value) {
|
||||
if (value is MyAdvertiseDataArgs) {
|
||||
if (value is MyAdvertisementArgs) {
|
||||
buffer.putUint8(128);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is MyGattCharacteristicArgs) {
|
||||
@ -854,7 +887,7 @@ class _MyPeripheralManagerHostApiCodec extends StandardMessageCodec {
|
||||
Object? readValueOfType(int type, ReadBuffer buffer) {
|
||||
switch (type) {
|
||||
case 128:
|
||||
return MyAdvertiseDataArgs.decode(readValue(buffer)!);
|
||||
return MyAdvertisementArgs.decode(readValue(buffer)!);
|
||||
case 129:
|
||||
return MyGattCharacteristicArgs.decode(readValue(buffer)!);
|
||||
case 130:
|
||||
@ -974,12 +1007,12 @@ class MyPeripheralManagerHostApi {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> startAdvertising(MyAdvertiseDataArgs arg_advertiseDataArgs) async {
|
||||
Future<void> startAdvertising(MyAdvertisementArgs arg_advertisementArgs) async {
|
||||
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerHostApi.startAdvertising', codec,
|
||||
binaryMessenger: _binaryMessenger);
|
||||
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) {
|
||||
throw PlatformException(
|
||||
code: 'channel-error',
|
||||
@ -1171,8 +1204,14 @@ abstract class MyPeripheralManagerFlutterApi {
|
||||
final int? arg_stateNumberArgs = (args[0] as int?);
|
||||
assert(arg_stateNumberArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onStateChanged was null, expected non-null int.');
|
||||
api.onStateChanged(arg_stateNumberArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onStateChanged(arg_stateNumberArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1199,8 +1238,14 @@ abstract class MyPeripheralManagerFlutterApi {
|
||||
final int? arg_offsetArgs = (args[3] as int?);
|
||||
assert(arg_offsetArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onReadCharacteristicCommandReceived was null, expected non-null int.');
|
||||
api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onReadCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1230,8 +1275,14 @@ abstract class MyPeripheralManagerFlutterApi {
|
||||
final Uint8List? arg_valueArgs = (args[4] as Uint8List?);
|
||||
assert(arg_valueArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onWriteCharacteristicCommandReceived was null, expected non-null Uint8List.');
|
||||
api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onWriteCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_idArgs!, arg_offsetArgs!, arg_valueArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -1255,8 +1306,14 @@ abstract class MyPeripheralManagerFlutterApi {
|
||||
final bool? arg_stateArgs = (args[2] as bool?);
|
||||
assert(arg_stateArgs != null,
|
||||
'Argument for dev.flutter.pigeon.bluetooth_low_energy_android.MyPeripheralManagerFlutterApi.onNotifyCharacteristicCommandReceived was null, expected non-null bool.');
|
||||
api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!);
|
||||
return;
|
||||
try {
|
||||
api.onNotifyCharacteristicCommandReceived(arg_centralArgs!, arg_characteristicArgs!, arg_stateArgs!);
|
||||
return wrapResponse(empty: true);
|
||||
} on PlatformException catch (e) {
|
||||
return wrapResponse(error: e);
|
||||
} catch (e) {
|
||||
return wrapResponse(error: PlatformException(code: 'error', message: e.toString()));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -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:typed_data';
|
||||
|
||||
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'my_api.dart';
|
||||
import 'my_bluetooth_low_energy_manager.dart';
|
||||
import 'my_gatt_characteristic2.dart';
|
||||
import 'my_gatt_descriptor2.dart';
|
||||
|
||||
class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
implements CentralManager, MyCentralManagerFlutterApi {
|
||||
final Logger _logger;
|
||||
class MyCentralManager2 extends MyCentralManager
|
||||
implements MyCentralManagerFlutterApi {
|
||||
final MyCentralManagerHostApi _api;
|
||||
BluetoothLowEnergyState _state;
|
||||
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
|
||||
_stateChangedController;
|
||||
final StreamController<DiscoveredEventArgs> _discoveredController;
|
||||
final StreamController<PeripheralStateChangedEventArgs>
|
||||
_peripheralStateChangedController;
|
||||
final StreamController<GattCharacteristicValueChangedEventArgs>
|
||||
_characteristicValueChangedController;
|
||||
|
||||
MyCentralManager()
|
||||
: _logger = Logger('MyCentralManager'),
|
||||
_api = MyCentralManagerHostApi(),
|
||||
MyCentralManager2()
|
||||
: _api = MyCentralManagerHostApi(),
|
||||
_state = BluetoothLowEnergyState.unknown,
|
||||
_stateChangedController = StreamController.broadcast(),
|
||||
_discoveredController = StreamController.broadcast(),
|
||||
_peripheralStateChangedController = StreamController.broadcast(),
|
||||
_characteristicValueChangedController = StreamController.broadcast();
|
||||
|
||||
@override
|
||||
BluetoothLowEnergyState get state => _state;
|
||||
@protected
|
||||
set state(BluetoothLowEnergyState value) {
|
||||
if (_state == value) {
|
||||
return;
|
||||
}
|
||||
_state = value;
|
||||
final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state);
|
||||
_stateChangedController.add(eventArgs);
|
||||
}
|
||||
|
||||
@override
|
||||
Stream<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
|
||||
_stateChangedController.stream;
|
||||
@override
|
||||
Stream<DiscoveredEventArgs> get discovered => _discoveredController.stream;
|
||||
@override
|
||||
Stream<PeripheralStateChangedEventArgs> get peripheralStateChanged =>
|
||||
@ -36,6 +52,13 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
get characteristicValueChanged =>
|
||||
_characteristicValueChangedController.stream;
|
||||
|
||||
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
|
||||
if (this.state != state) {
|
||||
throw StateError(
|
||||
'$state is expected, but current state is ${this.state}.');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setUp() async {
|
||||
final args = await _api.setUp();
|
||||
@ -47,26 +70,26 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> startDiscovery() async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _api.startDiscovery();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> stopDiscovery() async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _api.stopDiscovery();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> connect(Peripheral peripheral) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final peripheralHashCodeArgs = peripheral.hashCode;
|
||||
await _api.connect(peripheralHashCodeArgs);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> disconnect(Peripheral peripheral) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final peripheralHashCodeArgs = peripheral.hashCode;
|
||||
await _api.disconnect(peripheralHashCodeArgs);
|
||||
}
|
||||
@ -76,7 +99,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
Peripheral peripheral, {
|
||||
required GattCharacteristicWriteType type,
|
||||
}) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final peripheralHashCodeArgs = peripheral.hashCode;
|
||||
final typeArgs = type.toArgs();
|
||||
final typeNumberArgs = typeArgs.index;
|
||||
@ -89,7 +112,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<int> readRSSI(Peripheral peripheral) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final peripheralHashCodeArgs = peripheral.hashCode;
|
||||
final rssi = await _api.readRSSI(peripheralHashCodeArgs);
|
||||
return rssi;
|
||||
@ -97,7 +120,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<List<GattService>> discoverGATT(Peripheral peripheral) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (peripheral is! MyPeripheral) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -123,9 +146,9 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
// TODO: 思考更好的解决方式,可以在连接后立即协商 MTU。
|
||||
const mtuArgs = 517;
|
||||
await _api.requestMTU(peripheralHashCodeArgs, mtuArgs);
|
||||
} catch (error, stack) {
|
||||
} catch (error, stackTrace) {
|
||||
// 忽略协商 MTU 错误
|
||||
_logger.warning('requst MTU failed.', error, stack);
|
||||
logger.warning('requst MTU failed.', error, stackTrace);
|
||||
}
|
||||
return services;
|
||||
}
|
||||
@ -134,7 +157,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
Future<Uint8List> readCharacteristic(
|
||||
GattCharacteristic characteristic,
|
||||
) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (characteristic is! MyGattCharacteristic2) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -155,7 +178,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
required Uint8List value,
|
||||
required GattCharacteristicWriteType type,
|
||||
}) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (characteristic is! MyGattCharacteristic2) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -179,7 +202,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
GattCharacteristic characteristic, {
|
||||
required bool state,
|
||||
}) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (characteristic is! MyGattCharacteristic2) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -197,7 +220,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<Uint8List> readDescriptor(GattDescriptor descriptor) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (descriptor is! MyGattDescriptor2) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -218,7 +241,7 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
GattDescriptor descriptor, {
|
||||
required Uint8List value,
|
||||
}) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (descriptor is! MyGattDescriptor2) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -245,15 +268,15 @@ class MyCentralManager extends MyBluetoothLowEnergyManager
|
||||
void onDiscovered(
|
||||
MyPeripheralArgs peripheralArgs,
|
||||
int rssiArgs,
|
||||
MyAdvertiseDataArgs advertiseDataArgs,
|
||||
MyAdvertisementArgs advertisementArgs,
|
||||
) {
|
||||
final peripheral = peripheralArgs.toPeripheral();
|
||||
final rssi = rssiArgs;
|
||||
final advertiseData = advertiseDataArgs.toAdvertiseData();
|
||||
final advertisement = advertisementArgs.toAdvertisement();
|
||||
final eventArgs = DiscoveredEventArgs(
|
||||
peripheral,
|
||||
rssi,
|
||||
advertiseData,
|
||||
advertisement,
|
||||
);
|
||||
_discoveredController.add(eventArgs);
|
||||
}
|
@ -1,14 +1,16 @@
|
||||
import 'dart:async';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:bluetooth_low_energy_platform_interface/bluetooth_low_energy_platform_interface.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
import 'my_api.dart';
|
||||
import 'my_bluetooth_low_energy_manager.dart';
|
||||
|
||||
class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
implements PeripheralManager, MyPeripheralManagerFlutterApi {
|
||||
class MyPeripheralManager2 extends MyPeripheralManager
|
||||
implements MyPeripheralManagerFlutterApi {
|
||||
final MyPeripheralManagerHostApi _api;
|
||||
BluetoothLowEnergyState _state;
|
||||
final StreamController<BluetoothLowEnergyStateChangedEventArgs>
|
||||
_stateChangedController;
|
||||
final StreamController<ReadGattCharacteristicCommandEventArgs>
|
||||
_readCharacteristicCommandReceivedController;
|
||||
final StreamController<WriteGattCharacteristicCommandEventArgs>
|
||||
@ -16,8 +18,10 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
final StreamController<NotifyGattCharacteristicCommandEventArgs>
|
||||
_notifyCharacteristicCommandReceivedController;
|
||||
|
||||
MyPeripheralManager()
|
||||
MyPeripheralManager2()
|
||||
: _api = MyPeripheralManagerHostApi(),
|
||||
_state = BluetoothLowEnergyState.unknown,
|
||||
_stateChangedController = StreamController.broadcast(),
|
||||
_readCharacteristicCommandReceivedController =
|
||||
StreamController.broadcast(),
|
||||
_writeCharacteristicCommandReceivedController =
|
||||
@ -26,20 +30,40 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
StreamController.broadcast();
|
||||
|
||||
@override
|
||||
BluetoothLowEnergyState get state => _state;
|
||||
@protected
|
||||
set state(BluetoothLowEnergyState value) {
|
||||
if (_state == value) {
|
||||
return;
|
||||
}
|
||||
_state = value;
|
||||
final eventArgs = BluetoothLowEnergyStateChangedEventArgs(state);
|
||||
_stateChangedController.add(eventArgs);
|
||||
}
|
||||
|
||||
@override
|
||||
Stream<BluetoothLowEnergyStateChangedEventArgs> get stateChanged =>
|
||||
_stateChangedController.stream;
|
||||
@override
|
||||
Stream<ReadGattCharacteristicCommandEventArgs>
|
||||
get readCharacteristicCommandReceived =>
|
||||
_readCharacteristicCommandReceivedController.stream;
|
||||
|
||||
@override
|
||||
Stream<WriteGattCharacteristicCommandEventArgs>
|
||||
get writeCharacteristicCommandReceived =>
|
||||
_writeCharacteristicCommandReceivedController.stream;
|
||||
|
||||
@override
|
||||
Stream<NotifyGattCharacteristicCommandEventArgs>
|
||||
get notifyCharacteristicCommandReceived =>
|
||||
_notifyCharacteristicCommandReceivedController.stream;
|
||||
|
||||
Future<void> _throwWithoutState(BluetoothLowEnergyState state) async {
|
||||
if (this.state != state) {
|
||||
throw StateError(
|
||||
'$state is expected, but current state is ${this.state}.');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> setUp() async {
|
||||
final args = await _api.setUp();
|
||||
@ -51,7 +75,7 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> addService(GattService service) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
if (service is! MyGattService) {
|
||||
throw TypeError();
|
||||
}
|
||||
@ -61,33 +85,33 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> removeService(GattService service) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final serviceHashCodeArgs = service.hashCode;
|
||||
await _api.removeService(serviceHashCodeArgs);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> clearServices() async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _api.clearServices();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> startAdvertising(AdvertiseData advertiseData) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final advertiseDataArgs = advertiseData.toArgs();
|
||||
await _api.startAdvertising(advertiseDataArgs);
|
||||
Future<void> startAdvertising(Advertisement advertisement) async {
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final advertisementArgs = advertisement.toArgs();
|
||||
await _api.startAdvertising(advertisementArgs);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> stopAdvertising() async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _api.stopAdvertising();
|
||||
}
|
||||
|
||||
@override
|
||||
Future<int> getMaximumWriteLength(Central central) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final centralHashCodeArgs = central.hashCode;
|
||||
final maximumWriteLength =
|
||||
await _api.getMaximumWriteLength(centralHashCodeArgs);
|
||||
@ -96,14 +120,14 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> sendReadCharacteristicReply(
|
||||
Central central,
|
||||
GattCharacteristic characteristic,
|
||||
int id,
|
||||
int offset,
|
||||
bool status,
|
||||
Uint8List value,
|
||||
) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
Central central, {
|
||||
required GattCharacteristic characteristic,
|
||||
required int id,
|
||||
required int offset,
|
||||
required bool status,
|
||||
required Uint8List value,
|
||||
}) async {
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final centralHashCodeArgs = central.hashCode;
|
||||
final characteristicHashCodeArgs = characteristic.hashCode;
|
||||
final idArgs = id;
|
||||
@ -122,13 +146,13 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> sendWriteCharacteristicReply(
|
||||
Central central,
|
||||
GattCharacteristic characteristic,
|
||||
int id,
|
||||
int offset,
|
||||
bool status,
|
||||
) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
Central central, {
|
||||
required GattCharacteristic characteristic,
|
||||
required int id,
|
||||
required int offset,
|
||||
required bool status,
|
||||
}) async {
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final centralHashCodeArgs = central.hashCode;
|
||||
final characteristicHashCodeArgs = characteristic.hashCode;
|
||||
final idArgs = id;
|
||||
@ -145,11 +169,11 @@ class MyPeripheralManager extends MyBluetoothLowEnergyManager
|
||||
|
||||
@override
|
||||
Future<void> notifyCharacteristicValueChanged(
|
||||
Central central,
|
||||
GattCharacteristic characteristic,
|
||||
Uint8List value,
|
||||
) async {
|
||||
await throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
Central central, {
|
||||
required GattCharacteristic characteristic,
|
||||
required Uint8List value,
|
||||
}) async {
|
||||
await _throwWithoutState(BluetoothLowEnergyState.poweredOn);
|
||||
final centralHashCodeArgs = central.hashCode;
|
||||
final characteristicHashCodeArgs = characteristic.hashCode;
|
||||
final valueArgs = value;
|
@ -66,7 +66,7 @@ abstract class MyCentralManagerFlutterApi {
|
||||
void onDiscovered(
|
||||
MyPeripheralArgs peripheralArgs,
|
||||
int rssiArgs,
|
||||
MyAdvertiseDataArgs advertiseDataArgs,
|
||||
MyAdvertisementArgs advertisementArgs,
|
||||
);
|
||||
void onPeripheralStateChanged(
|
||||
MyPeripheralArgs peripheralArgs,
|
||||
@ -87,7 +87,7 @@ abstract class MyPeripheralManagerHostApi {
|
||||
void removeService(int serviceHashCodeArgs);
|
||||
void clearServices();
|
||||
@async
|
||||
void startAdvertising(MyAdvertiseDataArgs advertiseDataArgs);
|
||||
void startAdvertising(MyAdvertisementArgs advertisementArgs);
|
||||
void stopAdvertising();
|
||||
int getMaximumWriteLength(int centralHashCodeArgs);
|
||||
void sendReadCharacteristicReply(
|
||||
@ -162,13 +162,13 @@ class MyPeripheralArgs {
|
||||
MyPeripheralArgs(this.hashCodeArgs, this.uuidArgs);
|
||||
}
|
||||
|
||||
class MyAdvertiseDataArgs {
|
||||
class MyAdvertisementArgs {
|
||||
final String? nameArgs;
|
||||
final List<String?> serviceUUIDsArgs;
|
||||
final Map<String?, Uint8List?> serviceDataArgs;
|
||||
final MyManufacturerSpecificDataArgs? manufacturerSpecificDataArgs;
|
||||
|
||||
MyAdvertiseDataArgs(
|
||||
MyAdvertisementArgs(
|
||||
this.nameArgs,
|
||||
this.serviceUUIDsArgs,
|
||||
this.serviceDataArgs,
|
||||
|
@ -1,6 +1,6 @@
|
||||
name: bluetooth_low_energy_android
|
||||
description: Android implementation of the bluetooth_low_energy plugin.
|
||||
version: 3.0.4
|
||||
version: 4.0.0
|
||||
homepage: https://github.com/yanshouwang/bluetooth_low_energy
|
||||
|
||||
environment:
|
||||
@ -10,14 +10,13 @@ environment:
|
||||
dependencies:
|
||||
flutter:
|
||||
sdk: flutter
|
||||
bluetooth_low_energy_platform_interface: ^3.0.0
|
||||
logging: ^1.2.0
|
||||
bluetooth_low_energy_platform_interface: ^4.0.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_lints: ^2.0.0
|
||||
pigeon: ^11.0.1
|
||||
flutter_lints: ^3.0.0
|
||||
pigeon: ^12.0.1
|
||||
|
||||
flutter:
|
||||
plugin:
|
||||
|
Reference in New Issue
Block a user