- added missing examples for R-SMV/R-GOOSE/SNTP
parent
90372ced72
commit
99bdd4e61c
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
set(r_goose_publisher_example_SRCS
|
||||||
|
r_goose_publisher_example.c
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(MSVC)
|
||||||
|
|
||||||
|
set_source_files_properties(${r_goose_publisher_example_SRCS}
|
||||||
|
PROPERTIES LANGUAGE CXX)
|
||||||
|
ENDIF(MSVC)
|
||||||
|
|
||||||
|
add_executable(r_goose_publisher_example
|
||||||
|
${r_goose_publisher_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_goose_publisher_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* r_goose_publisher_example.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include "mms_value.h"
|
||||||
|
#include "goose_publisher.h"
|
||||||
|
#include "hal_thread.h"
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigint_handler(int signalId)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* has to be executed as root! */
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char* dstAddress;
|
||||||
|
|
||||||
|
if (argc > 1)
|
||||||
|
dstAddress = argv[1];
|
||||||
|
else
|
||||||
|
dstAddress = "230.0.10.11";
|
||||||
|
|
||||||
|
printf("Using destination address %s\n", dstAddress);
|
||||||
|
|
||||||
|
RSession rSession = RSession_create();
|
||||||
|
|
||||||
|
if (rSession) {
|
||||||
|
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
|
RSession_setRemoteAddress(rSession, dstAddress, 102);
|
||||||
|
|
||||||
|
LinkedList dataSetValues = LinkedList_create();
|
||||||
|
|
||||||
|
int intVal = 1234;
|
||||||
|
|
||||||
|
MmsValue* mmsIntVal = MmsValue_newIntegerFromInt32(intVal);
|
||||||
|
MmsValue* mmsTimeValue = MmsValue_newBinaryTime(false);
|
||||||
|
MmsValue_setBinaryTime(mmsTimeValue, Hal_getTimeInMs());
|
||||||
|
|
||||||
|
LinkedList_add(dataSetValues, mmsIntVal);
|
||||||
|
LinkedList_add(dataSetValues, mmsTimeValue);
|
||||||
|
LinkedList_add(dataSetValues, MmsValue_newIntegerFromInt32(5678));
|
||||||
|
|
||||||
|
GoosePublisher publisher = GoosePublisher_createRemote(rSession, 0x4001);
|
||||||
|
|
||||||
|
//char* key = "0123456789ABCDEF";
|
||||||
|
char* key = "0123456789ABCDEF";
|
||||||
|
|
||||||
|
RSession_addKey(rSession, 1, key, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
RSession_setActiveKey(rSession, 1);
|
||||||
|
|
||||||
|
if (publisher) {
|
||||||
|
GoosePublisher_setGoCbRef(publisher, "simpleIOGenericIO/LLN0$GO$gcbAnalogValues");
|
||||||
|
GoosePublisher_setConfRev(publisher, 1);
|
||||||
|
GoosePublisher_setDataSetRef(publisher, "simpleIOGenericIO/LLN0$AnalogValues");
|
||||||
|
GoosePublisher_setTimeAllowedToLive(publisher, 500);
|
||||||
|
|
||||||
|
while (running) {
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 6; i++) {
|
||||||
|
Thread_sleep(200);
|
||||||
|
|
||||||
|
if (i == 5) {
|
||||||
|
MmsValue_setInt32(mmsIntVal, ++intVal);
|
||||||
|
MmsValue_setBinaryTime(mmsTimeValue, Hal_getTimeInMs());
|
||||||
|
GoosePublisher_increaseStNum(publisher);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GoosePublisher_publish(publisher, dataSetValues) == -1) {
|
||||||
|
printf("Error sending message!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (running == false)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GoosePublisher_destroy(publisher);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to create GOOSE publisher. Reason can be that the Ethernet interface doesn't exist or root permission are required.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
LinkedList_destroyDeep(dataSetValues, (LinkedListValueDeleteFunction) MmsValue_delete);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
set(r_goose_subscriber_example_SRCS
|
||||||
|
r_goose_subscriber_example.c
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(MSVC)
|
||||||
|
|
||||||
|
set_source_files_properties(${r_goose_subscriber_example_SRCS}
|
||||||
|
PROPERTIES LANGUAGE CXX)
|
||||||
|
ENDIF(MSVC)
|
||||||
|
|
||||||
|
add_executable(r_goose_subscriber_example
|
||||||
|
${r_goose_subscriber_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_goose_subscriber_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
|||||||
|
/*
|
||||||
|
* goose_subscriber_example.c
|
||||||
|
*
|
||||||
|
* This is an example for a standalone GOOSE subscriber
|
||||||
|
*
|
||||||
|
* Has to be started as root in Linux.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "goose_receiver.h"
|
||||||
|
#include "goose_subscriber.h"
|
||||||
|
#include "hal_thread.h"
|
||||||
|
#include "linked_list.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigint_handler(int signalId)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gooseListener(GooseSubscriber subscriber, void* parameter)
|
||||||
|
{
|
||||||
|
printf("GOOSE event:\n");
|
||||||
|
printf(" stNum: %u sqNum: %u\n", GooseSubscriber_getStNum(subscriber),
|
||||||
|
GooseSubscriber_getSqNum(subscriber));
|
||||||
|
printf(" timeToLive: %u\n", GooseSubscriber_getTimeAllowedToLive(subscriber));
|
||||||
|
|
||||||
|
uint64_t timestamp = GooseSubscriber_getTimestamp(subscriber);
|
||||||
|
|
||||||
|
printf(" timestamp: %u.%u\n", (uint32_t) (timestamp / 1000), (uint32_t) (timestamp % 1000));
|
||||||
|
printf(" message is %s\n", GooseSubscriber_isValid(subscriber) ? "valid" : "INVALID");
|
||||||
|
|
||||||
|
MmsValue* values = GooseSubscriber_getDataSetValues(subscriber);
|
||||||
|
|
||||||
|
char buffer[1024];
|
||||||
|
|
||||||
|
MmsValue_printToBuffer(values, buffer, 1024);
|
||||||
|
|
||||||
|
printf(" allData: %s\n", buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
RSession sessionP = RSession_create();
|
||||||
|
|
||||||
|
if (sessionP) {
|
||||||
|
|
||||||
|
RSession_setRemoteAddress(sessionP, "127.0.0.1", 102);
|
||||||
|
RSession_setLocalAddress(sessionP, "0.0.0.0", 102);
|
||||||
|
char* key = "0123456789ABCDEF";
|
||||||
|
|
||||||
|
RSession_addKey(sessionP, 1, key, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
|
||||||
|
RSession_addMulticastGroup(sessionP, "230.0.10.11");
|
||||||
|
|
||||||
|
GooseReceiver receiver = GooseReceiver_createRemote(sessionP);
|
||||||
|
|
||||||
|
GooseSubscriber subscriber = GooseSubscriber_create("simpleIOGenericIO/LLN0$GO$gcbAnalogValues", NULL);
|
||||||
|
|
||||||
|
uint8_t dstMac[6] = {0x01,0x0c,0xcd,0x01,0x00,0x01};
|
||||||
|
GooseSubscriber_setDstMac(subscriber, dstMac);
|
||||||
|
GooseSubscriber_setAppId(subscriber, 1000);
|
||||||
|
|
||||||
|
GooseSubscriber_setListener(subscriber, gooseListener, NULL);
|
||||||
|
|
||||||
|
GooseReceiver_addSubscriber(receiver, subscriber);
|
||||||
|
|
||||||
|
GooseReceiver_start(receiver);
|
||||||
|
|
||||||
|
if (GooseReceiver_isRunning(receiver)) {
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
|
while (running) {
|
||||||
|
Thread_sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to start GOOSE subscriber. Reason can be that the Ethernet interface doesn't exist or root permission are required.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
GooseReceiver_stop(receiver);
|
||||||
|
|
||||||
|
GooseReceiver_destroy(receiver);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
set(r_sv_publisher_example_SRCS
|
||||||
|
r_sv_publisher_example.c
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(WIN32)
|
||||||
|
|
||||||
|
set_source_files_properties(${r_sv_publisher_example_SRCS}
|
||||||
|
PROPERTIES LANGUAGE CXX)
|
||||||
|
add_executable(r_sv_publisher_example
|
||||||
|
${r_sv_publisher_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_sv_publisher_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ELSE(WIN32)
|
||||||
|
|
||||||
|
add_executable(r_sv_publisher_example
|
||||||
|
${r_sv_publisher_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_sv_publisher_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDIF(WIN32)
|
@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* r-sv-example.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include "sv_publisher.h"
|
||||||
|
#include "hal_thread.h"
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sigint_handler(int signalId)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
RSession rSession = RSession_create();
|
||||||
|
|
||||||
|
if (rSession) {
|
||||||
|
|
||||||
|
//RSession_setRemoteAddress(sessionP, "192.168.56.101", 102);
|
||||||
|
//RSession_setRemoteAddress(rSession, "192.168.2.227", 102);
|
||||||
|
RSession_setRemoteAddress(rSession, "230.0.10.10", 102);
|
||||||
|
|
||||||
|
SVPublisher svPublisher = SVPublisher_createRemote(rSession, 0x4000);
|
||||||
|
|
||||||
|
uint32_t activeKeyId = 1;
|
||||||
|
uint64_t nextKeyChangeTime = Hal_getTimeInMs() + 5000;
|
||||||
|
|
||||||
|
if (svPublisher) {
|
||||||
|
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
|
char* key1 = "0123456789ABCDEF";
|
||||||
|
char* key2 = "FEDCBA9876543210";
|
||||||
|
|
||||||
|
RSession_addKey(rSession, 1, key1, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
RSession_addKey(rSession, 2, key2, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
|
||||||
|
RSession_setActiveKey(rSession, activeKeyId);
|
||||||
|
|
||||||
|
SVPublisher_ASDU asdu1 = SVPublisher_addASDU(svPublisher, "svpub1", NULL, 1);
|
||||||
|
|
||||||
|
int float1 = SVPublisher_ASDU_addFLOAT(asdu1);
|
||||||
|
int float2 = SVPublisher_ASDU_addFLOAT(asdu1);
|
||||||
|
int ts1 = SVPublisher_ASDU_addTimestamp(asdu1);
|
||||||
|
|
||||||
|
SVPublisher_ASDU asdu2 = SVPublisher_addASDU(svPublisher, "svpub2", NULL, 1);
|
||||||
|
|
||||||
|
int float3 = SVPublisher_ASDU_addFLOAT(asdu2);
|
||||||
|
int float4 = SVPublisher_ASDU_addFLOAT(asdu2);
|
||||||
|
int ts2 = SVPublisher_ASDU_addTimestamp(asdu2);
|
||||||
|
|
||||||
|
SVPublisher_setupComplete(svPublisher);
|
||||||
|
|
||||||
|
float fVal1 = 1234.5678f;
|
||||||
|
float fVal2 = 0.12345f;
|
||||||
|
|
||||||
|
while (running) {
|
||||||
|
Timestamp ts;
|
||||||
|
Timestamp_clearFlags(&ts);
|
||||||
|
Timestamp_setTimeInMilliseconds(&ts, Hal_getTimeInMs());
|
||||||
|
|
||||||
|
SVPublisher_ASDU_setFLOAT(asdu1, float1, fVal1);
|
||||||
|
SVPublisher_ASDU_setFLOAT(asdu1, float2, fVal2);
|
||||||
|
SVPublisher_ASDU_setTimestamp(asdu1, ts1, ts);
|
||||||
|
|
||||||
|
SVPublisher_ASDU_setFLOAT(asdu2, float3, fVal1 * 2);
|
||||||
|
SVPublisher_ASDU_setFLOAT(asdu2, float4, fVal2 * 2);
|
||||||
|
SVPublisher_ASDU_setTimestamp(asdu2, ts2, ts);
|
||||||
|
|
||||||
|
SVPublisher_ASDU_increaseSmpCnt(asdu1);
|
||||||
|
SVPublisher_ASDU_increaseSmpCnt(asdu2);
|
||||||
|
|
||||||
|
fVal1 += 1.1f;
|
||||||
|
fVal2 += 0.1f;
|
||||||
|
|
||||||
|
SVPublisher_publish(svPublisher);
|
||||||
|
|
||||||
|
if (Hal_getTimeInMs() >= nextKeyChangeTime) {
|
||||||
|
/* change key */
|
||||||
|
|
||||||
|
if (activeKeyId == 1)
|
||||||
|
activeKeyId = 2;
|
||||||
|
//else
|
||||||
|
// activeKeyId = 1;
|
||||||
|
RSession_removeKey(rSession, 1);
|
||||||
|
|
||||||
|
nextKeyChangeTime = Hal_getTimeInMs() + 5000;
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread_sleep(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
SVPublisher_destroy(svPublisher);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to create SV publisher\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
RSession_destroy(rSession);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to create remote session instance\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
set(r_sv_subscriber_example_SRCS
|
||||||
|
r_sv_subscriber_example.c
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(WIN32)
|
||||||
|
|
||||||
|
set_source_files_properties(${r_sv_subscriber_example_SRCS}
|
||||||
|
PROPERTIES LANGUAGE CXX)
|
||||||
|
add_executable(r_sv_subscriber_example
|
||||||
|
${r_sv_subscriber_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_sv_subscriber_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ELSE(WIN32)
|
||||||
|
|
||||||
|
add_executable(r_sv_subscriber_example
|
||||||
|
${r_sv_subscriber_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(r_sv_subscriber_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,106 @@
|
|||||||
|
/*
|
||||||
|
* r-sv-example.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "sv_subscriber.h"
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "hal_thread.h"
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
void sigint_handler(int signalId)
|
||||||
|
{
|
||||||
|
running = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Callback handler for received SV messages */
|
||||||
|
static void
|
||||||
|
svUpdateListener (SVSubscriber subscriber, void* parameter, SVSubscriber_ASDU asdu)
|
||||||
|
{
|
||||||
|
printf("Received SV message:\n");
|
||||||
|
|
||||||
|
const char* svID = SVSubscriber_ASDU_getSvId(asdu);
|
||||||
|
|
||||||
|
if (svID != NULL)
|
||||||
|
printf(" svID=(%s)\n", svID);
|
||||||
|
|
||||||
|
printf(" smpCnt: %i\n", SVSubscriber_ASDU_getSmpCnt(asdu));
|
||||||
|
printf(" confRev: %u\n", SVSubscriber_ASDU_getConfRev(asdu));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Access to the data requires a priori knowledge of the data set.
|
||||||
|
* For this example we assume a data set consisting of FLOAT32 values.
|
||||||
|
* A FLOAT32 value is encoded as 4 bytes. You can find the first FLOAT32
|
||||||
|
* value at byte position 0, the second value at byte position 4, the third
|
||||||
|
* value at byte position 8, and so on.
|
||||||
|
*
|
||||||
|
* To prevent damages due configuration, please check the length of the
|
||||||
|
* data block of the SV message before accessing the data.
|
||||||
|
*/
|
||||||
|
if (SVSubscriber_ASDU_getDataSize(asdu) >= 8) {
|
||||||
|
printf(" DATA[0]: %f\n", SVSubscriber_ASDU_getFLOAT32(asdu, 0));
|
||||||
|
printf(" DATA[1]: %f\n", SVSubscriber_ASDU_getFLOAT32(asdu, 4));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
RSession rSession = RSession_create();
|
||||||
|
|
||||||
|
if (rSession) {
|
||||||
|
|
||||||
|
RSession_setLocalAddress(rSession, "0.0.0.0", 102);
|
||||||
|
|
||||||
|
RSession_addMulticastGroup(rSession, "230.0.10.10");
|
||||||
|
|
||||||
|
char* key1 = "0123456789ABCDEF";
|
||||||
|
char* key2 = "FEDCBA9876543210";
|
||||||
|
|
||||||
|
RSession_addKey(rSession, 1, (uint8_t*)key1, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
RSession_addKey(rSession, 2, (uint8_t*)key2, 16, R_SESSION_SEC_ALGO_AES_128_GCM, R_SESSION_SIG_ALGO_NONE);
|
||||||
|
|
||||||
|
SVReceiver receiver = SVReceiver_createRemote(rSession);
|
||||||
|
|
||||||
|
if (receiver) {
|
||||||
|
/* Create a subscriber listening to SV messages with APPID 4000h */
|
||||||
|
SVSubscriber subscriber = SVSubscriber_create(NULL, 0x4000);
|
||||||
|
|
||||||
|
/* Install a callback handler for the subscriber */
|
||||||
|
SVSubscriber_setListener(subscriber, svUpdateListener, NULL);
|
||||||
|
|
||||||
|
/* Connect the subscriber to the receiver */
|
||||||
|
SVReceiver_addSubscriber(receiver, subscriber);
|
||||||
|
|
||||||
|
/* Start listening to SV messages - starts a new receiver background thread */
|
||||||
|
SVReceiver_start(receiver);
|
||||||
|
|
||||||
|
if (SVReceiver_isRunning(receiver)) {
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
|
while (running)
|
||||||
|
Thread_sleep(1);
|
||||||
|
|
||||||
|
/* Stop listening to SV messages */
|
||||||
|
SVReceiver_stop(receiver);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to start SV subscriber. Reason can be that the Ethernet interface doesn't exist or root permission are required.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Cleanup and free resources */
|
||||||
|
SVReceiver_destroy(receiver);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to create SV receiver\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
RSession_destroy(rSession);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Failed to create remote session protocol\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
set(sntp_example_SRCS
|
||||||
|
sntp_example.c
|
||||||
|
)
|
||||||
|
|
||||||
|
IF(WIN32)
|
||||||
|
|
||||||
|
set_source_files_properties(${sntp_example_SRCS}
|
||||||
|
PROPERTIES LANGUAGE CXX)
|
||||||
|
add_executable(sntp_example
|
||||||
|
${sntp_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(sntp_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ELSE(WIN32)
|
||||||
|
|
||||||
|
add_executable(sntp_example
|
||||||
|
${sntp_example_SRCS}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(sntp_example
|
||||||
|
iec61850
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDIF(WIN32)
|
||||||
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* sntp_example.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sntp_client.h"
|
||||||
|
#include "hal_thread.h"
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
static bool running = true;
|
||||||
|
|
||||||
|
void
|
||||||
|
sigint_handler(int signalId)
|
||||||
|
{
|
||||||
|
running = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sntpUserCallback(void* parameter, bool isSynced)
|
||||||
|
{
|
||||||
|
if (isSynced)
|
||||||
|
printf("SNTP: Clock synchronized\n");
|
||||||
|
else
|
||||||
|
printf("SNTP: Clock not synchronized\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char** argv)
|
||||||
|
{
|
||||||
|
SNTPClient client = SNTPClient_create();
|
||||||
|
|
||||||
|
//SNTPClient_addServer(client, "127.0.0.1", 1236);
|
||||||
|
SNTPClient_addServer(client, "192.168.178.74", 123);
|
||||||
|
|
||||||
|
SNTPClient_setUserCallback(client, sntpUserCallback, NULL);
|
||||||
|
|
||||||
|
SNTPClient_setPollInterval(client, 16);
|
||||||
|
|
||||||
|
SNTPClient_start(client);
|
||||||
|
|
||||||
|
signal(SIGINT, sigint_handler);
|
||||||
|
|
||||||
|
while (running) {
|
||||||
|
Thread_sleep(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
SNTPClient_destroy(client);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue