MyOCPP
What is MyOCPP?
MyOCPP is a complete electric vehicle charging management platform that speaks the Open Charge Point Protocol (OCPP). It connects physical wallboxes and charging stations to a central management system and exposes everything through two frontends: a Blazor Server web portal for full administration and a .NET MAUI mobile app for on-the-go charging control.
The system handles the entire lifecycle — stations boot and authenticate via OCPP over WebSocket, the backend processes every protocol message and persists transaction data, users control sessions from their phone or browser in real time, and scheduled charging kicks off automatically without any manual action.
OCPP 1.6J (JSON) and OCPP 2.0 are both supported. A single backend handles both protocol versions in parallel.
Tech Stack
| Layer | Choice |
|---|---|
| Backend API | .NET 10, ASP.NET Core, WebSockets |
| Web UI | Blazor Server, MudBlazor 9.3, ApexCharts |
| Mobile | .NET MAUI (Android, iOS, macOS, Windows) |
| Architecture | Clean Architecture + CQRS (MediatR) |
| Database | SQL Server, Entity Framework Core |
| Real-time | SignalR (hub → web and mobile clients) |
| Message Queue | RabbitMQ (OCPP gateway ↔ web app) |
| Auth | ASP.NET Identity + JWT refresh tokens |
| CI/CD | Azure Pipelines → Azure Container Registry |
| Versioning | Nerdbank.GitVersioning (git-derived semver) |
Architecture
The solution is split into four independently deployable services:
Altbrot.Mobility.Api — OCPP WebSocket gateway
ws://host:8081/OCPP/{stationId}
Altbrot.Mobility.Web.App — Blazor Server management portal
http://host:8080
Altbrot.Mobility.Mobile.Api — REST + JWT API for the mobile client
Altbrot.Mobility.Mobile.App — .NET MAUI cross-platform mobile appThe OCPP gateway and the web portal are decoupled via RabbitMQ. Inbound messages from charging stations arrive on the api.csms / api.evse queues; outbound commands leave on webapp.csms / webapp.evse. Neither service needs a direct connection to the other.
Real-time updates reach browser and mobile clients via SignalR. When a station sends a StatusNotification or a transaction event, the new connector state is broadcast to all connected clients immediately.
Internally all four services follow Clean Architecture. The Application layer is composed entirely of CQRS request types (*Command, *Query) dispatched through a MediatR pipeline with three cross-cutting behaviours: FluentValidation, authorization checks, and structured exception handling.