using MQTTnet.AspNetCore.Routing; using MQTTnet.AspNetCore.Routing.Attributes; using System.Text.Json; using TEAMModelOS.SDK.Extension; namespace HTEX.Complex.Controllers.Mqtt { /// /// 参考示例 https://www.nuget.org/packages/MQTTnet.AspNetCore.Routing /// [MqttController] [MqttRoute("[controller]")] // Optional route prefix public class MqttWeatherForecastController : MqttBaseController // Inherit from MqttBaseController for convenience functions { private readonly ILogger _logger; // Controllers have full support for dependency injection just like AspNetCore controllers public MqttWeatherForecastController(ILogger logger) { _logger = logger; } // Supports template routing with typed constraints just like AspNetCore // Action routes compose together with the route prefix on the controller level [MqttRoute("{zipCode:int}/temperature")] public Task WeatherReport(int zipCode) { // We have access to the MqttContext if (zipCode != 90210) { MqttContext.CloseConnection = true; } // We have access to the raw message var temperature = BitConverter.ToDouble(Message.Payload); _logger.LogInformation($"It's {temperature} degrees in Hollywood"); // Example validation if (temperature <= 0 || temperature >= 130) { return BadMessage(); } return Ok(); } // Supports binding JSON message payload to parameters with [FromPayload] attribute, // Similar to ASP.NET Core [FromBody] [MqttRoute("{deviceName}/telemetry")] public async Task NewTelemetry(string deviceName, [FromPayload] JsonElement telemetry) { // here telemetry is JSON-deserialized from message payload to type Telemetry telemetry.ToJsonString(); bool success =true; if (success) { await Ok(); return; } else { await BadMessage(); return; } } } }