A cross-platform .NET MAUI reference application that drives CSL's CS710S and CS108 handheld UHF RFID readers over Bluetooth Low Energy. The app demonstrates how to consume the CSLibrary2026 managed library from a MAUI codebase — discovering readers, opening a BLE session, running batch inventory and Geiger-style tag location, and persisting per-device reader configuration.
The MAUI app is a single shared codebase across iOS, Android, and Windows. Because the BLE plumbing is fully managed (Plugin.BLE wraps CoreBluetooth, Android BLE APIs, and WinRT), there is no per-platform bridge code for reader I/O — only the standard MAUI platform shells under Platforms/.
CSLRFIDMobile/
├── App.xaml / AppShell.xaml # MAUI app shell, Shell routes
├── MauiProgram.cs # DI container, MAUI builder
├── GlobalUsings.cs
├── View/ # XAML pages (TinyView)
│ ├── PageMainMenu.xaml
│ ├── PageDeviceList.xaml # BLE scan + connect
│ ├── PageInventory.xaml # Batch RFID inventory
│ ├── PageGeigerSearch.xaml # Tag location / Geiger
│ ├── PageGeigerSettings.xaml
│ ├── PageSetting.xaml # Settings landing
│ ├── PageTabbedSetting.xaml
│ ├── PageSettingAntenna.xaml # Per-port power / dwell
│ ├── PageSettingOperation.xaml # Region, profile, mode
│ ├── PageSettingPowerSequencing.xaml # Antenna sequence
│ ├── PageSettingAdministration.xaml # Firmware / OEM
│ └── PageAbout.xaml
├── ViewModel/ # TinyMvvm view models
├── Model/
│ ├── ReaderConfig.cs # CONFIG — persisted per-device
│ └── ClassBattery.cs
├── Services/
│ ├── CSLReaderService.cs # Central reader singleton
│ ├── AppStateService.cs # appconfig.cfg persistence
│ └── Popups/ # Syncfusion popup adapters
├── Helper/ # SoundPlayer, CustomViewCell, …
├── Controls/ # GradientProgressBar, …
├── Behaviour/ # MVVM behaviors
├── Converter/ # Value converters
├── Platforms/ # Android / iOS / Windows shells
└── Resources/ # Fonts, images, raw audio
The RFID stack ships as a single NuGet package — CSLibrary namespace is provided by CSLibrary2026 v2.0.0-beta.2. The app obtains a reader instance through the CSLReaderService singleton:
public HighLevelInterface? reader = new HighLevelInterface();
// …
reader.rfid.StartOperation(CSLibrary.Constants.Operation.TAG_RANGING);HighLevelInterface exposes six subsystems:
| Property | Purpose |
|---|---|
reader.rfid |
EPC Gen 2 inventory, read / write / lock / kill |
reader.barcode |
Onboard 1D / 2D barcode imager (CS108) |
reader.battery |
Voltage polling, charge state |
reader.notification |
Button events, voltage events, error events |
reader.bluetoothIC |
Bluetooth IC firmware version / control |
reader.siliconlabIC |
Silicon Labs MCU firmware / reset |
Plugin.BLE flows in transitively from CSLibrary2026 — do not add a direct package reference for it.
- .NET 10
- .NET MAUI
- CSLibrary2026 — RFID reader API
- Plugin.BLE — cross-platform BLE (transitive)
- CommunityToolkit.Mvvm
- TinyMvvm.Maui
- Syncfusion.Maui.Toolkit
- Plugin.Maui.Audio
- SkiaSharp / SkiaSharp.Views.Maui
- epj.CircularGauge.Maui
- Newtonsoft.Json — config serialization
- Visual Studio 2022 17.12+ or Visual Studio Code with the .NET MAUI extension
- The
maui-iosandmaui-androidworkloads (dotnet workload install maui) - For Windows builds: Windows 10 Build 26100.0 SDK
- A .NET 10 SDK (the repo's
global.jsonpins10.0.100withrollForward: latestMinor) - A CS108 or CS710S RFID reader for runtime testing
- iOS 15.0+ device or simulator / Android API 21+ device or emulator / Windows 10 Build 26100.0
# Clone
git clone https://github.com/cslrfid/CSLRFIDDotNetMaui.git
cd CSLRFIDDotNetMaui
# Install MAUI workloads (one-time)
dotnet workload install maui
# Restore packages
dotnet restore CSLRFID.sln
# Build for a specific platform
dotnet build CSLRFIDMobile/CSLRFIDMobile.csproj -f net10.0-ios
dotnet build CSLRFIDMobile/CSLRFIDMobile.csproj -f net10.0-android36.0
dotnet build CSLRFIDMobile/CSLRFIDMobile.csproj -f net10.0-windows10.0.26100.0 # Windows onlyOpen CSLRFID.sln in Visual Studio and deploy to a device or emulator, or use dotnet build … -t:Run / dotnet build … -t:Install from the CLI.
- Reader Discovery & BLE Connection —
PageDeviceListscans for nearby CS108 / CS710S readers via Plugin.BLE, shows RSSI, and opens a session. Connection state changes are surfaced throughCSLReaderService. - Batch RFID Inventory —
PageInventoryrunsOperation.TAG_RANGINGand aggregates EPCs in real time, with running counters and read-rate display. - Geiger Search (Tag Location) —
PageGeigerSearchissues a targetedOperation.TAG_SEARCHand visualises proximity throughepj.CircularGauge.Mauiplus audible feedback viaPlugin.Maui.Audio. - Per-Antenna Configuration —
PageSettingAntennaconfigures enable / power / dwell for each of the 16 ports; persisted as part of the per-device JSON config. - Region, Profile & Frequency —
PageSettingOperationselects RFID country/region, fixed channel vs. frequency hopping, and link profile (with the CS710S 244→241 adjustment applied automatically). - Power Sequencing —
PageSettingPowerSequencingorders the active antenna cycle. - Administration —
PageSettingAdministrationexposes firmware queries (Silicon Labs MCU, Bluetooth IC) and OEM-level controls. - Battery Monitoring —
reader.batterypolling cadence is configurable viaRFID_BatteryPollingTime; voltage events surface throughCSLReaderService.VoltageEvent. - Per-Device Configuration Persistence — the
CONFIGmodel is serialised to JSON inFileSystem.Current.AppDataDirectory, keyed by device GUID; app-level state (linked reader) lives inappconfig.cfg. - Support for LED Tags — tag-write helpers exposed via
reader.rfidcover LED-tag activation patterns.
- Launch the app and tap Device List from the main menu.
- Tap Scan — nearby readers appear with their advertised name and RSSI.
- Tap a reader entry; the app opens a BLE session and waits for
INITIALIZATION_COMPLETE(up to 20 s). - On success the saved per-device configuration is loaded automatically; you are returned to the main menu with the reader's serial number shown.
- From the main menu tap Inventory.
- Confirm region, profile, and antenna power on the Setting pages if needed.
- Press the reader's hardware trigger or tap Start —
Operation.TAG_RANGINGbegins. - EPCs stream into the list; counters update in real time.
- Press the trigger or tap Stop to halt; the list remains for review and can be cleared.
- From the main menu tap Geiger Search.
- Enter or paste the target EPC, then tap Start.
- Move the reader around the search area — the circular gauge climbs as you near the tag and audio feedback accelerates.
- Tap Stop when done.
- From the main menu tap Setting.
- Use the tabbed pages to edit antenna power / dwell, operation mode, power sequencing, or administration parameters.
- Saving any page persists the change to the device's JSON config and pushes the value to the reader on the next operation.
Released under the MIT License. Copyright © Convergence Systems Limited.

