MqttWeatherForecastController.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using MQTTnet.AspNetCore.Routing;
  2. using MQTTnet.AspNetCore.Routing.Attributes;
  3. using System.Text.Json;
  4. using TEAMModelOS.SDK.Extension;
  5. namespace HTEX.Complex.Controllers.Mqtt
  6. {
  7. /// <summary>
  8. /// 参考示例 https://www.nuget.org/packages/MQTTnet.AspNetCore.Routing
  9. /// </summary>
  10. [MqttController]
  11. [MqttRoute("[controller]")] // Optional route prefix
  12. public class MqttWeatherForecastController : MqttBaseController // Inherit from MqttBaseController for convenience functions
  13. {
  14. private readonly ILogger<MqttWeatherForecastController> _logger;
  15. // Controllers have full support for dependency injection just like AspNetCore controllers
  16. public MqttWeatherForecastController(ILogger<MqttWeatherForecastController> logger)
  17. {
  18. _logger = logger;
  19. }
  20. // Supports template routing with typed constraints just like AspNetCore
  21. // Action routes compose together with the route prefix on the controller level
  22. [MqttRoute("{zipCode:int}/temperature")]
  23. public Task WeatherReport(int zipCode)
  24. {
  25. // We have access to the MqttContext
  26. if (zipCode != 90210) { MqttContext.CloseConnection = true; }
  27. // We have access to the raw message
  28. var temperature = BitConverter.ToDouble(Message.Payload);
  29. _logger.LogInformation($"It's {temperature} degrees in Hollywood");
  30. // Example validation
  31. if (temperature <= 0 || temperature >= 130)
  32. {
  33. return BadMessage();
  34. }
  35. return Ok();
  36. }
  37. // Supports binding JSON message payload to parameters with [FromPayload] attribute,
  38. // Similar to ASP.NET Core [FromBody]
  39. [MqttRoute("{deviceName}/telemetry")]
  40. public async Task NewTelemetry(string deviceName, [FromPayload] JsonElement telemetry)
  41. {
  42. // here telemetry is JSON-deserialized from message payload to type Telemetry
  43. telemetry.ToJsonString();
  44. bool success =true;
  45. if (success)
  46. {
  47. await Ok();
  48. return;
  49. }
  50. else
  51. {
  52. await BadMessage();
  53. return;
  54. }
  55. }
  56. }
  57. }