program NilmMQTT_Agent; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Classes, Data.DB, FireDAC.Comp.Client, FireDAC.Stan.Def, FireDAC.Phys.MySQL, FireDAC.DApt; // TODO: 자신이 사용하는 MQTT 라이브러리로 Uses 절 추가 // uses TMQTTClient; const DB_HOST = '127.0.0.1'; DB_PORT = 3306; DB_USER = 'root'; DB_PASS = 'password'; DB_NAME = 'mmcl_db'; var FDConn: TFDConnection; FDPhysMySQLDriverLink: TFDPhysMySQLDriverLink; // MQTTClient: TMQTTClient; procedure SetupDatabase; begin FDConn := TFDConnection.Create(nil); FDPhysMySQLDriverLink := TFDPhysMySQLDriverLink.Create(nil); FDConn.Params.DriverID := 'MySQL'; FDConn.Params.Database := DB_NAME; FDConn.Params.UserName := DB_USER; FDConn.Params.Password := DB_PASS; FDConn.Params.Add('Server=' + DB_HOST); FDConn.Params.Add('Port=' + IntToStr(DB_PORT)); try FDConn.Connected := True; Writeln('DB Connected successfully.'); except on E: Exception do Writeln('DB Connection Error: ', E.Message); end; end; procedure InsertNilmData(SensorNo: Integer; Power, Current, Volt: Single); var Qry: TFDQuery; begin if not FDConn.Connected then Exit; Qry := TFDQuery.Create(nil); try Qry.Connection := FDConn; // 1. sensor_history_log 에 시계열 이력 적재 Qry.SQL.Text := 'INSERT INTO sensor_history_log (sensor_no, log_time, value_ch1_pwr, value_ch1_current, value_ch1_volt) ' + 'VALUES (:SNo, NOW(), :Pwr, :Cur, :Volt)'; Qry.ParamByName('SNo').AsInteger := SensorNo; Qry.ParamByName('Pwr').AsSingle := Power; Qry.ParamByName('Cur').AsSingle := Current; Qry.ParamByName('Volt').AsSingle := Volt; Qry.ExecSQL; // 2. sensor_info 에 현재 상태 최신화 Qry.SQL.Text := 'UPDATE sensor_info SET update_time = NOW(), ' + 'value_ch1_pwr = :Pwr, value_ch1_current = :Cur, value_ch1_volt = :Volt ' + 'WHERE sensor_no = :SNo AND sensor_typeid = 1'; Qry.ParamByName('SNo').AsInteger := SensorNo; Qry.ParamByName('Pwr').AsSingle := Power; Qry.ParamByName('Cur').AsSingle := Current; Qry.ParamByName('Volt').AsSingle := Volt; Qry.ExecSQL; Writeln('Data inserted for Sensor: ', SensorNo); finally Qry.Free; end; end; // MQTT 메시지 수신 콜백 (예시) procedure OnMqttMessageReceived(Topic, Payload: string); var // 실제 구현 시 System.JSON.TJSONObject 등을 사용하여 Payload 파싱 필요 SensorNo: Integer; Pwr, Cur, Volt: Single; begin Writeln('Received MQTT on Topic: ', Topic); Writeln('Payload: ', Payload); // JSON 파싱을 가정한 더미 변수 매핑 SensorNo := 101; Pwr := 450.5; Cur := 2.04; Volt := 220.0; InsertNilmData(SensorNo, Pwr, Cur, Volt); end; begin try Writeln('Starting NILM MQTT Agent (Delphi)...'); SetupDatabase; // TODO: MQTT 클라이언트 연결 로직 // MQTTClient := TMQTTClient.Create(...); // MQTTClient.Connect; // MQTTClient.Subscribe('nilm/data/#'); // MQTTClient.OnMessage := OnMqttMessageReceived; Writeln('Press ENTER to exit...'); Readln; // 이벤트 루프 대기 except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; if Assigned(FDConn) then FDConn.Free; if Assigned(FDPhysMySQLDriverLink) then FDPhysMySQLDriverLink.Free; end.