129 lines
3.3 KiB
Plaintext
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.
|