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;
}
}
}
}