Первый код, который компилируется, но не работает должным образом:
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_reactive_ble/flutter_reactive_ble.dart';
import 'package:location_permissions/location_permissions.dart';
class BluetoothConnectionScreen extends StatefulWidget {
const BluetoothConnectionScreen({super.key});
@override
State<BluetoothConnectionScreen> createState() => _BluetoothConnectionScreenState();
}
class _BluetoothConnectionScreenState extends State<BluetoothConnectionScreen> {
final flutterReactiveBle = FlutterReactiveBle();
late DiscoveredDevice _myDevice;
late StreamSubscription<DiscoveredDevice> _scanStream;
late QualifiedCharacteristic _rxCharacteristic;
final Uuid serviceUuid = Uuid.parse("4fafc201-1fb5-459e-8fcc-c5c9c331914b");
final Uuid characteristicUuid = Uuid.parse("beb5483e-36e1-4688-b7f5-ea07361b26a8");
late List<int> _infoCharacteristics;
bool _foundDeviceWaitingToConnect = false;
bool _scanStarted = false;
bool _connected = false;
void _startScan() async {
bool permGranted = false;
setState(() {
_scanStarted = true;
});
PermissionStatus permission;
permission = await LocationPermissions().requestPermissions();
if (permission == PermissionStatus.granted) permGranted = true;
if (permGranted) {
_scanStream = flutterReactiveBle
.scanForDevices(withServices: [serviceUuid]).listen((device) {
if (device.name.startsWith("L")) {
setState(() {
_myDevice = device;
_foundDeviceWaitingToConnect = true;
});
}
});
}
}
void _connectToDevice() {
_scanStream.cancel();
Stream<ConnectionStateUpdate> _currentConnectionStream = flutterReactiveBle
.connectToAdvertisingDevice(
id: _myDevice.id,
prescanDuration: const Duration(seconds: 5),
withServices: [serviceUuid, characteristicUuid]);
_currentConnectionStream.listen((event) {
switch (event.connectionState) {
case DeviceConnectionState.connected:
{
_rxCharacteristic = QualifiedCharacteristic(
serviceId: serviceUuid,
characteristicId: characteristicUuid,
deviceId: event.deviceId);
setState(() {
_foundDeviceWaitingToConnect = false;
_connected = true;
});
break;
}
case DeviceConnectionState.disconnected:
{
setState(() {
_foundDeviceWaitingToConnect = true;
_connected = false;
});
break;
}
default:
}
});
}
void _readFromDevice() async
{
if (_connected) {
setState(() async {
_infoCharacteristics.addAll(await flutterReactiveBle.readCharacteristic(_rxCharacteristic));
});
}
}
@override
Widget build(BuildContext context) {
_infoCharacteristics.addAll([1,2,3]);
return Scaffold(
appBar: AppBar(
title: const Text("BLE"),
),
body: SafeArea(child:
Center(child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text("Started scan: $_scanStarted"),
ElevatedButton.icon(
icon: const Icon(
Icons.bluetooth,
color: Colors.yellow,
size: 24.0,
),
onPressed: () => _startScan(),
label: const Text("Find and pair BLE device"),
style: ElevatedButton.styleFrom(
alignment: Alignment.centerLeft,
fixedSize: const Size(
290,
32,
),
),
),
Text("Device found? $_foundDeviceWaitingToConnect"),
Text("Scan started? $_scanStarted"),
Text("Connected? $_connected"),
_connected ? Text("OK! Device name: ${_myDevice.id.toString()}") : Text("Device not connected!"),
ElevatedButton.icon(
icon: const Icon(
Icons.bluetooth,
color: Colors.yellow,
size: 24.0,
),
onPressed: () => _connectToDevice,
label: const Text("Connect to BLE device"),
style: ElevatedButton.styleFrom(
alignment: Alignment.centerLeft,
fixedSize: const Size(
290,
32,
),
),
),
ElevatedButton.icon(
icon: const Icon(
Icons.bluetooth,
color: Colors.yellow,
size: 24.0,
),
onPressed: () => _readFromDevice,
label: const Text("Read information"),
style: ElevatedButton.styleFrom(
alignment: Alignment.centerLeft,
fixedSize: const Size(
290,
32,
),
),
),
_connected ? Text("OK ! $_infoCharacteristics") : Text("Device not connected!"),
],
))));
}
}
Мое приложение Flutter компилируется, но не работает должным образом. Устройство находит по UUID, но подключиться к нему не может. Не знаю почему. Наконец, я хочу прочитать характеристики с моего устройства (текст, представленный строками). Любые советы приветствуются!. Спасибо.
Я добавил все необходимые разрешения приложения (в файл манифеста Android), и это приложение предоставило все необходимые разрешения в ОС Android 11. Конечно, я протестировал его на реальном устройстве, мобильном телефоне.
Что я должен делать?
Журналы LOGCAT:
2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:38:12)[ 0м
2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 _BluetoothConnectionScreenState.build. (пакет: my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:128:26)[0m
2023-04-28 22:15:17.784 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м
2023-04-28 22:15:17.785 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Начато сканирование устройства[0m
2023-04-28 22:15:17.785 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:49:14)[ 0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 [0m
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Разрешение предоставлено[0m 2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m┌──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #0 _BluetoothConnectionScreenState._startScan (package:my_app/Screens/BluetoothConnection/BluetoothPairingScreen.dart:61:12)[ 0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ #1 [0m
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄ ┄┄┄┄┄┄[0м
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m│ 💡 Устройство найдено: false[0m
2023-04-28 22:15:17.797 10350-16111 флаттер com.example.my_app I [38;5;12m└──────────────────── ─── ──────────────────────────────────────── ────────── ──────────────────────────────────────── ──────[0м
2023-04-28 22:15:17.799 10350-16177 BluetoothAdapter com.example.my_app D isLeEnabled(): ON
2023-04-28 22:15:17.810 10350-16177 BluetoothAdapter com.example.my_app D isLeEnabled(): ON
2023-04-28 22:15:17.812 10350-16191 BluetoothLeScanner com.example.my_app D onScannerRegistered() — статус = 0 ScannerId = 10 mScannerId = 0
2023-04-28 22:15:17.815 2029-7327 AppOps pid-2029 E Неверный вызов, сделанный uid 1002. Пакет «com.example.my_app» не принадлежит uid 1002.
Используя код @rrttrr (метод ниже), я получил журналы:
W/FinalizerDaemon (15204): тип = 1400 аудит (0.0: 2118): avc: запрещено { getopt } для пути = "/dev/socket/usap_pool_primary" scontext = u: r: untrusted_app: s0: c223, c256, c512, c768 tcontext=u:r:zygote:s0 tclass=unix_stream_socket permissive=0 app=com.example.my_app
D/BluetoothGatt(15204): connect() – устройство: 54:43:B2:46:84:F6, авто: ложь, eattSupport: ложь
D/BluetoothGatt(15204): registerApp()
D/BluetoothGatt(15204): registerApp() – UUID=0243bb19-1462-46bb-a2ab-e636e81b812f
I/flutter (15204): состояние подключения BLE: DeviceConnectionState.connecting
I/flutter (15204): состояние подключения BLE: DeviceConnectionState.connecting
I/flutter (15204): состояние подключения BLE: DeviceConnectionState.disconnected





Вы можете попробовать это:
Подтвердите это вы можете подключиться к своему BLE-устройству с помощью стороннего приложения как nRF Connect. Убедитесь, что используемые вами UUID для подключения являются правильными и что устройство является рекламным и обнаруживаемый.
Если у вас возникли проблемы с connectToAdvertisingDevice, попробуйте использовать
connectToDevice вместо этого. connectToAdvertisingDevice работает только тогда, когда
устройство BLE является рекламным. connectToDevice постараюсь
подключаться к устройству независимо от того, рекламное оно или
нет.
Следите за журналами, пока тестируете свое приложение. Иногда, устройство BLE может отключиться вскоре после подключения. Если вы заметили, что устройство отключилось, попробуйте повторное подключение. Возможно, вам потребуется реализовать некоторую логику в вашем приложении. для автоматического повторного подключения в случае отключения.
Вы можете попробовать подключиться напрямую, используя приведенный ниже метод, чтобы проверить, работает ли он. Он напечатает состояние соединения и ошибку, если таковая имеется.
final flutterReactiveBle = FlutterReactiveBle();
StreamSubscription<ConnectionStateUpdate>? deviceConnection;
void connectToBleDevice() async {
await deviceConnection?.cancel();
await Future.delayed(const Duration(milliseconds: 500));
deviceConnection = flutterReactiveBle
.connectToDevice(
id: DEVICE_MAC_ID,
servicesWithCharacteristicsToDiscover: {
Uuid.parse(SERVICE_UUID): [
Uuid.parse(CHAR_UUID_1),
Uuid.parse(CHAR_UUID_2),
]
},
connectionTimeout: const Duration(seconds: 5),
)
.listen((connectionState) async {
debugPrint("BLE connection state: " +
connectionState.connectionState.toString());
}, onError: (dynamic error) async {
debugPrint("BLE connection error: ${error.toString()}");
});
}
1) Уже проверил, с nRF устройство работает нормально. Я умею читать характеристики. 2) Пробовал - не помогло. 3) Надо попробовать, но если честно не умею читать логи на реальном устройстве. Должен ли я подключать его к Android Studio через кабель??
Вы также можете попробовать подключиться напрямую, используя UUID устройства, полученный от nRF Connect, чтобы проверить, можете ли вы подключиться таким образом. 3) Да, подключитесь к физическому устройству и установите приложение через IDE.
Я знаю точный UUID устройства и службы. Мне удалось использовать телефон через кабель. Я обновляю свой пост с помощью журналов logcat...
Я разместил метод, вы можете попробовать подключиться с его помощью и проверить журналы.
Кроме того, посмотрите на вкладку «Выполнить» для журналов.
Я использовал предоставленный код. Спасибо за время и усилия! Я отредактировал сообщение и поместил логи, которые я получил.
Давайте продолжим обсуждение в чате.
Я попробую все Ваши советы и вернусь сюда как можно скорее. Спасибо.