MAUI로 BluetoothLE 기기를 Scan 하고 통신을 하기 위해서 몇가지 라이브러기가 존재한다.
초기에는 Plugin.BLE로 개발을 했다.
그런데 Scan을 하고 Connect 후에 Data를 보내고 받을 때 너무 오래 걸리는 것이다. 3~5초까지 지연이 발생했다.
해결을 해보려고 검색과 AI에 질문도 해봤지만 Plugin.BLE 라이브러리로는 해결책이 없는 것으로 결론지었다.
그래서 알아본 것이 Shiny.NET이다.
라이브러리를 교체하지 않고 속도를 개선하는 방법에는 아래와 같이 제안을 받았다.
개선 방법 요약 및 추천 순서
| 방법 | 장점 | 단점/주의사항 | 구현 난이도 |
| Write Without Response / Notification | 속도 향상 효과 가장 큼 (필수) | 데이터 유실 가능성 (별도 검증 로직 필요) | 중 |
| MTU 크기 증가 | 한 번에 많은 데이터 전송, 오버헤드 감소 | 양쪽 기기 모두 지원해야 함 | 하 |
| 연결 간격 최소화 | 지연 시간 감소, 반응성 향상 | 배터리 소모 증가 | 하 |
| 2M PHY 사용 | 물리적 전송 속도 2배 증가 | 통신 거리 감소, BT 5.0 이상 지원 필요 | 하 |
| 데이터 압축 | 전송할 데이터 총량 감소 | CPU 사용량 증가, 데이터 종류에 따라 효율 다름 | 중 |
먼저 Shiny.NET 으로 테스트 코드를 제작했다. AI의 도움을 많이 받았다.
사용한 SW와 NuGet 정보이다.
1. MSVS2022 .net9.0
2. NuGet
CommunityToolkit.Mvvm 8.4.0
Microsoft.Maui.Controls 9.0.110
Shiny 2.7.3
Shiny.BluetoothLE 3.3.4
Shiny.BluetoothLE.Hosting 3.3.4
Shiny.Core 3.3.4
Shiny.Hosting.Maui 3.3.4
테스트로 제작한 앱은 다음과 같은 기능을 갖게 됩니다.
- 스캔 버튼: 주변 BLE 장치를 검색합니다.
- 장치 목록: 검색된 장치들을 리스트로 보여줍니다.
- 연결/해제: 리스트에서 장치를 선택하여 연결하거나 연결을 해제합니다.
- 데이터 전송: 연결된 장치에 텍스트를 입력하고 바이트 배열로 변환하여 전송합니다.
- 데이터 수신: 장치로부터 받은 데이터(Notification)를 파싱하여 화면에 표시합니다.
![]() |
![]() |
1단계: 프로젝트 생성 및 Shiny.NET 패키지 설치
- Visual Studio에서 새로운 .NET MAUI 앱 프로젝트를 생성합니다.
- NuGet 패키지 관리자를 열고 다음 패키지들을 설치합니다.
- Shiny.Core
- Shiny.BluetoothLE
- CommunityToolkit.Mvvm (MVVM 패턴을 쉽게 구현하기 위해 사용)
2단계: Android 권한 설정
Android에서 블루투스 기능을 사용하려면 AndroidManifest.xml 파일에 권한을 추가해야 합니다.
Platforms/Android/AndroidManifest.xml 파일을 열고 <application> 태그 위에 다음 권한들을 추가하세요.
<!-- Android 12 (API 31) 이상에서 필요한 권한 -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Android 11 (API 30) 이하에서 필요한 권한 -->
<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />
<!-- 모든 버전에서 필요할 수 있는 기능 명시 -->
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />
3단계: Shiny.NET 초기 설정
Shiny를 사용하기 위해 MauiProgram.cs 파일을 열고 CreateMauiApp 메서드를 다음과 같이 수정합니다.
using Microsoft.Extensions.Logging;
using Shiny;
namespace ShinyClient
{
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder
.UseMauiApp<App>()
.UseShiny()
.ConfigureFonts(fonts =>
{
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
});
// Shiny 서비스들을 등록합니다.
builder.Services.AddBluetoothLE(); //BluetoothLE 서비스를 등록합니다.
#if DEBUG
builder.Logging.AddDebug();
#endif
builder.Services.AddSingleton<MainPage>();
builder.Services.AddSingleton<ViewModels.MainViewModel>();
return builder.Build();
}
}
}
나머지 부분은 업로드한 소스를 참고 하시기 바랍니다.
Shiny.NET 페이지를 보고 하셔도 되지만 쉽지 않았습니다. 그리고 sample 코드도 ReactiveUI 및 기타 package를 많이 사용해서 보기 힘들더군요.
제가 올린 소스가 개발 초보자에게 도움이 되길 바랍니다.
https://shinylib.net/client/hosting/maui/
MAUI
shinylib.net
<주의> 연결을 하실 때에는 아래 부분을 수정하셔야 합니다.
// TODO: 실제 장치의 Service UUID와 Characteristic UUID로 변경해야 합니다. <주의>
private const string ServiceUuid = "0000ffe0-0000-1000-8000-00805f9b34fb";
private const string WriteCharacteristicUuid = "0000ffe1-0000-1000-8000-00805f9b34fb";
private const string NotifyCharacteristicUuid = "0000ffe1-0000-1000-8000-00805f9b34fb";
임시로 올린 Uuid이니 혼동이 없으시기 바랍니다.
<첨부파일>
'스마트 장치 개발' 카테고리의 다른 글
| MAUI TabbedPage와 Shell 사용 비교 (0) | 2025.10.16 |
|---|---|
| MAUI BTLE InTheHand Client Sample Code (0) | 2025.10.14 |
| Visual Studio Code 개발 편의성 Font 설정 (0) | 2025.09.19 |
| .NET Compact Framework How-to Topics (1) | 2009.12.16 |
| file dialog for C# (0) | 2009.12.16 |

