12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- using MQTTnet.AspNetCore.Routing;
- using MQTTnet.AspNetCore.Routing.Attributes;
- using System.Text.Json;
- using TEAMModelOS.SDK.Extension;
- namespace HTEX.Complex.Controllers.Mqtt
- {
- /// <summary>
- /// 参考示例 https://www.nuget.org/packages/MQTTnet.AspNetCore.Routing
- /// </summary>
- [MqttController]
- [MqttRoute("[controller]")] // Optional route prefix
- public class MqttWeatherForecastController : MqttBaseController // Inherit from MqttBaseController for convenience functions
- {
- private readonly ILogger<MqttWeatherForecastController> _logger;
- // Controllers have full support for dependency injection just like AspNetCore controllers
- public MqttWeatherForecastController(ILogger<MqttWeatherForecastController> 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;
- }
- }
- }
- }
|