rabbitmq承接MES客户端服务器

devtools/2025/3/29 14:22:26/

文章目录

      • 背景
      • 整体架构概述
      • 方案详细步骤
        • 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 pikadef 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 pikadef 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 pikaconnection = 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.ppmy.cn/devtools/171453.html

相关文章

CSS3:深度解析与实战应用

CSS3:深度解析与实战应用详解 1. 选择器增强2. 盒模型扩展3. 渐变和背景4. 转换和动画总结 CSS3 是 CSS(层叠样式表)的最新版本,它引入了许多新的特性和功能,使得网页的样式设计更加灵活、丰富和具有动态效果。在本文中…

tkinter日历程序的设计

1. 程序概述 这是一个使用 Python tkinter 库开发的图形界面日历程序。它能够显示当前月份的日历,并允许用户通过按钮切换查看不同的月份。 2. 主要组件说明 Calendar 类 这是程序的主类,继承自 tkinter.Tk,作为整个应用的主窗口。 2.1 …

【RK3588嵌入式图形编程】-SDL2-渲染文本

渲染文本 文章目录 渲染文本1、概述2、初始化与退出SDL_ttf3、错误检查4、加载字体文件5、渲染文本6、Surface Blitting7、缩放文本8、完整代码9、总结在本文中,将介绍如何在SDL2应用程序中使用官方的SDL_ttf扩展来渲染和操作文本。 1、概述 在这一课中,我们将看到如何在程序…

如何在阿里云linux主机上部署Node.Js

在阿里云的Linux服务器上搭建Node.js编程环境可以通过以下步骤完成。这里以常见的 Ubuntu/CentOS 系统为例,提供两种安装方式(包管理器、NVM多版本管理): 一、通过包管理器安装(适合快速安装指定版本) 1. …

Go 代理爬虫

现在注册,还送15美金注册奖励金 --- 亮数据-网络IP代理及全网数据一站式服务商 使用代理服务器,通过 Colly、Goquery、Selenium 进行网络爬虫的基础示例程序 本仓库包含两个分支: basic 分支包含供 Go Proxy Servers 这篇文章改动的基础代码…

蓝桥杯备考之 最长上升子序列问题(挖地雷)

这道题其实就是正常的最长上升子序列问题,但是我们还要把最优方案输出出来,我们可以用个pre数组来维护就行了,每当我们更新以i为结尾的最长子序列,如果i是接在1到i-1某个点后面的话就把前面的点存到pre里面 最后我们把pre倒着打印…

游戏引擎学习第178天

回顾和今天的计划 我们正在进行一场直播游戏开发,完全不使用任何引擎或库,所有的代码都由我们自己编写,甚至不调用 GPU。如果你能相信的话。现在,我们正处在调试代码的阶段,决定开始开发一些不错的调试工具&#xff0…

Springboot 集成 Flowable 6.8.0

1. 创建 Spring Boot 项目 通过 Spring Initializr(https://start.spring.io/ )创建一个基础的 Spring Boot 项目,添加以下依赖: Spring WebSpring Data JPAMySQL DriverLombok(可选,用于简化代码&#x…