智能变电站协议系列-3、MMS协议示例(IEC61850)

news2024/9/23 19:28:35

文章目录

    • 一、前言
    • 二、资料收集
    • 三、libiec61850的MMS协议的操作文件的示例运行及抓包分析
      • 1、协议理解
      • 2、代码查看及示例运行
      • 3、wireshark抓包及分析
    • 四、最后

一、前言

接下来我们来分析一下MMS协议,该协议比较抽象,从定义上和理解上都比较抽象,只能在实际使用中去熟悉了,这里我们以操作文件的demo示例来理解和分析整个协议。

二、资料收集

对MMS会有一个整体的认识:https://blog.csdn.net/sinat_41915699/article/details/119905968
对MMS抓包分析有个整体的认识:https://www.anquanke.com/post/id/186560
https://www.jianshu.com/p/736505163b73
IEC61850建模,认识MMS的建模:https://blog.csdn.net/kof98765/article/details/112903104
https://www.cnblogs.com/shanwenbin/archive/2013/01/18/2865684.html
https://webstore.iec.ch/preview/info_iec61850-90-5%7Bed1.0%7Den.pdf

三、libiec61850的MMS协议的操作文件的示例运行及抓包分析

1、协议理解

关于建模的过程我们暂时不做深入研究,针对IEC61850的MMS协议做一定了解后,使用demo中已有的mms示例server_example_files服务端和mms_utility这个客户端示例来做下测试,并简要分析其代码,然后以此来抓包分析整个mms协议。
如果对MMS协议不了解,面对example下面的示例程序会一脸懵,完全不知道怎么运行测试,这里可以简单理解为MMS协议或者说标准通过将一些设备、操作、数据类型等做了面向对象的抽象,将其抽象为类,比如如下这些类:

  • Environment and General Management Services 处理网络连接
  • VMD Support VMD全称为Virtual Machine Device, 是对现实物理设备的一种映射
  • Domain 表示 VMD 中的可加载资源(例如程序)。 个人理解就是一块存储空间,可以存储变量、程序、文件等内容,处理上传下载等任务
  • Program Invocation 程序调用,由一个或多个域组成的可运行程序
  • Variable 变量,类型化数据的元素(例如整数、浮点数、数组等)
  • Named Variable List 已命名的变量列表
  • Event 表示事件和动作状态的对象
  • Semaphore 信号量,用于控制共享资源访问的对象
  • Operator Stations 供操作员使用的“显示器”和“键盘”
  • Journals 日志,对事件和变量的记录
  • Files 文件

然后以服务端-客户端的方式将对象的属性和方法提供出来使用,对象本身可能既具备客户端功能也具备服务端功能,将对外提供的能力以服务端形式展示,并通过客户端能力获取其他对象的服务。
有类就需要实例化对象,而对象则提供服务方法,比如文件的服务就提供读文件夹、打开文件、获取、删除和重命名方法,这样就好理解一些了吧,实际上就是将一些人为的操作内容抽象为类,然后类对象提供服务供客户端调用,实际上就像是提供web服务一样,只是将客户可能产生的接口也都通过协议方式进行了抽象,以模型方式提供xml文件,便于后续自行扩展新接口,这些接口都是包含在其协议定义的各个大类中的(就像积木一样,把常见的积木类型都定义好了为几大类,圆的,方的,三角的等等,然后根据已有的图纸或者自行想象去拼很多的积木人或者积木动物之类的,这些人和动物就像是具体业务的堆叠了,目前常见的就是电力场景业务,电力场景需要的设备、网络连接、程序、数据变量、开关电等事件、日志、文件操作等各种需要的操作都定义进去了,实际上是一套可扩展的标准,并不限于电力场景,只是电力场景用的成熟了,用这个积木已经搭出来一套完善的图纸了,各个电力业务场景可以根据这套图纸来复制搭建了,如果不满足场景可能就会扩展积木类型,也就是协议或者标准的更新)。
关于模型的作用也就是这个文章中提到的信息模型与通信协议独立(https://www.jianshu.com/p/736505163b73):IEC61850标准定义了抽象通信服务接口ACSI(Abstract Communication Service Interface)。
ACSI独立于具体的网络底层通信协议(如MMS)和具体的网络类型(如以太网),需要具体网络接口时,只需采用特定通信服务映射SCSM(Specific Communication Service Mapping),由SCSM映射到具体的通信协议栈。SCSM的内容就是根据需求将ACSI信息模型和服务映射到具体的通信协议。IEC61850需要对信息模型进行扩充,升级时,无需改变已采用的底层通信协议,只要改变具体的SCSM即可。
ACSI主要设定了各类服务模型包括连接服务模型、变量访问服务模型、数据传输服务模型、设备控制服务模型、文件传输服务模型、时钟同步服务模型等。这些服务模型定义了通信对象以及如何对这些对象进行访问,实现客户应用端和服务器应用端的通信,完成实时数据的访问和检索、对设备的控制、时间报告和记录、设备的自我描述等。

2、代码查看及示例运行

  • (1)服务端部分:

其中simoleIO_direct_control.cid就是对应的XML协议,这个在建模部分的文章中有提到(https://www.yuque.com/xiaoyao-nhu75/mlgg0k/kfke8akc2gcbq116#VWKxa),这里我们没有具体的标准的文献,只需要先了解相关概念即可,static_model.c就是对应的模型转换后的代码,server_example_files.c就是对应服务的代码,通过分析我们发现其设置的文件存储路径就是vmd-filestore,demo程序在其下创建了test文件,内容也是test,我们后续可以通过mms客户端的代码取打开获取相关文件的一些信息:
image.png
如下是对应代码,整体调用还是比较简单,我做了一些简单的注释:

/*
 *  server_example_files.c
 *
 *  - How to use some special MMS file service features
 *  - How to control how files file services can be used
 */

#include "iec61850_server.h"
#include "hal_thread.h"
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#include "static_model.h"

static int running = 0;
static IedServer iedServer = NULL;

//退出信号处理
void
sigint_handler(int signalId)
{
    running = 0;
}

//客户端连接回调
static void
connectionHandler (IedServer self, ClientConnection connection, bool connected, void* parameter)
{
    if (connected)
        printf("Connection opened\n");
    else
        printf("Connection closed\n");
}

//文件操作回调,对应不同的服务
static MmsError
fileAccessHandler (void* parameter, MmsServerConnection connection, MmsFileServiceType service,
                                          const char* localFilename, const char* otherFilename)
{
    printf("fileAccessHandler: service = %i, local-file: %s other-file: %s\n", service, localFilename, otherFilename);

    /* Don't allow client to rename files */
    if (service == MMS_FILE_ACCESS_TYPE_RENAME)
        return MMS_ERROR_FILE_FILE_ACCESS_DENIED;

    /* Don't allow client to delete file "IEDSERVER.BIN" */
    if (service == MMS_FILE_ACCESS_TYPE_DELETE) {
        if (strcmp(localFilename, "IEDSERVER.BIN") == 0)
            return MMS_ERROR_FILE_FILE_ACCESS_DENIED;
    }

    /* allow all other accesses */
    return MMS_ERROR_NONE;
}

int
main(int argc, char** argv)
{
    //mms常用端口102
    int tcpPort = 102;

    if (argc > 1) {
        tcpPort = atoi(argv[1]);
    }

    printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString());

    //创建服务并加载模型
    iedServer = IedServer_create(&iedModel);

    /* Set the base path for the MMS file services */
    //设置文件服务基础路径
    MmsServer mmsServer = IedServer_getMmsServer(iedServer);

    IedServer_setFilestoreBasepath(iedServer, "./vmd-filestore/");

    /* Set a callback handler to control file accesses */
    //设置文件处理回调
    MmsServer_installFileAccessHandler(mmsServer, fileAccessHandler, NULL);

    //设置连接处理回调
    IedServer_setConnectionIndicationHandler(iedServer, (IedConnectionIndicationHandler) connectionHandler, NULL);

    /* MMS server will be instructed to start listening to client connections. */
    //开始tcp服务监听
    IedServer_start(iedServer, tcpPort);

    if (!IedServer_isRunning(iedServer)) {
        printf("Starting server failed! Exit.\n");
        IedServer_destroy(iedServer);
        exit(-1);
    }

    running = 1;

    signal(SIGINT, sigint_handler);


    while (running)
        Thread_sleep(100);


    /* stop MMS server - close TCP server socket and all client sockets */
    //停止mms服务
    IedServer_stop(iedServer);

    /* Cleanup - free all resources */
    //释放资源
    IedServer_destroy(iedServer);
    return 0;

} /* main() */

  • (2)客户端部分:

image.png
mms的一些通用的操作方法接口都做了介绍,根据协议我们也能看懂一部分的使用,除了-h -p这些指定host和端口的操作外,文件部分-f、-g、-x我们接下来就会展示运行并对其抓包分析:
image.png

  • (3)运行并抓包

服务端进行如下操作:

#在libiec61850/build/examples/server_example_files目录下
#创建文件夹并进入该目录
mkdir vmd-filestore
#创建test文件并写入内容test或者其它内容
touch test

#之后回到libiec61850/build/examples/server_example_files执行服务程序
./server_example_files

客户端进行测试:

#查看文件列表
$ ./mms_utility -d -i -f
MMS connected.

Server identity:
----------------
  vendor:	libiec61850.com
  model:	LIBIEC61850
  revision:	1.5.2

Domains present on server:
--------------------------
simpleIOGenericIO
test
#读文件属性
$ ./mms_utility -d -i -g test
MMS connected.

Server identity:
----------------
  vendor:	libiec61850.com
  model:	LIBIEC61850
  revision:	1.5.2

Domains present on server:
--------------------------
simpleIOGenericIO
FILENAME: test
SIZE: 5
DATE: 20231221052248.000Z
#删除文件
$ ./mms_utility -d -i -x test
MMS connected.

Server identity:
----------------
  vendor:	libiec61850.com
  model:	LIBIEC61850
  revision:	1.5.2

Domains present on server:
--------------------------
simpleIOGenericIO
File deleted

image.png

3、wireshark抓包及分析

三组命令各自对应的过程,分析流程参考这里:(https://www.anquanke.com/post/id/186560)。

  • (1)、OSI七层网络模型:

image.png
在其中我们发现了TPTK、COTP以及ISO 8650-1 OIS Association Control Service,其中TPTK属于会话层,COTP属于表示层,ISO 8650-1 OIS Association Control Service也就是ACSE属于应用层,其通常用来确定、维持或终止在两个应用之间的连接。
(2)、四种MMS包,分别是

  • initiate-RequestPDU(启动-请求PDU)
  • initiate-ResponsePDU(启动-应答PDU)
  • confirmed-RequestPDU(确认-请求PDU)
  • confirmed-ResponsePDU(确认-应答PDU)

image.png
具体分析下帧信息:

  • 获取文件列表:

image.png

  • 获取文件属性(一个文件的时候和获取文件列表看不出来区别,如果创建两个就发现获取列表是将所有文件属性都带上了,单独获取文件属性只有这一个):

image.png
image.png

  • 删除文件:

image.png

  • 读写文件

这里示例查看iec61850_client_example_files即可,这里就不再说代码了,直接抓包看一下
image.png
似乎没有远程写文件fileWrite的直接接口,只能get文件后修改本地文件然后再set到远程替换原本的文件。

四、最后

MMS协议的分析暂时就到这里了,接下来我们再去分析下IEC 101和IEC 104协议。

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

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

相关文章

阶段七-GitEE

Git&#xff1a;版本控制软件 Git的优点 1.1 协同修改 多人并行不悖的修改服务器端的同一个文件。 1.2 数据备份 不仅保存目录和文件的当前状态&#xff0c;还能够保存每一个提交过的历史状态。 1.3 版本管理 在保存每一个版本的文件信息的时候要做到不保存重复数据&…

【Git】fatal: bad boolean config value ‘true~‘ for ‘core.longpaths‘

windwos操作系统git config设置错了参数值&#xff0c;解决方法。 出现原因 在拉取代码时&#xff0c;仓库中存在文件名过长得文件&#xff0c;拉取报错了“filename too long” 解决 git config --system core.longpaths true结果在复制命令时&#xff0c;粘贴到命令行多了一…

第19章总结

一.Java绘图类 1.Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图像上进行绘制。Graphics类封装了Java支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色、字体、画笔、文本、图像等。 2.Graphics2D类 Graphics2…

【MySQL】脏读、不可重复读、幻读介绍及代码解释

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 数据库事务隔离级别是关系数据库管理系统中一个重要的概念&#xff0c;它涉及到多个事务并发执行…

Shell三剑客:awk(awk编辑编程)二

一、IF 语句 IF 条件语句语法格式 #方式一&#xff1a; if (condition)action #方式二&#xff1a;使用花括号语法格式 if (condition) {action1;action2; ... } {if(表达式)&#xff5b;语句1;语句2;...&#xff5d;} IF 语句实例 #判断数字是奇数还是偶数 [rootlocalhost ~…

Kafka生产环境问题总结与性能优化实践

Kafka可视化管理工具kafka-manager 安装及基本使用可参考: httos://wwwcnbloas.com/dadonaaa/o/8205302.html 线上环境规划 1. 消息丢失情况: 消

数据入表倒逼数据治理,国有企业如何做好数据资产管理

数据是驱动数字经济发展的核心生产要素&#xff0c;数据资产化是释放数据要素价值的重要方式。国有企业作为驱动数字化转型升级的排头兵&#xff0c;在数据资产入表的背景下&#xff0c;如何充分发挥海量规模数据和应用场景等优势&#xff0c;如何解决数据难点&#xff0c;管好…

ES8生产实践——Kibana对接Azure AD实现单点登录

基本概念介绍 什么是单点登录 单点登录&#xff08;Single Sign-On&#xff0c;SSO&#xff09;是一种身份验证和访问控制机制&#xff0c;允许用户使用一组凭据&#xff08;通常是用户名和密码&#xff09;仅需登录一次&#xff0c;即可访问多个应用程序或系统&#xff0c;而…

算法基础之最长公共子序列

最长公共子序列 核心思想&#xff1a; 线性dp 集合定义 : f[i][j]存 a[1 ~ i] 和 b[1 ~ j] 的最长公共子序列长度 状态计算&#xff1a; 分为取/不取a[i]/b[j] 共四种情况 其中 中间两种会包含两个都不取的情况(去掉) 但是因为取最大值 有重复也没事用f[i-1][j] 和 f[i][j-1]表…

GNN 图神经网络

GCN 邻接矩阵A&#xff1a;adjacency matrix用来表示节点间的连接关系。 度矩阵D&#xff1a;degree matrix用来表示节点的连接数 特征矩阵X&#xff1a;feature matrix用来表示节点的特征

openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析

文章目录 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表172.1 分析表172.2 表自动分析 openGauss学习笔记-172 openGauss 数据库运维-备份与恢复-导入数据-分析表 执行计划生成器需要使用表的统计信息&#xff0c;以生成最有效的查询执行计划&#…

Sam Altman 晒网友新年愿望清单;AI Pin 明年 3 月开始交付丨 RTE 开发者日报 Vol.112

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

什么是非功能性测试?

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

AI爆文写作变现:如何让自己的文章减少AI味,提升写作质量

利用AI实现自媒体写作变现&#xff0c;核心就是爆文写作提示词&#xff08;Prompt&#xff09; 对新手来说&#xff0c;缺少好用的爆文提示词&#xff0c;这无疑是大家碰到的一个难点。 如何创建属于自己的高效AI指令&#xff0c;无疑是大家最关心的问题。 本篇文章将一步一…

计算机网络——网络层(四)

前言&#xff1a; 前面我们已经对物理层和数据链路层有了一个简单的认识与了解&#xff0c;现在我们需要对数据链路层再往上的一个层&#xff0c;网络层进行一个简单的学习与认识&#xff0c;网络层有着极其重要的作用&#xff0c;让我们对网络层进行一个简单的认识与学习吧 目…

市场复盘总结 20231225

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整 昨日回顾&#xff1a; SELECT CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封…

nosql--RedisTemplate定制化

nosql--RedisTemplate定制化 1、序列化2、如果使用redis中保存数据会使用默认的序列化机制&#xff0c;导致redis中保存的对象不可视2.1将所有的对象以JSON的形式保存2.2配置reids自定义配置2.3转化成功2.4配置文件代码 3redis客户端 1、序列化 stringRedisTemplate RedisTemp…

Cesium.js三维地图的实现(依托天地图CDN文件)

零、技术选型&#xff1a; Vue2、VueCli5、天地图、Cesium.js 一、通过天地图官网案例实现 需要引入天地图官方提供的CDN链接访问Cesium.js相关文件 相关文件&#xff1a; https://api.tianditu.gov.cn/cdn/demo/sanwei/static/cesium/Cesium.js https://api.tianditu.gov.cn/…

解决Qt“报无法定位程序输入点xxx于动态连接库“问题

今天&#xff0c;在使用QtVS2019编译工程时&#xff0c;弹出"无法定位程序输入点xxx于动态链接库"问题&#xff0c;如图(1)所示&#xff1a; 图(1) 报"无法定位程序输入点xxx于动态链接库"问题 出现这种问题的原因有很多&#xff1a; (1) 工程Release/Deb…

实战教学:零食百货商城小程序开发全程指导

随着移动设备的普及和互联网技术的发展&#xff0c;小程序成为越来越多人的选择&#xff0c;特别是在购物方面。开发一个零食百货商城小程序&#xff0c;可以让你在手机上随时随地购买各种零食&#xff0c;方便快捷。本文将为你提供全程指导&#xff0c;让你轻松开发一个成功的…