Graphviz——实现动态更新协议状态机

1、描述

  • 为了实现动态更新协议状态机,首先需要定义类来表示协议状态机。初始化该类后,保存状态机对象。在后续更新过程中,就可以加载保存的状态机对象,添加新的状态或事件。
  • Graphviz的安装过程参考:Graphviz——安装、绘制可视化协议状态机(Python)-CSDN博客

2、实现

  • 在fsm.py中首先定义一个协议状态机类。该类保存了节点和边。节点为协议状态,边为触发该状态的事件。
  • 并且还定义了绘制图像、保存状态机,加载状态机的属性。
    • from graphviz import Digraph  # 导入graphviz的Digraph用于绘图
      import pickle  # 导入pickle模块用于序列化和反序列化对象# 定义节点的数据结构
      class Node:def __init__(self, code):# 初始化节点,设置节点的codeself.code = codedef __repr__(self):# 返回节点的字符串表示return f"Node(code={self.code})"# 定义边的数据结构
      class Edge:def __init__(self, source, target, event):# 初始化边,设置源节点、目标节点和触发事件self.source = sourceself.target = targetself.event = eventdef __repr__(self):# 返回边的字符串表示return f"Edge(source={self.source}, target={self.target}, event={self.event})"# 创建有限状态机
      class FSM:def __init__(self):# 初始化自定义状态机,创建一个状态机对象并初始化节点和边的存储self.fsm = Digraph()  # 使用graphviz的有向图self.nodes = {}  # 用于存储节点的字典self.edges = []  # 用于存储边的列表def add_node(self, node):# 添加节点到图中self.nodes[node.code] = node  # 将节点存储在字典中self.fsm.node(node.code)  # 在有向图中添加节点def add_edge(self, edge):# 添加边到图中self.edges.append(edge)  # 将边存储在列表中self.fsm.edge(edge.source, edge.target, label=edge.event)  # 在有向图中添加边def __repr__(self):# 返回图的字符串表示return f"FSM(nodes={self.nodes}, edges={self.edges})"def draw_graph(self, filename="fsm_graph"):# 绘制图self.fsm.render(filename, format='png', cleanup=True)  # 渲染图并保存为文件def save_to_file(self, filename):# 保存图到文件with open(filename, 'wb') as file:pickle.dump(self, file)  # 使用pickle序列化并保存对象@staticmethoddef load_from_file(filename):# 从文件加载图with open(filename, 'rb') as file:return pickle.load(file)  # 使用pickle反序列化并返回对象
  • 在initialize.py中初始化协议状态机。
    • from fsm import FSM, Edge, Nodeif __name__ == "__main__":fsm = FSM()  # 创建自定义有向图对象# 添加节点fsm.add_node(Node("220"))  # 添加节点fsm.add_node(Node("200"))fsm.add_node(Node("331"))fsm.add_node(Node("230"))fsm.add_node(Node("150"))fsm.add_node(Node("226"))fsm.add_node(Node("221"))# 添加边fsm.add_edge(Edge("220", "200", "OPTS UTF8 ON"))  # 添加边从节点1到节点2,事件为:OPTS UTF8 ONfsm.add_edge(Edge("200", "331", "USER webadmin"))fsm.add_edge(Edge("331", "230", "PASS 222"))fsm.add_edge(Edge("230", "200", "PORT 192,168,182,1,195,206"))fsm.add_edge(Edge("200", "150", "LIST"))fsm.add_edge(Edge("150", "226", ""))fsm.add_edge(Edge("226", "221", "QUIT"))# 打印图的表示print(fsm)# 绘制图并保存fsm.draw_graph(filename="fsm")# 保存图到pkl文件fsm.save_to_file("fsm.pkl")
    • 运行生成两个文件,fsm.pkl为协议状态机对象文件,fsm.png为协议状态机图。
  • 在load.py中加载保存的协议状态机对象,并更新状态机。
    • from fsm import FSM, Edge, Nodeif __name__ == "__main__":fsm = FSM.load_from_file("fsm.pkl")# 添加边fsm.add_edge(Edge("200", "221", "QUIT"))# 打印图的表示print(fsm)# 保存图到pkl文件fsm.save_to_file("fsm1.pkl")# 绘制图并保存fsm.draw_graph(filename="fsm1")
    • 运行后,状态机中加入了一条新的边。

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

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

相关文章

ECharts 雷达图案例002 - 诈骗性质分析

ECharts 雷达图案例002 - 诈骗性质分析 📊 ECharts 雷达图案例002 - 诈骗性质分析 深入挖掘数据背后的故事,用可视化手段揭示诈骗行为的模式和趋势。 🔍 案例亮点 创新的数据展示方式,让复杂的诈骗数据一目了然。定制化的雷达图…

一文带你入门【论文排版】利器·LaTeX |Macos

小罗碎碎念 我在刚开始写公众号的时候,写过一期推文,详细的讲解过如何使用LaTeX快速的进行论文排版。不过当时用的是windows的系统,这一次把Mac端的教程补上。 windows系统教程 https://zhuanlan.zhihu.com/p/677481269 LaTeX是一种流行的排…

「AIGC」 华为CodeArts Snap详解

华为的 CodeArts Snap 是一款集成了人工智能技术的编程辅助工具,旨在帮助开发者提高编码效率和代码质量。以下是对 CodeArts Snap 技术详解,以及一个简单的代码案例,帮助初学者更好地理解其功能。 技术详解 CodeArts Snap 主要功能包括: 代码生成:根据开发者的自然语言描…

Python10 python多线程

1.什么是python多线程 Python的多线程指的是在一个Python程序中同时运行多个线程,以达到并发执行多个任务的目的。线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 在Python中,多线程的…

将xlsx电子表格中所有sheet合并在一起

import pandas as pd # 打开xlsx文件 xlsx pd.ExcelFile(path_to_your_file.xlsx) # 读取所有sheets到一个list中 sheets [] for sheet in xlsx.sheet_names: sheets.append(xlsx.parse(sheet)) # 合并所有sheets combined pd.concat(sheets) # 将合并后的数据写入新…

昇思25天学习打卡营第1天 | 快速入门

内容介绍:通过MindSpore的API来快速实现一个简单的深度学习模型。 具体内容: 1. 导包 import mindspore from mindspore import nn from mindspore.dataset import vision, transforms from mindspore.dataset import MnistDataset 2. 处理数据 fro…

如何快速使用向量检索服务DashVector?

免费体验阿里云高性能向量检索服务:https://www.aliyun.com/product/ai/dashvector 本文将介绍如何快速上手使用向量检索服务DashVector。 前提条件 已创建Cluster:创建Cluster。 已获得API-KEY:API-KEY管理。 已安装最新版SDK&#xff1a…

【网络安全学习】漏洞扫描:-01- 漏洞数据库searchsploit的使用

漏洞数据库是收集和存储各种软件漏洞信息的资源库。 漏洞数据库通常包含漏洞的名称、编号、描述、影响范围、危害等级、解决方案等信息,有些还提供漏洞的分析报告、演示视频、利用代码等内容。 1.常用的在线漏洞库: 国家信息安全漏洞共享平台 https:/…

Spring Cloud Bus——进阶配置与事件传播

Spring Cloud 常用组件(下)——Spring Cloud Bus 进阶配置与事件传播 在上篇文章中,我们介绍了 Spring Cloud Bus 的基本概念和配置方法。在这篇文章中,我们将进一步探讨 Spring Cloud Bus 的进阶配置和高级功能,包括…

Unity 天空盒制作使用教程

文章目录 1.概念2.制作天空盒3.使用天空盒3.1 为场景添加3.2 为相机添加 1.概念 天空盒是包裹整个场景的环境效果。 2.制作天空盒 1、创建材质球。 2、设置材质球Shader为SkyBox/6 Sided,将六张贴图放到对应位置。 3.使用天空盒 3.1 为场景添加 方法一、直接…

大学生课堂笔记

微信小程序是一种通过微信平台进行开发和发布的轻量级应用程序,用户无需下载安装即可快速使用。自定义事件是微信小程序开发中非常重要的一部分,它可以让开发者根据自己的需求,定义和触发各种事件,实现更加灵活和定制化的功能。 …

STM32F103ZET6_移植uC/OS_HAL

1下载源码 网址 GitHub - weston-embedded/uC-OS2: C/OS-II is a preemptive, highly portable, and scalable real-time kernels. Designed for ease of use on a huge number of CPU architectures. 需要下载三个文件 1看你使用是ucos2还是3(第一个文件&#…

Linux中常用的压缩与解压文件

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

力扣第206题“反转链表”

在本篇文章中,我们将详细解读力扣第206题“反转链表”。通过学习本篇文章,读者将掌握如何使用迭代和递归的方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第…

【Python】类和对象高级特性

目录 前言 类变量与实例变量 类方法 静态方法 私有属性和方法 多重继承 元类 描述符 总结 前言 在前一篇文章中,我们讨论了 Python 类和对象的基本概念。本文将深入探讨一些高级特性,这些特性可以帮助你更有效地使用 Python 进行面向对象编程。…

Next.js开发中使用useRouter实现点击返回到上一页

在使用Next.js框架做前端页面开发时,如果想返回到上一页,可以利用useRouter钩子提供的back()方法,可以这样做: import {useRouter} from "next/navigation"; import {Space} from "antd"; import {ArrowLeftOutlined} f…

Mendix 创客访谈录|医疗设备领域的数字化转型利器

本期创客 尚衍亮 爱德亚(北京)医疗科技有限公司 应用开发和数字化事业部开发经理 大家好,我叫尚衍亮。毕业于软件工程专业,有6年的软件开发经验。从2021年开始,我在爱德亚(北京)医疗科技有限公司…

智能合约开发的过程

智能合约是一种运行在区块链上的程序,可以自动执行预先设定的条款和条件。智能合约具有去中心化、透明、不可篡改等特点,因此被广泛应用于金融、供应链、物联网等领域。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流…

Spring Boot集成Minio插件快速入门

1 Minio介绍 MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务。它兼容亚马逊 S3 云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小&…

LSM-Tree数据结构原理

LSM-Tree树原理 什么是LSM-Tree LSM-Tree 即 Log Structrued Merge Tree,这是一种分层有序,硬盘友好的数据结构。核心思想是利用磁盘顺序写性能远高于随机写。 LSM-Tree 并不是一种严格的树结构,而是一种内存磁盘的多层存储结构。HBase、L…