#include "MyIec61850Server.h" static int running = 0; void sigint_handler(int signalId) { running = 0; } using namespace MyIec61850; MyIec61850Server::MyIec61850Server(int port) : port(port), iedServer(nullptr), model(nullptr), lDevice1(nullptr), lln0(nullptr), ttmp1(nullptr), temperatureValue(nullptr), temperatureTimestamp(nullptr), hhum1(nullptr), humidityValue(nullptr), humidityTimestamp(nullptr), dataSet(nullptr) { setupDataModel(); } MyIec61850Server::~MyIec61850Server() { stop(); if (model) { IedModel_destroy(model); } } void MyIec61850Server::setupDataModel() { model = IedModel_create("TemperatureHumiditySensor"); lDevice1 = LogicalDevice_create("SENSORS", model); lln0 = LogicalNode_create("LLN0", lDevice1); /* Create a Temperature Sensor LN */ ttmp1 = LogicalNode_create("TTMP1", lDevice1); DataObject* ttmp1_tmpsv = CDC_SAV_create("TmpSv", (ModelNode*) ttmp1, 0, false); temperatureValue = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "instMag.f"); temperatureTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) ttmp1_tmpsv, "t"); /* Create a Humidity Sensor LN */ hhum1 = LogicalNode_create("HHUM1", lDevice1); DataObject* hhum1_humsv = CDC_SAV_create("HumSv", (ModelNode*) hhum1, 0, false); humidityValue = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "instMag.f"); humidityTimestamp = (DataAttribute*) ModelNode_getChild((ModelNode*) hhum1_humsv, "t"); /* Create DataSet for reporting */ dataSet = DataSet_create("sensorData", lln0); DataSetEntry_create(dataSet, "TTMP1$MX$TmpSv$instMag$f", -1, NULL); DataSetEntry_create(dataSet, "HHUM1$MX$HumSv$instMag$f", -1, NULL); /* Create Report Control Block */ uint8_t rptOptions = RPT_OPT_SEQ_NUM | RPT_OPT_TIME_STAMP | RPT_OPT_REASON_FOR_INCLUSION; ReportControlBlock_create("sensorReport", lln0, "sensorReport", false, NULL, 1, TRG_OPT_DATA_CHANGED, rptOptions, 50, 0); } void MyIec61850Server::start() { iedServer = IedServer_create(model); // 确保使用 sIedServer* /* MMS server will be instructed to start listening to client connections. */ IedServer_start(iedServer, port); if (!IedServer_isRunning(iedServer)) { // 使用 IedServer_isRunning 检查服务器状态 printf("Starting server failed! Exit.\n"); stop(); exit(-1); } } void MyIec61850Server::stop() { if (iedServer != nullptr) { IedServer_stop(iedServer); IedServer_destroy(iedServer); // 传递 sIedServer* 类型的参数 iedServer = nullptr; // 手动将指针置为 nullptr } } void MyIec61850Server::run() { running = 1; signal(SIGINT, sigint_handler); float temperature = 25.0f; // Initial temperature value float humidity = 50.0f; // Initial humidity value while (running) { IedServer_lockDataModel(iedServer); /* Update temperature and humidity values */ IedServer_updateUTCTimeAttributeValue(iedServer, temperatureTimestamp, Hal_getTimeInMs()); IedServer_updateFloatAttributeValue(iedServer, temperatureValue, temperature); IedServer_updateUTCTimeAttributeValue(iedServer, humidityTimestamp, Hal_getTimeInMs()); IedServer_updateFloatAttributeValue(iedServer, humidityValue, humidity); IedServer_unlockDataModel(iedServer); /* Simulate periodic updates */ temperature += 0.1f; humidity += 0.1f; Thread_sleep(1000); // Sleep for 1 second } }