win_ble 套件為針對 Windows 和純 Dart 專案的 Flutter 應用程式啟用了藍牙低功耗 (BLE) 功能。專為 Windows 設計,它提供了一個通往原生 BLE 功能的橋樑,讓開發者能夠發現裝置、連接外設、讀取和寫入特徵值,並管理 BLE 操作。此外掛非常適合需要在 Windows 平台上與 BLE 裝置進行低功耗無線通訊的應用程式。它透過平台通道利用 Windows 藍牙 API,確保在 Flutter 生態系統中實現可靠的效能。
適用情境
連接到BLE傳感器
從藍牙信標讀取數據
控制藍牙低功耗(BLE)物聯網裝置
開發僅限 Windows 的健康監控應用
實現基於接近度的功能
主要特色
僅限 Windows 的 BLE 支援
原生 Windows 藍牙 API 集成
設備發現和連接管理
特性讀寫操作
純 Dart 相容性
適合對象
Windows 桌面應用程式開發者
物聯網設備整合商
健康與健身應用開發者
以藍牙為中心的實用工具
具有 Windows 特定 BLE 需求的跨平台應用程式
使用建議
僅限 Windows 平台
需要 Windows 10 或更新版本
不支援 Android/iOS
依賴系統級藍牙權限
可能需要為某些硬體進行額外設定
原始 README
以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。
WinBle
Use the WinBle plugin to enable Bluetooth Low Energy in Flutter Windows and pure Dart projects (Windows only)
Usage
First initialize WinBle, to initialize on Flutter Windows, get server path using await WinServer.path, and for pure dart projects ( Windows only ) Download BleServer.exe file and place in the same folder, checkout example_dart for more details
// To initialize on Flutter WindowsawaitWinBle.initialize(serverPath: awaitWinServer.path());
// For pure dart projectsawaitWinBle.initialize(serverPath: "Path of BLEServer.exe file");
Dispose WinBle after using
WinBle.dispose();
To Start Scan
WinBle.startScanning();
StreamSubscription? scanStream = WinBle.scanStream.listen((event) {
// Get Devices Here
});
To Stop Scan
WinBle.stopScanning();
scanStream?.cancel();
To Connect
// To ConnectawaitWinBle.connect(address);
// Get Connection Updates HereStreamSubscription _connectionStream =
WinBle.connectionStreamOf(device.address).listen((event) {
// event will be a boolean , in which// true => Connected// false => Disconnected
});
To Disconnect
awaitWinBle.disconnect(address);
To get MaxMtuSize
awaitWinBle.getMaxMtuSize(address);
Handle Bluetooth radio
// To get rdaio statusWinBle.getBluetoothState();
// To get updates of radio stateWinBle.bleState.listen((BleState state) {
// Get BleState (On, Off, Unknown, Disabled, Unsupported)
});
// To turn on radioWinBle.updateBluetoothState(true);
// To turn off radioWinBle.updateBluetoothState(false);
Pairing Options
// To PairawaitWinBle.pair(address);
// To UnPairawaitWinBle.unPair(address);
// To Check if Device can be Pairedbool canPair = awaitWinBle.canPair(address);
// To Check if Device is Already Pairedbool isPaired = awaitWinBle.isPaired(address);
Rest All Methods are
// To Get Servicesvar services = awaitWinBle.discoverServices(address);
// To Get CharacteristicList<BleCharacteristic> bleCharacteristics = awaitWinBle.discoverCharacteristics(address: address, serviceId: serviceID);
// To Read CharacteristicList<int> data = awaitWinBle.read(address: address, serviceId: serviceID, characteristicId: charID);
// To Write CharacteristicawaitWinBle.write( address: address, service: serviceID, characteristic: charID, data: data, writeWithResponse: writeWithResponse);
// To Start SubscriptionawaitWinBle.subscribeToCharacteristic(address: address, serviceId: serviceID, characteristicId: charID);
// To Stop SubscriptionawaitWinBle.unSubscribeFromCharacteristic(address: address, serviceId: serviceID, characteristicId: charID);
// Get Characteristic Value Updates HereStreamSubscription _characteristicValueStream = WinBle.characteristicValueStream.listen((event) {
// Here We will Receive All Characteristic Events
});
Note
Requires Windows version >= 10.0.15014
If windows release build opens cmd while running app, try this
Edit your /windows/runner/main.cpp file, this is a known flutter issue
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()){
CreateAndAttachConsole();
}
// Add this Code// <------- From Here --------- >else{
STARTUPINFO si = {0};
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi = {0};
WCHAR lpszCmd[MAX_PATH] = L"cmd.exe";
if (::CreateProcess(NULL, lpszCmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
{
do
{
if (::AttachConsole(pi.dwProcessId))
{
::TerminateProcess(pi.hProcess, 0);
break;
}
} while (ERROR_INVALID_HANDLE == GetLastError());
::CloseHandle(pi.hProcess);
::CloseHandle(pi.hThread);
}
}
// <------- UpTo Here --------- >