* fix: 修复 iOS 和 macOS 断开后 GATT 被清理导致操作无法完成的问题

* fix: 调整 GATT 缓存

* fix: 修改 iOS 蓝牙使用描述

* fix: 修复无法通过设备地址生成 UUID 的问题,修复由于 bluez 未重写 hashCode 和 equals 导致无法比较缓存实例的问题

* fix: 修改版本信息

* fix: 修复BUG

* fix: 调整示例程序

* fix: 优化代码

* fix: 修改版本号

* fix: 更新 REDEME.md

* fix: 更新依赖项

* fix: 项目调整

---------

Co-authored-by: jetson2 <jetson2@const.cc>
This commit is contained in:
Mr剑侠客
2023-08-18 18:24:24 +08:00
committed by GitHub
parent 9203908915
commit 689b1fb045
61 changed files with 734 additions and 1137 deletions

View File

@ -1,3 +1,9 @@
## 2.0.1
- Fix the issue that GATTs is cleared after peripheral disconnected on iOS and macOS.
- Fix the issue that create UUID form peripheral's address failed on Linux.
- Fix the issue that instance match failed on Linux.
## 2.0.0
- Rewrite the whole project with federated plugins.

View File

@ -1,6 +1,6 @@
name: bluetooth_low_energy_windows
description: Windows implementation of the bluetooth_low_energy plugin.
version: 2.0.0
version: 2.0.1
homepage: https://github.com/yanshouwang/bluetooth_low_energy
environment:
@ -10,7 +10,7 @@ environment:
dependencies:
flutter:
sdk: flutter
bluetooth_low_energy_platform_interface: ^2.0.0
bluetooth_low_energy_platform_interface: ^2.0.1
win32: ^5.0.6
dev_dependencies:
@ -23,5 +23,5 @@ flutter:
implements: bluetooth_low_energy
platforms:
windows:
pluginClass: BluetoothLowEnergyWindowsPluginCApi
pluginClass: BluetoothLowEnergyPluginCApi
dartPluginClass: BluetoothLowEnergyWindows

View File

@ -5,24 +5,24 @@
cmake_minimum_required(VERSION 3.14)
# Project-level configuration.
set(PROJECT_NAME "bluetooth_low_energy_windows")
set(PROJECT_NAME "bluetooth_low_energy")
project(${PROJECT_NAME} LANGUAGES CXX)
# This value is used when generating builds using this plugin, so it must
# not be changed
set(PLUGIN_NAME "bluetooth_low_energy_windows_plugin")
set(PLUGIN_NAME "bluetooth_low_energy_plugin")
# Any new source files that you add to the plugin should be added here.
list(APPEND PLUGIN_SOURCES
"bluetooth_low_energy_windows_plugin.cpp"
"bluetooth_low_energy_windows_plugin.h"
"bluetooth_low_energy_plugin.cpp"
"bluetooth_low_energy_plugin.h"
)
# Define the plugin library target. Its name must not be changed (see comment
# on PLUGIN_NAME above).
add_library(${PLUGIN_NAME} SHARED
"include/bluetooth_low_energy_windows/bluetooth_low_energy_windows_plugin_c_api.h"
"bluetooth_low_energy_windows_plugin_c_api.cpp"
"include/bluetooth_low_energy/bluetooth_low_energy_plugin_c_api.h"
"bluetooth_low_energy_plugin_c_api.cpp"
${PLUGIN_SOURCES}
)
@ -47,7 +47,50 @@ target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin)
# List of absolute paths to libraries that should be bundled with the plugin.
# This list could contain prebuilt libraries, or libraries created by an
# external build triggered from this build file.
set(bluetooth_low_energy_windows_bundled_libraries
set(bluetooth_low_energy_bundled_libraries
""
PARENT_SCOPE
)
# === Tests ===
# These unit tests can be run from a terminal after building the example, or
# from Visual Studio after opening the generated solution file.
# Only enable test builds when building the example (which sets this variable)
# so that plugin clients aren't building the tests.
if (${include_${PROJECT_NAME}_tests})
set(TEST_RUNNER "${PROJECT_NAME}_test")
enable_testing()
# Add the Google Test dependency.
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/release-1.11.0.zip
)
# Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
# Disable install commands for gtest so it doesn't end up in the bundle.
set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE)
FetchContent_MakeAvailable(googletest)
# The plugin's C API is not very useful for unit testing, so build the sources
# directly into the test binary rather than using the DLL.
add_executable(${TEST_RUNNER}
test/bluetooth_low_energy_plugin_test.cpp
${PLUGIN_SOURCES}
)
apply_standard_settings(${TEST_RUNNER})
target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin)
target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock)
# flutter_wrapper_plugin has link dependencies on the Flutter DLL.
add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
"${FLUTTER_LIBRARY}" $<TARGET_FILE_DIR:${TEST_RUNNER}>
)
# Enable automatic test discovery.
include(GoogleTest)
gtest_discover_tests(${TEST_RUNNER})
endif()

View File

@ -1,4 +1,4 @@
#include "bluetooth_low_energy_windows_plugin.h"
#include "bluetooth_low_energy_plugin.h"
// This must be included before many other Windows headers.
#include <windows.h>
@ -13,17 +13,17 @@
#include <memory>
#include <sstream>
namespace bluetooth_low_energy_windows {
namespace bluetooth_low_energy {
// static
void BluetoothLowEnergyWindowsPlugin::RegisterWithRegistrar(
void BluetoothLowEnergyPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarWindows *registrar) {
auto channel =
std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
registrar->messenger(), "bluetooth_low_energy_windows",
registrar->messenger(), "bluetooth_low_energy",
&flutter::StandardMethodCodec::GetInstance());
auto plugin = std::make_unique<BluetoothLowEnergyWindowsPlugin>();
auto plugin = std::make_unique<BluetoothLowEnergyPlugin>();
channel->SetMethodCallHandler(
[plugin_pointer = plugin.get()](const auto &call, auto result) {
@ -33,11 +33,11 @@ void BluetoothLowEnergyWindowsPlugin::RegisterWithRegistrar(
registrar->AddPlugin(std::move(plugin));
}
BluetoothLowEnergyWindowsPlugin::BluetoothLowEnergyWindowsPlugin() {}
BluetoothLowEnergyPlugin::BluetoothLowEnergyPlugin() {}
BluetoothLowEnergyWindowsPlugin::~BluetoothLowEnergyWindowsPlugin() {}
BluetoothLowEnergyPlugin::~BluetoothLowEnergyPlugin() {}
void BluetoothLowEnergyWindowsPlugin::HandleMethodCall(
void BluetoothLowEnergyPlugin::HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &method_call,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
if (method_call.method_name().compare("getPlatformVersion") == 0) {
@ -56,4 +56,4 @@ void BluetoothLowEnergyWindowsPlugin::HandleMethodCall(
}
}
} // namespace bluetooth_low_energy_windows
} // namespace bluetooth_low_energy

View File

@ -0,0 +1,31 @@
#ifndef FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_H_
#define FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_H_
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <memory>
namespace bluetooth_low_energy {
class BluetoothLowEnergyPlugin : public flutter::Plugin {
public:
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
BluetoothLowEnergyPlugin();
virtual ~BluetoothLowEnergyPlugin();
// Disallow copy and assign.
BluetoothLowEnergyPlugin(const BluetoothLowEnergyPlugin&) = delete;
BluetoothLowEnergyPlugin& operator=(const BluetoothLowEnergyPlugin&) = delete;
// Called when a method is called on this plugin's channel from Dart.
void HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &method_call,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
};
} // namespace bluetooth_low_energy
#endif // FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_H_

View File

@ -0,0 +1,12 @@
#include "include/bluetooth_low_energy/bluetooth_low_energy_plugin_c_api.h"
#include <flutter/plugin_registrar_windows.h>
#include "bluetooth_low_energy_plugin.h"
void BluetoothLowEnergyPluginCApiRegisterWithRegistrar(
FlutterDesktopPluginRegistrarRef registrar) {
bluetooth_low_energy::BluetoothLowEnergyPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarManager::GetInstance()
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
}

View File

@ -1,32 +0,0 @@
#ifndef FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_H_
#define FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_H_
#include <flutter/method_channel.h>
#include <flutter/plugin_registrar_windows.h>
#include <memory>
namespace bluetooth_low_energy_windows {
class BluetoothLowEnergyWindowsPlugin : public flutter::Plugin {
public:
static void RegisterWithRegistrar(flutter::PluginRegistrarWindows *registrar);
BluetoothLowEnergyWindowsPlugin();
virtual ~BluetoothLowEnergyWindowsPlugin();
// Disallow copy and assign.
BluetoothLowEnergyWindowsPlugin(const BluetoothLowEnergyWindowsPlugin&) = delete;
BluetoothLowEnergyWindowsPlugin& operator=(const BluetoothLowEnergyWindowsPlugin&) = delete;
private:
// Called when a method is called on this plugin's channel from Dart.
void HandleMethodCall(
const flutter::MethodCall<flutter::EncodableValue> &method_call,
std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
};
} // namespace bluetooth_low_energy_windows
#endif // FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_H_

View File

@ -1,12 +0,0 @@
#include "include/bluetooth_low_energy_windows/bluetooth_low_energy_windows_plugin_c_api.h"
#include <flutter/plugin_registrar_windows.h>
#include "bluetooth_low_energy_windows_plugin.h"
void BluetoothLowEnergyWindowsPluginCApiRegisterWithRegistrar(
FlutterDesktopPluginRegistrarRef registrar) {
bluetooth_low_energy_windows::BluetoothLowEnergyWindowsPlugin::RegisterWithRegistrar(
flutter::PluginRegistrarManager::GetInstance()
->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
}

View File

@ -1,5 +1,5 @@
#ifndef FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_C_API_H_
#define FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_C_API_H_
#ifndef FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_C_API_H_
#define FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_C_API_H_
#include <flutter_plugin_registrar.h>
@ -13,11 +13,11 @@
extern "C" {
#endif
FLUTTER_PLUGIN_EXPORT void BluetoothLowEnergyWindowsPluginCApiRegisterWithRegistrar(
FLUTTER_PLUGIN_EXPORT void BluetoothLowEnergyPluginCApiRegisterWithRegistrar(
FlutterDesktopPluginRegistrarRef registrar);
#if defined(__cplusplus)
} // extern "C"
#endif
#endif // FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_WINDOWS_PLUGIN_C_API_H_
#endif // FLUTTER_PLUGIN_BLUETOOTH_LOW_ENERGY_PLUGIN_C_API_H_

View File

@ -0,0 +1,43 @@
#include <flutter/method_call.h>
#include <flutter/method_result_functions.h>
#include <flutter/standard_method_codec.h>
#include <gtest/gtest.h>
#include <windows.h>
#include <memory>
#include <string>
#include <variant>
#include "bluetooth_low_energy_plugin.h"
namespace bluetooth_low_energy {
namespace test {
namespace {
using flutter::EncodableMap;
using flutter::EncodableValue;
using flutter::MethodCall;
using flutter::MethodResultFunctions;
} // namespace
TEST(BluetoothLowEnergyPlugin, GetPlatformVersion) {
BluetoothLowEnergyPlugin plugin;
// Save the reply value from the success callback.
std::string result_string;
plugin.HandleMethodCall(
MethodCall("getPlatformVersion", std::make_unique<EncodableValue>()),
std::make_unique<MethodResultFunctions<>>(
[&result_string](const EncodableValue* result) {
result_string = std::get<std::string>(*result);
},
nullptr, nullptr));
// Since the exact string varies by host, just ensure that it's a string
// with the expected format.
EXPECT_TRUE(result_string.rfind("Windows ", 0) == 0);
}
} // namespace test
} // namespace bluetooth_low_energy