MMCL/agents/delphi_nilm_agent/__history/NilmMQTT_Agent.dpr.~1~
2026-09-04 11:24:42 +09:00

129 lines
3.3 KiB
Plaintext

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.