Feb 26, 2024
Exploring Bluetooth Low Energy Connectivity in Flutter Using quick_blue
From simulating peripheral behavior to seamless integration, master BLE basics for unforgettable app experiences in our latest blog.
Author


Book a call
Table of Contents
Bluetooth Low Energy (BLE) has transformed how devices communicate wirelessly, particularly in mobile app development. In this blog, we delve into Bluetooth connectivity within Flutter using the quick_blue package. BLE operates in two main roles: peripheral and central. Peripherals advertise their presence, while centrals scan for nearby devices and establish connections. We will simulate peripheral behavior using “bleno“ and implement Bluetooth functionality in Flutter with quick_blue_package. By the end, you will be able to understand BLE basics and how to integrate Bluetooth connectivity seamlessly into Flutter apps.
A Quick Bleno Overview
How Bleno Works
Using Bleno for Advertising on macOS
2. Define Services and Characteristics
Define the services and characteristics that your virtual peripheral will offer. This includes specifying UUIDs (Universally Unique Identifiers) for each service and characteristic.
3. Start Advertising
Once your virtual peripheral is configured, start advertising its presence. Bleno provides APIs to begin advertising and customize advertisement data, including the peripheral's name and advertised services.
4. Handling Connections
Bleno also provides callbacks to handle incoming connections from central devices. You can define actions to take when a central device connects or disconnects from your virtual peripheral.
You can find the reference to the code here: https://github.com/SahilSharma2710/bleno_example/blob/main/bleno_demo.js
Overview of Bluetooth Low Energy (BLE)
- Services: Services represent different functionalities offered by a BLE peripheral. For example, a heart rate monitor peripheral might have a Heart Rate service.
- Characteristics: Characteristics are attributes within services that contain data. For instance, the Heart Rate service may have a characteristic to read the current heart rate.
- Descriptors: Descriptors provide additional information about a characteristic's value, such as metadata or configuration settings.
- Reading: Central devices can read the value of characteristics from peripherals. For example, a fitness tracker app might read the current heart rate from a heart rate monitor.
- Writing: Central devices can write data to writable characteristics on peripherals. This enables commands or configuration settings to be sent to the peripheral.
- Notifications: Peripherals can notify central devices when a characteristic's value changes. This allows real-time updates, such as receiving notifications from a smartwatch.
- Before interacting with services and characteristics, central devices must discover them on the peripheral. This involves querying the peripheral to retrieve a list of available services and characteristics.
- Once discovered, central devices can access the desired services and characteristics for reading, writing, or subscribing to notifications.
- MTU refers to the maximum size of data packets that can be transmitted over a BLE connection. It impacts the efficiency of data transfer and can be negotiated between the central and peripheral devices during connection establishment.
- Optimizing MTU size can improve data throughput and reduce communication latency in BLE applications.
Creating a Flutter App to Interact with Bluetooth
1. Adding permissions
Add permissions for iOS.
In the ios/Runner/Info.plist let us add:
2. Add the dependency
3. Scan BLE peripheral

QuickBlue.startScan() and QuickBlue.stopScan() functions.4. Connecting and handling services

To handle all the connection-related logic, we can use the _handleConnectionChange. QuickBlue will send the deviceId and the connectionState in the arguments whenever there is a connection change.

_handleServiceDiscovery and _handleValueChange to handle the service discovery and value change during the entire connection.5. Reading data over Bluetooth
_handleValueChange . The data that we get over ble will be Uint8List type, we can decode it to get the data sent.
Tada! We have successfully established the connection with our advertiser and read the data from ffffffffffffffffffffffffffffff11 characteristics.

Summing Up
Subscribe to Our Newsletter
Subscribe to RSS
Press & Media Hub RSS FeedRelated Articles.
More from the engineering frontline.
Dive deep into our research and insights on design, development, and the impact of various trends to businesses.

Jun 27, 2026
Building a Resilient Hybrid-Cloud Network with WireGuard HA, Route-Based Failover, and Deep Observability

Jun 19, 2026
We Built a 114-Second AWS-to-Azure Failover. Here’s What We Learned

Jun 17, 2026
Google I/O 2026 Mobile Playbook: AI Studio, Android CLI, and Antigravity for App Development

Jun 12, 2026
Cloud-Native and Cloud-Agnostic Are Not Ideologies; They Are Business-Stage Decisions

Jun 8, 2026
Geeklego: The Open-Source Design System Built to Work With AI

Jun 3, 2026