Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
Tauri Plugin blec
A BLE-Client plugin based on btlelug.
The main difference to using btleplug directly is that this uses the tauri plugin system for android. All other platforms use the btleplug implementation.
Docs
Installation
Install the rust part of the plugin
Or manually add it to the src-tauri/Cargo.toml
[]
= "0.12"
Install the js bindings
use your preferred JavaScript package manager to add @mnlphlp/plugin-blec:
Register the plugin in Tauri
src-tauri/src/lib.rs
default
.plugin
.run
.expect;
let mut app = default;
app = match try_init ;
app.run
.expect;
Allow calls from Frontend
Add blec:default to the permissions in your capabilities file.
Explanation about capabilities
IOS Setup
Add an entry to the info.plist of your app:
NSBluetoothAlwaysUsageDescription
The App uses Bluetooth to communicate with BLE devices
Add the CoreBluetooth Framework in your xcode procjet:
- open with
tauri ios dev --open - click on your project to open settings
- Add Framework under General -> Frameworks,Libraries and Embedded Content
Usage in Frontend
See examples/plugin-blec-example for a full working example that scans for devices, connects and sends/receives data. In order to use it run examples/test-server on another device and connect to that server.
Short example:
import { connect, sendString } from '@mnlphlp/plugin-blec'
// get address by scanning for devices and selecting the desired one
let address = ...
// connect and run a callback on disconnect
await connect(address, () => console.log('disconnected'))
// send some text to a characteristic
const CHARACTERISTIC_UUID = '51FF12BB-3ED8-46E5-B4F9-D64E2FEC021B'
await sendString(CHARACTERISTIC_UUID, 'Test', 'withResponse')
Testing
Unit tests with the mock backend
The crate contains a mock of the btleplug backend (tauri_plugin_blec::mock) that simulates
an adapter and devices in process: devices can disappear, drop their link, answer slowly, fail
or hang operations, and send notifications. The handler tests in src/handler/tests drive the
plugin through those situations, including a seeded randomized stress test.
# with the handler's logs
RUST_LOG=trace
# longer randomized run, reproducible via the seed
BLEC_STRESS_SEED=7 BLEC_STRESS_ITERS=5000
# tests documenting known bugs are ignored; run them to see the current behaviour
The mock can also replace the real backend in an app (desktop targets only) with the mock
cargo feature. The plugin then talks to MockWorld::global(), which the app can script:
use CharPropFlags;
use ;
let device = global.add_device;
device.drop_link; // simulate a lost connection
Stress testing the full stack
For the real stack there are two example programs:
- examples/stress-server: a GATT peripheral (Linux/BlueZ, runs on the host PC) that can drop the link, stop advertising, flood notifications, answer slowly, fail requests or restart, on request from the client or from its REPL.
- examples/stress-client: a Tauri app for the phone or a second PC.
Its
integrationscenario runs predefined scripts: one write starts a script, both sides follow the same timeline (drop, disappear, storm, slow responses, restart, rapid reconnects), verify their side and the client merges the server's report into a PASS/FAIL table. Aholdscenario keeps a connection open for soak testing.
The scripts and the GATT protocol are defined in examples/stress-protocol.md.
Usage in Backend
The plugin can also be used from the rust backend.
The handler returned by get_handler() is the same that is used by the frontend commands.
This means if you connect from the frontend you can send data from rust without having to call connect on the backend.
use ;
use WriteType;
const CHARACTERISTIC_UUID: Uuid = uuid!;
const DATA: = ;
let handler = get_handler.unwrap;
handler
.send_data
.await
.unwrap;