rabbitmq承接MES客户端服务器

news2025/3/31 6:24:58

文章目录

      • 背景
      • 整体架构概述
      • 方案详细步骤
        • 1. 数据库选型与搭建
        • 2. 设备端数据上传至数据库
        • 3. 搭建 RabbitMQ 服务器
        • 4. 数据同步模块(数据库到 RabbitMQ)
        • 5. MES 服务器从 RabbitMQ 接收数据
        • 6. 指令接收模块(RabbitMQ 到设备端)
      • 7. MES 服务器发送指令到 RabbitMQ
      • 方案优势
      • 注意事项

背景

在非标设备里,经常需要用到mes上传数据给客户服务器,然而不同的客户需求不同,即便是同一个客户,也经常改动接口,随之而来的就需要经常改动设备代码,为了降低设备软件和客户mes服务器之间的强耦合,在非标设备和客户 MES 服务器之间添加 RabbitMQ 中间层,实现生产数据上传和指令接收,同时避免对设备代码进行大幅修改。但是不能完全避免修改设备代码。

整体架构概述

此方案的核心是在非标设备软件和客户 MES 服务器之间引入 RabbitMQ 作为中间层。非标设备将生产数据上传至本地数据库,然后由数据同步模块从数据库中读取数据并发送到 RabbitMQ。客户 MES 服务器从 RabbitMQ 接收数据。同时,MES 服务器可以将启动、暂停等指令发送到 RabbitMQ,设备端的指令接收模块从 RabbitMQ 接收这些指令并执行相应操作。

方案详细步骤

1. 数据库选型与搭建
  • 选型:根据设备数据量和性能需求,选择合适的数据库。如果数据量较小且对实时性要求不高,可以选择 SQLite;如果数据量较大且需要高并发处理,建议选择 MySQL 或 PostgreSQL,sqlserver。
  • 搭建:安装并配置所选数据库,创建相应的数据库和表来存储生产数据。以下是一个使用 MySQL 存储生产数据的示例 SQL 脚本:
-- 创建数据库
CREATE DATABASE device_data;

-- 使用数据库
USE device_data;

-- 创建产能表
CREATE TABLE production_capacity (
    id INT AUTO_INCREMENT PRIMARY KEY,
    device_id VARCHAR(50),
    capacity INT,
    record_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建报警信息表
CREATE TABLE alarm_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    device_id VARCHAR(50),
    alarm_message TEXT,
    alarm_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 创建运行状态表
CREATE TABLE running_status (
    id INT AUTO_INCREMENT PRIMARY KEY,
    device_id VARCHAR(50),
    status VARCHAR(20),
    status_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 设备端数据上传至数据库
  • 修改设备代码:在不进行大幅修改的前提下,在设备代码中添加将生产数据插入数据库的逻辑。以下是一个使用 Python 和 MySQL 数据库的示例代码:
import mysql.connector

# 连接数据库
mydb = mysql.connector.connect(
    host="localhost",
    user="your_username",
    password="your_password",
    database="device_data"
)

mycursor = mydb.cursor()

# 模拟设备生产数据
device_id = "device_001"
capacity = 100
alarm_message = "温度过高"
status = "运行中"

# 插入产能数据
sql = "INSERT INTO production_capacity (device_id, capacity) VALUES (%s, %s)"
val = (device_id, capacity)
mycursor.execute(sql, val)
mydb.commit()

# 插入报警信息
sql = "INSERT INTO alarm_info (device_id, alarm_message) VALUES (%s, %s)"
val = (device_id, alarm_message)
mycursor.execute(sql, val)
mydb.commit()

# 插入运行状态数据
sql = "INSERT INTO running_status (device_id, status) VALUES (%s, %s)"
val = (device_id, status)
mycursor.execute(sql, val)
mydb.commit()

mydb.close()
3. 搭建 RabbitMQ 服务器
  • 安装:根据操作系统类型,选择合适的方式安装 RabbitMQ 服务器。例如,在 Ubuntu 系统上可以使用以下命令进行安装:
sudo apt-get update
sudo apt-get install rabbitmq-server
  • 配置:启动 RabbitMQ 服务器,并进行必要的配置,如创建用户、虚拟主机等。以下是创建一个新用户并授予权限的示例命令:
sudo rabbitmqctl add_user your_username your_password
sudo rabbitmqctl add_vhost your_vhost
sudo rabbitmqctl set_permissions -p your_vhost your_username ".*" ".*" ".*"
4. 数据同步模块(数据库到 RabbitMQ)
  • 开发思路:编写一个数据同步脚本,定期从数据库中读取最新的生产数据,并将其发送到 RabbitMQ 的相应队列中。
  • 示例代码:以下是一个使用 Python 和 pika 库实现的示例代码:
import mysql.connector
import pika

# 连接数据库
mydb = mysql.connector.connect(
    host="localhost",
    user="your_username",
    password="your_password",
    database="device_data"
)

mycursor = mydb.cursor()

# 连接 RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 声明队列
channel.queue_declare(queue='production_capacity_queue')
channel.queue_declare(queue='alarm_info_queue')
channel.queue_declare(queue='running_status_queue')

# 同步产能数据
mycursor.execute("SELECT * FROM production_capacity WHERE id > (SELECT IFNULL(MAX(id), 0) FROM synced_production_capacity)")
results = mycursor.fetchall()
for row in results:
    message = f"Device ID: {row[1]}, Capacity: {row[2]}, Record Time: {row[3]}"
    channel.basic_publish(exchange='', routing_key='production_capacity_queue', body=message)
    # 标记已同步的数据
    sql = "INSERT INTO synced_production_capacity (id) VALUES (%s)"
    val = (row[0],)
    mycursor.execute(sql, val)
mydb.commit()

# 同步报警信息和运行状态数据的逻辑类似

connection.close()
mydb.close()
5. MES 服务器从 RabbitMQ 接收数据
  • 开发思路:在客户 MES 服务器端编写代码,连接到 RabbitMQ 并从相应队列中接收生产数据。
  • 示例代码:以下是一个使用 Python 和 pika 库实现的示例代码:
import pika

def callback(ch, method, properties, body):
    print(f"Received: {body.decode()}")

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 声明队列
channel.queue_declare(queue='production_capacity_queue')
channel.queue_declare(queue='alarm_info_queue')
channel.queue_declare(queue='running_status_queue')

# 消费产能数据
channel.basic_consume(queue='production_capacity_queue', on_message_callback=callback, auto_ack=True)

print('Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
6. 指令接收模块(RabbitMQ 到设备端)
  • 开发思路:在设备端编写一个指令接收脚本,连接到 RabbitMQ 并从相应队列中接收启动、暂停等指令,然后执行相应操作。
  • 示例代码:以下是一个使用 Python 和 pika 库实现的示例代码:
import pika

def callback(ch, method, properties, body):
    command = body.decode()
    if command == "start":
        # 执行启动设备的操作
        print("Starting the device...")
    elif command == "pause":
        # 执行暂停设备的操作
        print("Pausing the device...")

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 声明指令队列
channel.queue_declare(queue='device_command_queue')

# 消费指令
channel.basic_consume(queue='device_command_queue', on_message_callback=callback, auto_ack=True)

print('Waiting for commands. To exit press CTRL+C')
channel.start_consuming()

7. MES 服务器发送指令到 RabbitMQ

  • 开发思路:在客户 MES 服务器端编写代码,连接到 RabbitMQ 并将启动、暂停等指令发送到相应队列中。
  • 示例代码:以下是一个使用 Python 和 pika 库实现的示例代码:
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 声明指令队列
channel.queue_declare(queue='device_command_queue')

# 发送启动指令
channel.basic_publish(exchange='', routing_key='device_command_queue', body='start')

connection.close()

方案优势

  • 降低耦合度:通过引入 RabbitMQ 中间层,将设备端和 MES 服务器解耦,减少了对设备代码的修改。
  • 提高可靠性:RabbitMQ 具有消息持久化和重试机制,确保数据传输的可靠性。
  • 易于扩展:可以方便地添加新的设备或修改数据格式,而不会影响整个系统的稳定性。

注意事项

  • 数据一致性:确保数据库和 RabbitMQ 之间的数据同步一致性,避免数据丢失或重复。

  • 性能优化:根据实际需求对数据库和 RabbitMQ 进行性能优化,如调整队列大小、设置合适的并发数等。

  • 安全性:对 RabbitMQ 进行安全配置,如设置访问权限、使用 SSL 加密等,确保数据传输的安全性。

  • 假如是一条生产线,那么只需要将rabbitmq部署到局域网,专门开发一个软件负责rabbitmq的数据维护,其他设备只需要按照要求,上传需要的数据,然后根据客户要求在合适的地方触发数据上传,比如将数据库某个字段设置成1 , rabbitmq维护软件读取到1后,开始将数据库里的数据进行组合封装,发送给rabbitmq , mes服务器从rabbitmq接收数据,最好采用rabbitmq的订阅模式,以上整体方案已经用python 和C++跑通,暂未正式发布,后续肯定会遇到其他问题,到时再更新

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

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

相关文章

LlamaFactory部署及模型微调【win10环境】

1.Llama-Factory简介 LLaMA-Factory,全称 Large Language Model Factory,旨在简化大模型的微调过程,帮助开发者快速适应特定任务需求,提升模型表现。它支持多种预训练模型和微调算法,适用于智能客服、语音识别、机器翻…

vue3配置代理实现axios请求本地接口返回PG库数据【前后端实操】

前端编写 安装 axios 如果当前未安装axios,可以执行如下指令安装 npm install axios配置代理 当前为基于Vite构建的项目,在 vite.config.ts 中配置代理,在defineConfig中新增server配置,主要关注两个点: 一、需要代…

trae 配置 gradle springboot项目

一 本机安装gradle 1.下载gradle : https://github.com/gradle/gradle-distributions/releases/download/v8.13.0/gradle-8.13-all.zip 2.配置相关环境变量: GRADLE_HOME:本地的gradle路径。 GRADLE_USER_HOME:gradle 本地仓…

uv:Rust 驱动的 Python 包管理新时代

在 Python 包管理工具层出不穷的今天,pip、pip-tools、poetry、conda 等各有千秋。而今天要介绍的 uv,则是一款由 Astral 团队推出、采用 Rust 编写的全新工具,目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异,而且在功…

sqlserver 阻止保存要求重新创建表的更改

1 选择 “工具” 菜单,然后点击 “选项” 2 进入选项界面后,选择 “设计器”,取消勾选 “阻止保存要求重新创建表的更改” 选项,点击 “确定”

5.Excel:从网上获取数据

一 用 Excel 数据选项卡获取数据的方法 连接。 二 要求获取实时数据 每1分钟自动更新数据。 A股市场_同花顺行情中心_同花顺财经网 用上面方法将数据加载进工作表中。 在表格内任意区域右键,刷新。 自动刷新: 三 缺点 Excel 只能爬取网页上表格类型的…

在word中使用zotero添加参考文献并附带超链接

一、引言 在写大论文时,为了避免文中引用与文末参考文献频繁对照、修改文中引用顺序/引用文献时手动维护参考文献耗易出错,拟在 word 中使用 zotero 插入参考文献,并为每个参考文献附加超链接,实现交互式阅读。 版本&#xff1a…

性能测试、负载测试、压力测试的全面解析

在软件测试领域,性能测试、负载测试和压力测试是评估系统稳定性和可靠性的关键手段。​它们各自关注不同的测试目标和应用场景,理解这些差异对于制定有效的测试策略至关重要。 本文对性能测试、负载测试和压力测试进行深入分析,探讨其定义、…

Redis中的数据类型与适用场景

目录 前言1. 字符串 (String)1.1 特点1.2 适用场景 2. 哈希 (Hash)2.1 特点2.2 适用场景 3. 列表 (List)3.1 特点3.2 适用场景 4. 集合 (Set)4.1 特点4.2 适用场景 5. 有序集合 (Sorted Set)5.1 特点5.2 适用场景 6. Redis 数据类型的选型建议结语 前言 Redis 作为一款高性能的…

gz sim机器人SDF模型 [持续更新]

机器人SDF模型 linklink的一级pose材质 plugin话题信息通信键盘操作plugin Sensor传感器imu 不算教学&#xff0c;个人的记录 sdf的格式跟urdf有所不同&#xff0c;必须是完整的一个包括&#xff0c;比如< pose></ pose>这样前一个后一个&#xff0c;urdf中是有<…

【MySQL | 六、索引特性(进一步理解)】

目录 索引的理解索引的作用MySQL与磁盘的IOPage单个Page的分类多个Page的组织B树的特点 B树和B树的区别聚簇索引 VS 非聚簇索引聚簇索引的优缺点非聚簇索引的优缺点 创建索引常见索引分为&#xff1a;主键索引InnoDB主键索引的生成过程&#xff08;1&#xff09;初始化&#xf…

计算机网络高频(三)UDP基础

计算机网络高频(三)UDP基础 1.UDP的头部格式是什么样的?⭐ UDP 头部具有以下字段: 源端口(Source Port):16 位字段,表示发送方的端口号。目标端口(Destination Port):16 位字段,表示接收方的端口号。长度(Length):16 位字段,表示 UDP 数据报(包括头部和数据部…

【测试开发】OKR 小程序端黑盒测试报告

【测试报告】OKR 小程序端 项目名称版本号测试负责人测试完成日期联系方式OKR 小程序端4.0马铭胜2025-03-2515362558972 1、项目背景 1.1 OKR 用户端 在如今这个快节奏的时代中&#xff0c;个人和组织的成长往往依赖于清晰、明确且意义深远的目标。然而&#xff0c;如何设定…

部署高可用PostgreSQL14集群

目录 基础依赖包安装 consul配置 patroni配置 vip-manager配置 pgbouncer配置 haproxy配置 验证 本文将介绍如何使用Patroni、Consul、vip-manager、Pgbouncer、HaProxy组件来部署一个3节点的高可用、高吞吐、负载均衡的PostgresSQL集群&#xff08;14版本&#xff09;&…

Vue3中keep-alive缓存组件应用场景。

文章目录 一、KeepAlive是什么&#xff1f;二、基本使用1.例子2.keep-alive使用 三、其他属性3.1 包含/排除3.2 最大缓存实例数3.3 缓存实例的生命周期 总结 一、KeepAlive是什么&#xff1f; 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例…

CosyVoice2在Windows系统上本地部署的详细步骤

CosyVoice2在Windows系统上本地部署的详细步骤&#xff1a; 下载源码并初始化&#xff1a; 确保你的设备上安装了Git。打开命令提示符&#xff08;cmd&#xff09;&#xff0c;执行以下命令来克隆仓库&#xff1a;git clone --recursive https://github.com/FunAudioLLM/CosyVo…

鸿蒙入门——ArkUI 跨页面数据同步和应用全局单例的UI状态存储AppStorage 小结(三)

文章大纲 引言一、AppStorage 应用全局的UI状态存储1、StorageProp和StorageLink装饰器建立联系2、StorageProp2.1、StorageProp使用规则2.2、StorageProp变量的传递/访问规则2.3、StorageProp支持的观察变化2.4、StorageProp 值初始化和更新 3、StorageLink3.1、StorageLink使…

海思烧录工具HITool电视盒子刷机详解

HiTool是华为开发的一款用于海思芯片设备的刷机和调试工具&#xff0c;可对搭载海思芯片的机顶盒、智能电视等设备进行固件烧录、参数配置等操作。以下为你详细介绍&#xff1a; 功能用途 固件烧录&#xff1a;这是HiTool最主要的功能之一。它能够将下载好的适配固件文件烧录到…

使用VS2022编译CEF

前提 选择编译的版本 CEF自动编译&#xff0c;在这里可以看到最新的稳定版和Beta版。 从这里得出&#xff0c;最新的稳定版是134.0.6998.118&#xff0c;对应的cef branch是6998。通过这个信息可以在Build requirements查到相关的软件配置信息。 这里主要看Windows下的编译要…

Pytorch学习笔记(八)Learn the Basics - Save and Load the Model

这篇博客瞄准的是 pytorch 官方教程中 Learn the Basics 章节的 Save and Load the Model 部分。 官网链接&#xff1a;https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m …