win10下github libiec61850库编译调试sntp_example

libiec61850

https://github.com/mz-automation/libiec61850
v1.6

简介

libiec61850 是一个开源(GPLv3)的 IEC 61850 客户端和服务器库实现,支持 MMS、GOOSE 和 SV 协议。它使用 C 语言(根据 C99 标准)实现,以提供最大的可移植性。它可以用于在运行 Linux、Windows 和 MacOS 的嵌入式系统和 PC 上实现符合 IEC 61850 的客户端和服务器应用程序。包含一组简单的示例应用程序,可以作为实现自己的 IEC 61850 兼容设备或与 IEC 61850 设备通信的起点。该库已在许多商业软件产品和设备中得到成功应用。

第三方库

各第三方库的设置参见libiec61850-1.6\third_party下各说明文件

mbedtls-3.6.0

https://github.com/Mbed-TLS/mbedtls
优先使用mbedtls-3.6.0
Mbed TLS 是一个实现加密原语、X.509 证书操作以及 SSL/TLS 和 DTLS 协议的 C 库。
其小巧的代码体积使其适用于嵌入式系统。

sqlite

与写sqlite日志有关
https://sqlite.org/2025/sqlite-amalgamation-3490100.zip

winpcap 与win下运行有关,必须安装WinPcap_4_1_3.exe并重启

https://www.winpcap.org/install/bin/WinPcap_4_1_3.exe
https://www.winpcap.org/install/bin/WpdPack_4_1_2.zip

doxygen

https://www.doxygen.nl/
https://www.doxygen.nl/files/doxygen-1.13.2-setup.exe

linux下编译

linux make编译:

make examples
生成
libiec61850.a
运行测试
cd examples/server_example_basic_io
sudo ./server_example_basic_io
客户端对应程序 iec61850_client_example1

make install //默认安装到.install
make INSTALL_PREFIX=/usr/local install //指定安装目录
安装目标将 API 头文件和静态库复制到单个目录中,
用于头文件(INSTALL_PREFIX/include)
和静态库(INSTALL_PREFIX/lib)。

linux cmake编译:

mkdir build
cd build
cmake …
make
sudo make install

win10下cmake vs编译

cd C:\work\code\iec61850\libiec61850-1.6\winbuild
cmake -G “Visual Studio 17 2022” … -A x64
用vs2022打开winbuild下的sln文件

子工程介绍

hal

作用:libiec61850 的硬件抽象层(Hardware Abstraction Layer)子项目。
该模块封装了与操作系统相关的功能(如线程、套接字、定时器等),
使核心库可以跨平台运行。
在 Windows 下,hal 可能实现为:
基于 Win32 API 的线程和网络接口。
替换 POSIX 兼容层(如 socket() 的 Windows 版本)。
生成路径:libiec61850-1.6\winbuild\hal\Debug

iec61850

核心的静态库
生成路径:libiec61850-1.6\winbuild\src\Debug

doc doc-net

与Doxygen有关,生成路径 libiec61850-1.6\winbuild\doxydoc

ZERO_CHECK

作用:CMake 自动生成的“配置检查”项目。
每次构建时,ZERO_CHECK 会先运行,检查 CMakeLists.txt 或相关文件是否有变更。
如果有变更(如修改了编译选项、添加/删除了源文件),
它会自动重新生成 VS2022 的工程文件(.vcxproj 等)。

ALL_BUILD

作用:CMake 默认生成的“构建所有目标”项目。

RUN_TESTS

作用:运行项目的单元测试(如果项目配置了测试)。

PACKAGE

作用:生成分发包(如 ZIP、NSIS 安装包等)。
典型输出:libiec61850-1.6-win64.zip 或安装程序。

INSTALL

作用:将编译好的文件安装到指定目录(类似 make install)。

r_goose_publisher_example

工程以r_开头的几个sv goose示例程序与mbedtls tls加密库有关
libiec61850-1.6\winbuild\config\stack_config.h 中有提示

sntp_example

SNTP(简单网络时间协议)是 NTP(Network Time Protocol) 的简化版本,用于在计算机网络中同步设备的系统时间。
轻量级:相比完整的 NTP,SNTP 实现更简单,适合嵌入式系统或轻量级应用。
基于 UDP:默认使用 UDP 端口 123 进行通信。
时间同步:从 SNTP/NTP 服务器获取精确的时间戳(通常来自原子钟或 GPS 时间源)。

sntp_example源码debug

sntp_client.c 代码修改

libiec61850-1.6\src\sntp\sntp_client.c
parseResponseMessage中修改如下

    if (self->userCallback){if (self->userCallbackParameter) {//add*((uint64_t*)self->userCallbackParameter) = trnsTime + self->lastRequestTimestamp;}self->userCallback(self->userCallbackParameter, true);}

sntp_example.c 代码修改

libiec61850-1.6\examples\sntp_example\sntp_example.c

#include "sntp_client.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdio.h>
#include <time.h>
#include <windows.h>static bool running = true;
static uint64_t g_nsTime = 0;#ifdef _WINDOWS
static BOOL WINAPI sigint_handler(DWORD signal) {if (signal == CTRL_C_EVENT) {printf("Ctrl+C received, exiting ...\n");running = false;return TRUE; // 表示已处理该事件}return FALSE;
}
#else
void sigint_handler(int signalId) {running = false;
}
#endif // _WINDOWSvoid show_time(nsSinceEpoch nsTime) {// 转换为 Windows FILETIME (1601-01-01 为起点,100ns 单位)uint64_t t = (nsTime / 100ULL) + 116444736000000000ULL;FILETIME ft;ft.dwLowDateTime = (uint32_t)(t & 0xffffffff);ft.dwHighDateTime = (uint32_t)(t >> 32);SYSTEMTIME st;// 转换为 SYSTEMTIME (便于读取年月日时分秒)FileTimeToSystemTime(&ft, &st);SYSTEMTIME localSt;// 转换为本地时间SystemTimeToTzSpecificLocalTime(NULL, &st, &localSt);printf("    Time: %04d-%02d-%02d %02d:%02d:%02d.%03d (nsTime==%llu)\n",localSt.wYear, localSt.wMonth, localSt.wDay,localSt.wHour, localSt.wMinute, localSt.wSecond,localSt.wMilliseconds, nsTime);fflush(stdout);
}static void sntpUserCallback(void* parameter, bool isSynced) {if (isSynced) {printf("SNTP: Clock synchronized %llu\n", *(uint64_t*)parameter);show_time(g_nsTime);}else {printf("SNTP: Clock not synchronized\n");}
}int main(int argc, char** argv) {SNTPClient client = SNTPClient_create();SNTPClient_addServer(client, "pool.ntp.org", 123);//"192.168.178.74"SNTPClient_setUserCallback(client, sntpUserCallback, (void*)&g_nsTime);SNTPClient_setPollInterval(client, 16);SNTPClient_start(client);
#ifdef _WINDOWSif (!SetConsoleCtrlHandler(sigint_handler, TRUE)) {printf("Error: Failed to set Ctrl+C handler!\n");}
#elsesignal(SIGINT, sigint_handler);
#endif // _WINDOWSwhile (running) {Thread_sleep(100);}SNTPClient_destroy(client);getchar();return 0;
}

SNTP: Failed to bind to port 123 问题处理

查询123端口被占用问题

libiec61850-1.6\winbuild>netstat -ano | findstr “:123”
UDP 0.0.0.0:123 : 1852
UDP [::]:123 : 1852

libiec61850-1.6\winbuild>tasklist | findstr “1852”
svchost.exe 1852 Services 0 7,204 K
svchost.exe,通常是 w32time 服务。

停用w32time

net stop w32time
sc config w32time start= disabled

恢复w32time

sc config w32time start= auto
net start w32time

运行效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77275.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Microsoft SQL Server Management 一键删除数据库所有外键

DECLARE ESQL VARCHAR(1000); DECLARE FCursor CURSOR --定义游标 FOR (SELECT ALTER TABLE O.name DROP CONSTRAINT F.name; AS CommandSQL from SYS.FOREIGN_KEYS F JOIN SYS.ALL_OBJECTS O ON F.PARENT_OBJECT_ID O.OBJECT_ID WHERE O.TYPE U AND F.TYPE …

新型多机器人协作运输系统,轻松应对复杂路面

受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发&#xff0c;研究人员开发了多机器人协作运输系统&#xff08;Multirobot Cooperative Transportation Systems&#xff0c;MRCTS&#xff09;运输单个机器人无法处理的重型超大物体&#xff0c;可用于搜救行动、灾难响应、军事…

Framework Binder架构分解

整个 Binder 架构所涉及的总共有以下 5 个目录&#xff1a; 1. /framework/base/core/java/(Java) 2. /framework/base/core/jni/ (JNI) 3&#xff0c;/framework/native/libs/binder (Native) 4&#xff0c;/framework/native/cmds/servicemanager/ (Native) 5&#xff0c…

腾讯云对象存储以及项目业务头像上传

腾讯云上传步骤&#xff1a; service-vod模块化中 ①、参考文档&#xff0c;引入依赖 ②、配置文件application.properties ③、创建工具类 初始化bean的时候读取配置文件 Component public class ConstantPropertiesUtil implements InitializingBean{Value("${t…

LeetCode hot 100—括号生成

题目 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())",&…

SpringBoot企业级开发之【文章分类-新增文章分类】

看一下新增文章的需求&#xff1a; 接口文档&#xff1a; 开发思路&#xff1a; 先在controller下去创建add方法&#xff0c;方法内导入Service类获取add的结果&#xff1b;再在Service接口下去创建add的方法&#xff1b;然后在Service实现类下去实现方法的作用&#xff0c;且导…

Minecraft盔甲机制详解(1.9之后)

Minecraft的盔甲有很多种&#xff0c;但是评判盔甲的好坏&#xff0c;通常玩家会使用一个变量来评判——护甲值 护甲值的机制很简单&#xff0c;一格护甲值 &#xff08;半个灰色的衣服图标&#xff09;最多能提供4%的防御 护甲值在不开作弊的生存模式理论上限是20点&#xf…

为什么要给单片机植入操作系统

给单片机植入操作系统&#xff08;通常是实时操作系统&#xff0c;RTOS&#xff09;主要是为了在资源有限的环境中实现更高效、更可靠的多任务管理和系统调度。以下是主要原因和优势&#xff1a; 1. 多任务并行处理 背景&#xff1a;单片机通常需要同时处理多个任务&#xff0…

Arduino+ESP826601s模块连接阿里云并实现温湿度数据上报

ArduinoESP826601s模块连接阿里云并实现温湿度数据上报 一、前言二、准备工作三、程序代码1. Arduino的程序2. ESP826601的程序3. 上面程序需要注意的地方 四、运行结果五、结束语 一、前言 看完我这三篇文章&#xff0c;相信各位朋友对于阿里云物联网平台的使用都有了一定的认…

Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步

一、前言 在实际开发中&#xff0c;我们经常面临以下场景&#xff1a; 系统支持多种登录方式&#xff08;用户名密码、管理员登录、OAuth 登录、短信登录等&#xff09; 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用&#xff0c;而不暴露具体实现 这个…

Windows Acrobat Pro DC-v2025.001.20435-x64-CN-Portable便携版

Windows Acrobat Pro 链接&#xff1a;https://pan.xunlei.com/s/VOO1nMjQ1Qf53dyISGne0c_9A1?pwdsfgn# Acrobat Pro 2024 专业增强版特色 ● 创建和编辑 PDF 文件&#xff1a;可以将各种类型的文档转换为 PDF 格式&#xff0c;并进行编辑和修改。 ● 合并和拆分 PDF&#…

【2025“华中杯”大学生数学建模挑战赛】C题:就业状态分析与预测 详细解题思路

目录 2025“华中杯”大学生数学建模挑战赛C题 详细解题思路一、问题一1.1 问题分析1.2 数学模型 1.3 Python代码1.4 Matlab代码 二、问题二2.1 问题分析2.2 数学模型 2.3 Python代码2.4 Matlab代码 三、问题三3.1 问题分析 四、问题四4.1 问题分析与数学模型 2025“华中杯”大学…

识别法院PDF文件特定字段并插入数据库【正则表达式+本地化部署】

pdf解析法院协助单特定字段&#xff0c;开源项目&#xff0c;结合若依项目进行开发&#xff0c;不连互联网&#xff0c;本地开发部署&#xff0c;前端使用vue3技术,后端用若依分离版spring botot技术&#xff0c;实现将pdf法院协助执行通知书中的特定字段如&#xff1a;时间、文…

拥抱健康养生,开启活力生活

在快节奏的现代生活中&#xff0c;人们愈发重视健康养生。它并非高深莫测的学问&#xff0c;而是融合于日常点滴&#xff0c;对我们的生活有着深远影响。 合理饮食是健康养生的基石。一日三餐&#xff0c;应遵循营养均衡原则。多摄入蔬菜、水果&#xff0c;它们富含维生素与膳食…

无人机姿态稳定与动态控制模块概述!

一、设计难点 1. 动态算力需求与硬件能力的不匹配** 无人机边缘计算设备通常受限于体积和重量&#xff0c;导致其计算单元&#xff08;如CPU、GPU&#xff09;的算力有限&#xff0c;难以应对突发的高负载任务&#xff08;如实时图像处理、AI推理&#xff09;。 挑战&am…

MySQL 临时表介绍

在 MySQL 数据库中&#xff0c;临时表是一种特殊类型的表&#xff0c;它在数据库会话期间存在&#xff0c;会话结束时自动删除。临时表为处理特定的、临时性的数据操作任务提供了一种高效且便捷的方式。 一、临时表的创建 使用CREATE TEMPORARY TABLE语句来创建临时表。其语法…

量子纠缠物理本质、技术实现、应用场景及前沿研究

以下是关于 量子纠缠(Quantum Entanglement) 的深度解析,涵盖物理本质、技术实现、应用场景及前沿研究,以技术视角展开: 一、量子纠缠的物理本质 1. 核心定义 量子纠缠是多个量子系统(如粒子)间的一种关联状态,表现为: 非局域性:纠缠态粒子无论相距多远,测量其中一…

扫雷-C语言版

C语言扫雷游戏设计&#xff08;完整版&#xff09; 游戏背景 扫雷是一款经典的益智类单人电脑游戏&#xff0c;最早出现在1960年代&#xff0c;并在1990年代随着Windows操作系统而广为人知。游戏目标是在不触发任何地雷的情况下&#xff0c;揭开所有非地雷的格子。玩家需要根…

深入理解 Linux 权限管理:从 Shell 到文件权限

&#x1f33c;&#x1f33c; 在 Linux 系统中&#xff0c;权限是保障系统安全与稳定的核心之一。每个操作都可能涉及权限的管理和控制&#xff0c;特别是当你开始以不同用户的身份进行操作时。本文将通过生动的比喻与详细的技术解析&#xff0c;带你一起深入理解 Linux 权限系统…

【Java面试系列】Spring Cloud微服务架构中的分布式事务解决方案与Seata框架实现原理详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Cloud微服务架构中的分布式事务解决方案与Seata框架实现原理详解 - 3-5年Java开发必备知识 引言 在微服务架构中&#xff0c;分布式事务是一个不可避免的挑战。随着业务复杂度的提升&#xff0c;如何保证跨服务的数据一致性成为了面试中的高频问题。本…