Mqtt-Broker is an MQTT broker built on top of MQTTnet with a focus on IoT device management and Clean Architecture. It provides:
- Per-device subscriptions (
event/{chipId}) - One-to-one and group event delivery
- Modular event handling strategies
- Database as source-of-truth for devices and groups
- Seamless .NET integration with DI, middleware, and REST APIs
- Presentation: Controllers, middleware, REST endpoints.
- Application: Use cases, application services, AutoMapper profiles.
- Domain: Core business entities and logic.
- Infrastructure: MQTT, Redis, logging, etc.
- Persistence: Repositories, data contexts, UnitOfWork.
- Shared: DTOs, requests/responses, enums, utilities.
- Extensions: Configuration and service wiring helpers.
- Client Connection: MQTT service connects to the broker and subscribes to
event/{chipId}for managed devices. - Device Registration: Device sends a
Statusevent on connection. Backend registers or updates the device in the database. - Individual Event Delivery: Backend publishes to
event/{chipId}. - Group Event Delivery: Backend queries DB for group members and publishes individually. Redis serves as cache/helper.
- StatusStrategy: Handles device registration and status updates.
- TelemetryStrategy: Processes telemetry data from devices.
- ErrorUpdateFirmwareDeviceStrategy: Logs errors during firmware updates.
MqttRequest – from device to backend:
{
"Device": { "ChipId": "CHIP-12345", "Name": "Sensor-01", "FirmwareVersion": "1.2.3" },
"Timestamp": "2025-12-03T12:00:00Z",
"Details": { "temperature": 22.4 }
}MqttResponse – from backend to device:
{
"EventType": "UPDATE_FIRMWARE",
"Timestamp": "2025-12-03T12:05:00Z",
"Details": { "version": "2.0.0", "url": "https://example.com/firmware.bin" }
}DeviceDto fields:
Id,ChipId,ChipType,Name,Code,MacAddress,FirmwareVersion,Status,GroupName,GroupDescription,Description,ErrMessage
These structures support device status updates (MqttRequest) and backend commands/events (MqttResponse).
Two Redis instances recommended:
redis-aof– persistent (appendonly yes)redis-noaof– in-memory (appendonly no)
Docker Run Example:
docker run -d --name redis-aof -p 6379:6379 redis:7 redis-server --appendonly yes
docker run -d --name redis-noaof -p 6380:6380 redis:7 redis-server --appendonly noDocker Compose Example:
version: '3.8'
services:
redis-aof:
image: redis:7
command: ["redis-server", "--appendonly", "yes"]
ports: ["6379:6379"]
redis-noaof:
image: redis:7
command: ["redis-server", "--appendonly", "no"]
ports: ["6380:6380"]dotnet restore "Mqtt-Broker.sln"
dotnet build "Mqtt-Broker.sln" -c Debug
# Start Redis instances
docker-compose -f docker-compose.redis.yml up -d
# Run application
dotnet run --project "Mqtt-Broker\Mqtt-Broker.csproj" -c Debug- Device topic:
event/{chipId} - Group topic: Optional
group/{groupId} - Event type mapping: Last segment of topic →
MqttEventType(case-insensitive)
Registered Event Types:
Status→/statusTelemetry→/telemetryErrorUpdateFirmwareDevice→/ErrorUpdateFirmwareDevice
Status Event Flow:
- Device subscribes to
event/{chipId} - Publishes
Statusmessage → backend maps topic segment → routes toStatusStrategy StatusStrategycreates/updates device in DB and marks as online
- Use MQTTOTA as reference for OTA updates.
- Device subscribes to
event/{chipId}and optionallygroup/{groupName}. - Sends Status events to register in backend.
- Handles incoming
MqttResponse<TDetails>messages for firmware updates, commands, etc.
-
API keys for MQTT endpoints in
appsettings.json -
Middleware handles:
- Exception handling
- Logging
- CORS
- API key validation
- Standard response wrapper (
BaseResponse)
BaseResponse:
Message– stringStatusCode– HTTP statusDetails– optional payloadPagination– optional metadata
- Keep API keys secret; rotate regularly
- Production: prefer OAuth2/JWT over static keys
- Email:
chinausto@gmail.com - Main project file:
Mqtt-Broker/Mqtt-Broker.csproj - Config:
appsettings.json/appsettings.Development.json