Secs/Gem第二讲 (基于secs4net项目的ChatGpt介绍)

news2025/3/20 2:46:19

好的,我们正式进入:


第二讲:深入 SECS4NET 项目结构——主机程序是怎么搭起来的?

关键词:项目结构、类图、通信类、事件处理、连接生命周期、异步机制


本讲目的

我们从源码入手,一步步搞懂:

  1. SECS4NET 主机(Host)是如何设计通信逻辑的
  2. 有哪些关键类,类之间的关系是什么
  3. 通信的生命周期怎么管理
  4. 怎么实现“接收消息”和“主动发送”的功能
  5. 如何集成到你自己的 EAP 或测试程序中

你将不再只是“调 Sample”,而是可以掌控它的主干脉络,甚至模仿它写出你自己的通信程序。


一、SECS4NET 项目的基本结构

这个项目结构很清晰,大致可以分成三大块:

1. 核心库部分

主要是以下几个类和命名空间:

类名 / 接口功能描述
SecsGem主控类,负责建立连接、发送接收消息,是你最常用的接口
SecsMessage表示一条 SECS 报文
SecsItem表示报文内部的数据结构(Item Tree)
SecsGemBuilder构建 SecsGem 的工厂类,负责配置通信参数
HSMSConnectMode枚举,指明是主机模式还是设备模式

这些类都在 Sec4net 命名空间中,是整个通信流程的核心。


2. 样例程序(SampleHost)

这是个完整的 WPF Demo,它通过 UI 来驱动 Host 端的连接、发命令、注册事件等。

你可以从 SampleHost 入手,理解 SECS4NET 是如何实际运作的:

  • 按钮绑定命令(Command)
  • App.xaml.cs 中初始化 Host
  • 有个 GemService 类作为核心逻辑封装

3. 工具与日志

比如:

  • MessageLogViewModel.cs:将 SECS 报文日志格式化输出
  • App.xaml:注册依赖注入,绑定服务层
  • Config 配置项:定义设备地址、端口、模式等参数

二、核心类分析:SecsGem

这是你最常打交道的类,我们来详细拆解一下它的几个核心接口和机制。


1. 初始化过程

var gem = new SecsGemBuilder()
    .UseHsms()
    .ConnectMode(HSMSConnectMode.Active) // 主机模式
    .DeviceId(0)
    .Host("127.0.0.1")  // 设备 IP
    .Port(5000)         // 设备端口
    .Build();

解释知识点:

  • .UseHsms() 表示使用 HSMS 协议(TCP 通信)
  • .ConnectMode() 设为 Active 就是主机,Passive 就是设备
  • .DeviceId() 是主机的设备编号
  • .Host().Port() 指的是连接目标设备的地址和端口
  • .Build() 返回一个 SecsGem 实例

2. 启动连接

await gem.ConnectAsync();

连接过程其实包括 TCP 建立、SECS 建链(S1F13/S1F14)、状态机启动等。

3. 监听接收到的报文

gem.MessageReceived += OnSecsMessageReceived;

你只要写一个回调函数:

private void OnSecsMessageReceived(object sender, SecsMessage e)
{
    if (e.Stream == 6 && e.Function == 11)
    {
        var ceid = e.SecsItem[0].GetValue<ushort>();
        Console.WriteLine($"收到事件:CEID = {ceid}");
    }
}

报文进来后你可以按 SML 结构解析,把报文打印出来或入库。


4. 发送消息

发送很简单,你只需要构造一个 SecsMessage,比如:

var msg = new SecsMessage(2, 41, true,
    Item.L(
        Item.A("START_PROCESS"),
        Item.L(Item.A("Lot123"), Item.A("Recipe1"))
    )
);
await gem.SendAsync(msg);

这里 2 是 Stream,41 是 Function,true 表示需要对方回应(W bit)。


5. 异步机制

整个 SECS4NET 框架基于 async/await 实现异步通信,这样你就不会阻塞主线程。

比如你在 WPF 程序中接收报文、发送命令,UI 不会卡顿。


6. 生命周期管理

在 SampleHost 项目中,一般是在 App.xaml.cs 启动时初始化 Gem 服务:

GemService.Instance.Init();

关闭时调用 DisconnectAsync(),并释放资源。


总结一句话:

SecsGem 就是你跟设备之间的“翻译官”,你通过它说话(Send),也通过它接收设备的回应(MessageReceived)。

你只需要:

  • 创建实例;
  • 连上设备;
  • 发出命令;
  • 处理回应。

这个封装非常适合你这种以业务逻辑为主的开发者。


我们先到这里告一段落。总结如下:


第二讲 · 小结

你已经掌握了:

  • SECS4NET 项目的整体结构;
  • 如何用 SecsGem 建立连接;
  • 如何发出报文;
  • 如何接收报文;
  • 如何用异步方式处理通信逻辑;
  • 如何把它嵌入你自己的程序框架中。

如果你觉得节奏 OK,就可以告诉我:“继续”,我们就进入《第三讲:如何从零构建一个 Host 主机端程序》
那一讲会更实战,我们会一步步搭一个“小型主机”,来收发真正的事件和指令。

你来决定节奏!

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

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

相关文章

STC89C52单片机学习——第25节: [11-1]蜂鸣器

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.03.18 51单片机学习——第25节: [11-1]蜂鸣器 前言开发板说明引用解答和科普一、蜂鸣器…

音视频入门基础:RTP专题(19)——FFmpeg源码中,获取RTP的音频信息的实现(下)

本文接着《音视频入门基础&#xff1a;RTP专题&#xff08;18&#xff09;——FFmpeg源码中&#xff0c;获取RTP的音频信息的实现&#xff08;上&#xff09;》&#xff0c;继续讲解FFmpeg获取SDP描述的RTP流的音频信息到底是从哪个地方获取的。本文的一级标题从“四”开始。 四…

卷积神经网络 - 卷积的变种、数学性质

本文我们来学习卷积的变种和相关的数学性质&#xff0c;为后面学习卷积神经网络做准备&#xff0c;有些概念可能不好理解&#xff0c;可以先了解其概念&#xff0c;然后慢慢理解、逐步深入。 在卷积的标准定义基础上&#xff0c;还可以引入卷积核的滑动步长和零填充来增加卷积…

BLIP论文阅读

目录 现存的视觉语言预训练存在两个不足&#xff1a; 任务领域 数据集领域 相关研究 知识蒸馏 Method 单模态编码器&#xff1a; 基于图像的文本编码器&#xff1a; 基于图像的文本解码器&#xff1a; 三重目标优化 图像文本对比损失&#xff1a;让匹配的图像文本更加…

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于&#xff1a;先以卷积层构成的模块充分抽取空间特征&#xff0c;再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款&#xff08;增加通道数&#xff09;和加深 这一节的NiN提出…

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下&#xff0c;如何让视频分享更便捷、高效&#xff0c;成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势&#xff0c;为视频分享领域带来了革命性变革。…

Linux目录理解

前言 最近在复习linux&#xff0c;发现有些目录总是忘记内容&#xff0c;发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下&#xff1a; 1. 根目录 / (Root Directory) 英文含义&#xff1a;/ 是文件系统的根…

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&#xff1a;0≤n≤105&#xff0c;0 ≤ai≤109&#xff0c;0 ≤k≤109 要求&am…

Swift 并发中的任务让步(Yielding)和防抖(Debouncing)

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控&#xff08;流量&#xff09; 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 &#xff08;我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…

设计模式(创建型)-单例模式

摘要 在软件开发的世界里&#xff0c;设计模式是开发者们智慧的结晶&#xff0c;它们为解决常见问题提供了经过验证的通用方案。单例模式作为一种基础且常用的设计模式&#xff0c;在许多场景中发挥着关键作用。本文将深入探讨单例模式的定义、实现方式、应用场景以及可…

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1&#xff1a;鸿蒙NEXT获取华为手机的udid ​问题2&#xff1a;[Fail]ExecuteCommand need connect-key? 问题3&#xff1a;测试时如何安装app包 问题1&#xff1a;鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…

TI的Doppler-Azimuth架构(TI文档)

TI在AWR2944平台上推出新的算法架构&#xff0c;原先的处理方式是做完二维FFT后在RD图上做CFAR检测&#xff0c;然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后&#xff0c;再做角度维FFT&#xff0c;生成Doppler-Azimuth频谱图&#xff0c;然后在该频谱图…

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!()&#xff0c;默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate&#xff0c;将 Panic 信息打…

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11&#xff0c;已安装VS Cod…

qt下载和安装教程国内源下载地址

qt不断在更新中&#xff0c;目前qt6日渐成熟&#xff0c;先前我们到官方下载或者国内镜像直接可以下载到exe文件安装&#xff0c;但是最近几年qt官方似乎在逐渐关闭旧版本下载通道&#xff0c;列为不推荐下载。但是qt5以其广泛使用和稳定性&#xff0c;以及积累大量代码使得qt5…

mysql 到 doris 挪移数据

工具datax..... 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压&#xff1a;tar -xvzf datax.tar.gz 然后&#xff0c;理论上就可以直接使用了。但是&#xff0c;datax本身是python2写的&#xff0c;如果需要python3…

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…