flutter_classic_bluetooth 0.1.8
flutter_classic_bluetooth: ^0.1.8 copied to clipboard
Bluetooth Classic (RFCOMM/SPP) serial plugin for Flutter. Discover, pair and connect to ESP32, Arduino, HC-05 and thermal printers on Android, Windows, macOS, Linux, iOS.
0.1.8 #
Changed #
- New package logo.
- Tuned pub.dev topics and description for discoverability. No code changes.
0.1.7 #
Fixed #
- Windows: discovery result and state events are now delivered on the platform thread. They were being sent from the background discovery thread, which made Flutter warn about non-platform-thread channel messages and could drop events. Thanks to @translibrius for the report (#6).
0.1.6 #
Changed #
- Reworded the package description and swapped the
iottopic forprinterso developers searching pub.dev for thermal printer support can find the plugin. Metadata only; no API or behaviour changes.
0.1.5 #
Added #
- Physical disconnect detection (Android & iOS): when a connected device
suddenly goes away (printer powered off, accessory unplugged, out of range),
the plugin now detects it immediately, closes the dead connection, and emits
disconnectedon the connection's state stream so UIs and reconnect logic can react instead of the link appearing healthy. Android listens forACTION_ACL_DISCONNECTED; iOS observesEAAccessoryDidDisconnect. Thanks to @abbiyuarsyah.
Fixed #
- An ACL disconnect tears down the whole physical link, so all connections to the departed device are now closed, not just the first match (Android & iOS).
- iOS emits the terminal
disconnectedstate exactly once, even when the stream delegate and the accessory-disconnect notification both fire for the same disconnect. - iOS removes its
EAAccessoryDidDisconnectobserver on teardown.
0.1.4 #
Fixed #
- iOS: skip MAC-address and UUID format validation on iOS. The ExternalAccessory (MFi) framework hides the Bluetooth MAC address and exposes accessories by an opaque identifier, so the colon-separated MAC and standard UUID checks wrongly rejected valid iOS values. Validation still applies on all other platforms. Thanks to @abbiyuarsyah.
0.1.3 #
Added #
- Line / frame reading for serial data:
Stream<Uint8List>.lines()and.frames()extensions plus theBtcFrameSplittertransformer reassemble delimiter-terminated messages that span multipleinputchunks..lines()splits on\n, strips a trailing\r, and decodes toString, so ESP32 / HC-05 / Arduino serial output reads cleanly withconnection.input.lines(). A.decoded()helper streams multi-byte-safe text. - Request/response:
BtcConnection.sendAndReceive()(and the same onBtcReconnectingConnection) writes a command and returns the first response line (or the first line matching awherepredicate) with framing and a timeout handled for you. Ideal for AT-command devices. BtcStreamSink.writeLine()/BtcReconnectingConnection.sendLine(): write text with a trailing newline (CRLF by default).- One-shot
FlutterClassicBluetooth.scan(): starts discovery, collects results for a timeout (de-duplicated and merged), stops, and returns them sorted by signal strength. PlusBtcDevice.mergedWith()to combine repeated sightings. BtcReconnectingConnectionnow exposesattemptsandlastErrorfor UIs that show reconnect progress.- Connection RSSI (macOS):
BtcConnection.readRssi()reads the live signal strength of an open link viaIOBluetoothDevice. Gated by the newBtcPlatformCapabilities.canReadConnectionRssiflag; Android, iOS, Windows and Linux throwBtcUnsupportedException(no public Classic API for connection RSSI). Discovery-time RSSI stays available everywhere onBtcDevice.rssi. - Linux: the plugin registers an auto-accepting BlueZ pairing agent
(
org.bluez.Agent1), so Secure Simple Pairing ("just works") devices (ESP32, most HC-05/06) pair frombondDevice()without a desktop dialog. Devices that require typing a PIN/passkey still need a system agent.
0.1.2 #
Added #
- Auto-reconnect:
connectWithReconnect()returns aBtcReconnectingConnectionthat transparently re-establishes the link when it drops, with a configurableBtcReconnectPolicy(exponential backoff, max attempts, per-attempt timeout). Itsinputandstatestreams are stable across reconnects, so you subscribe once. NewBtcReconnectStateenum.
Changed #
- Discoverability: lead the package
description, README title and opening with the terms developers actually search (Bluetooth Classic, RFCOMM/SPP, serial, ESP32, HC-05) so the package surfaces for those queries. - Docs: add a Roadmap section to the README, a checked list of shipped capabilities plus planned items.
0.1.1 #
Reliability and completeness pass across all five platforms, plus API ergonomics.
Added #
BtcUuid.spp, andconnect()/startServer()now defaultuuidto it. The common case is justconnect(address: ...)(HC-05/06, ESP32, Arduino, ...).connect()gains an optionaltimeout(throwsBtcTimeoutException).BtcConnection.stateStreamemitsdisconnecting→disconnectedonfinish()/close().BtcStreamSinkgainswriteString,writeBytes,addStreamandallSent.BtcDiscoveryExceptionfordiscoveryFailederrors.
Fixed #
- Android: marshal method/event-channel work to the main thread; shared atomic connection ids; receivers emit an initial snapshot and use the API 34 exported-receiver flag; no more orphaned permission/activity futures.
- Windows: register the per-connection/server/
bond_stateevent channels (inbound data was dropped); deliver accepted clients; publish an SDP record; honorsecure; surfaceWSAStartupfailure;setDiscoverableviaBluetoothEnableDiscovery. - Linux: discovery, adapter state/power, discoverability, paired-device listing
and pairing now run over the BlueZ D-Bus API (
org.bluez) as the primary path, so they work for an unprivileged user (no root / CAP_NET_RAW). Discovery is event-driven via BlueZ signals (BR/EDR-filtered) with live adapter on/off; raw HCI is an automatic fallback. Connect/server/data use AF_BLUETOOTH RFCOMM, with the channel resolved from the UUID via SDP. Bundled GoogleTest bumped to v1.15.2 so the example configures on CMake 4.x. - macOS: device discovery, accepted-client delivery, async connect/write,
main-thread events, and pairing via
IOBluetoothDevicePair(unpair via System Settings). - iOS: real adapter-state stream via CoreBluetooth;
isEnabledfrom the radio state with an MFi-accessory fallback.
Changed #
- Capability flags and the documentation tables reflect each platform's real support.
- SDK constraint set to
>=3.3.0 <4.0.0.
Note: Android, Windows and Linux are verified on-device. macOS native code is reviewed but should be compiled on macOS before production use.
0.1.0 #
- Initial release.
- Unified Dart API for Bluetooth Classic (RFCOMM) communication.
- Android: Full support (discovery, pairing, connect, server, discoverability).
- Windows: Discovery, pairing, connect, server via Winsock2/AF_BTH.
- macOS: Discovery, pairing, connect, server via IOBluetooth.
- Linux: Discovery, connect, server via BlueZ/RFCOMM. Pairing requires external tools.
- iOS: MFi accessory support via ExternalAccessory framework.
- Platform capabilities API for runtime feature detection.
- Multiple simultaneous RFCOMM connections.
- Stream-based data I/O with
BtcConnection. - Typed exception hierarchy (
BtcExceptionand subtypes). - Example app with 7 screens demonstrating all features.
