#nullable enable using System; using UVC.Data.Core; namespace UVC.Data.Mqtt { /// /// MQTT 파이프라인 정보를 관리하는 클래스입니다. /// MQTT 토픽 구독, 메시지 핸들링 및 데이터 매핑에 필요한 설정을 제공합니다. /// /// /// 이 클래스는 빌더 패턴을 사용하여 MQTT 구독 설정을 유연하게 구성할 수 있게 합니다. /// 각 설정 메서드는 체이닝을 통해 파이프라인을 정의할 수 있도록 합니다. /// /// /// /// var dataMask = new DataMask(); /// dataMask["deviceId"] = ""; /// dataMask["temperature"] = 0.0; /// dataMask["humidity"] = 0.0; /// dataMask["timestamp"] = DateTime.Now; /// /// var config = new MqttSubscriptionConfig("device/status") /// .setDataMapper(new DataMapper(dataMask)) /// .setHandler(data => Console.WriteLine(data)); /// /// public class MqttSubscriptionConfig { private string _topic; // MQTT 토픽 private Action? _handler = null; // 메시지 핸들러 private DataMapper? _dataMapper = null; // 데이터 매퍼 private bool _updatedDataOnly = false; // 업데이트된 데이터만 받을 여부 /// /// MQTT 메시지 데이터의 유효성을 검사하는 데 사용되는 검사기입니다. /// 메시지가 특정 조건이나 규칙을 만족하는지 확인하는 데 활용됩니다. /// /// /// 데이터 유효성 검사는 메시지를 필터링하여 유효한 데이터만 처리하도록 합니다. /// 예를 들어, 필수 필드가 있는지, 값의 범위가 적절한지 등을 검사할 수 있습니다. /// null인 경우 유효성 검사를 수행하지 않습니다. /// /// /// /// // DataValidator 생성 및 규칙 추가 /// var _validator = new DataValidator(); /// /// // 온도 값이 -50°C ~ 100°C 범위 내에 있는지 검사 /// _validator.AddValidator("temperature", value => /// value is double temp && temp >= -50 && temp <= 100); /// /// // 습도 값이 0% ~ 100% 범위 내에 있는지 검사 /// validator.AddValidator("humidity", value => /// value is double humidity && humidity >= 0 && humidity <= 100); /// /// // 파이프라인에 validator 설정 /// var config = new MqttSubscriptionConfig("sensors/readings") /// .setDataMapper(dataMapper) /// .setValidator(validator) /// .setHandler(data => ProcessValidSensorData(data)); /// /// private DataValidator? _validator; /// /// MQTT 토픽 /// public string Topic => _topic; /// /// 메시지 핸들러 /// public Action? Handler => _handler; /// /// 데이터 매퍼 /// public DataMapper? DataMapper => _dataMapper; /// /// 인스턴스를 사용하여 데이터 유효성을 검사합니다. /// public DataValidator? Validator => _validator; /// /// 업데이트된 데이터만 받을 여부 (true로 설정하면, 데이터가 변경된 경우에만 핸들러가 호출됩니다) /// public bool UpdatedDataOnly => _updatedDataOnly; /// /// MqttSubscriptionConfig 클래스의 새 인스턴스를 초기화합니다. /// /// 구독할 MQTT 토픽 /// 변경된 데이터만 처리할지 여부 (기본값: true) /// /// updatedDataOnly가 true인 경우, 이전 데이터와 동일한 메시지는 핸들러에 전달되지 않습니다. /// 이는 불필요한 데이터 처리를 방지하고 성능을 향상시킵니다. /// public MqttSubscriptionConfig(string topic, bool updatedDataOnly = true) { _topic = topic; _updatedDataOnly = updatedDataOnly; } /// /// MQTT 메시지를 수신했을 때 호출될 핸들러를 설정합니다. /// /// 메시지 데이터를 처리할 콜백 함수 /// 현재 MqttSubscriptionConfig 인스턴스 (메서드 체이닝용) /// /// 핸들러는 메시지가 수신되고 DataMapper에 의해 변환된 후 호출됩니다. /// UpdatedDataOnly 속성이 true인 경우, 데이터가 변경된 경우에만 호출됩니다. /// public MqttSubscriptionConfig setHandler(Action handler) { _handler = handler; return this; } /// /// MQTT 메시지 데이터를 처리할 데이터 매퍼를 설정합니다. /// /// 사용할 데이터 매퍼 객체 /// 현재 MqttSubscriptionConfig 인스턴스 (메서드 체이닝용) /// /// 데이터 매퍼는 수신된 MQTT 메시지(JSON 형식)를 IDataObject로 변환하는 역할을 합니다. /// DataMask를 사용하여 특정 필드에 대한 타입 변환 및 필드 이름 매핑을 처리할 수 있습니다. /// /// /// /// // DataMask를 사용한 데이터 매퍼 설정 /// var dataMask = new DataMask(); /// dataMask["temperature"] = 0.0; // 실수 타입 지정 /// dataMask["humidity"] = 0; // 정수 타입 지정 /// dataMask["timestamp"] = ""; // 문자열 타입 지정 /// /// var pipelineInfo = new MqttSubscriptionConfig("sensor/data") /// .setDataMapper(new DataMapper(dataMask)) /// .setHandler(data => ProcessSensorData(data)); /// /// public MqttSubscriptionConfig setDataMapper(DataMapper dataMapper) { _dataMapper = dataMapper; return this; } /// /// MQTT 메시지 데이터의 유효성을 검사하는 데 사용할 Validator를 설정합니다. /// /// 데이터 유효성 검사기 /// 현재 MqttSubscriptionConfig 인스턴스 (메서드 체이닝용) /// /// 유효성 검사기는 수신된 MQTT 메시지 데이터가 유효한지 확인하는 역할을 합니다. /// 데이터가 특정 조건을 만족하는지 확인하고, 유효하지 않은 메시지는 필터링할 수 있습니다. /// 파이프라인 내에서 DataMapper가 데이터를 변환한 후, Validator가 유효성을 검사하고, /// 유효한 데이터만 Handler에게 전달됩니다. /// /// /// /// // DataValidator 생성 및 설정 /// var _validator = new DataValidator(); /// /// // 온도 값이 -50°C ~ 100°C 범위 내에 있는지 검사 /// _validator.AddValidator("temperature", value => { /// if (value is double temp) /// return temp >= -50 && temp <= 100; /// return false; /// }); /// /// // deviceId가 null이 아니고 비어있지 않은지 검사 /// validator.AddValidator("deviceId", value => /// value is string id && !string.IsNullOrEmpty(id)); /// /// // Validator를 파이프라인에 설정 /// var pipelineInfo = new MqttSubscriptionConfig("sensors/data") /// .setDataMapper(dataMapper) /// .setValidator(_validator) /// .setHandler(data => { /// // 여기서 처리되는 데이터는 모두 유효성 검사를 통과한 데이터 /// Console.WriteLine($"유효한 센서 데이터: {data["deviceId"]} - {data["temperature"]}°C"); /// }); /// /// public MqttSubscriptionConfig setValidator(DataValidator validator) { this._validator = validator; return this; } } }