系统架构全景图

图表


一、系统平台优化(CentOS Stream 8)

1. 系统基础配置

bash
# 1. 系统更新与加固
sudo dnf update -y
sudo dnf install epel-release -y
sudo dnf install fail2ban firewalld -y # 2. 创建专用运维账户
sudo useradd -m -s /bin/bash iotadmin
sudo passwd iotadmin
sudo usermod -aG wheel iotadmin # 3. SSH安全加固
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd # 4. 防火墙配置
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-port=1883/tcp # MQTT
sudo firewall-cmd --permanent --add-port=8883/tcp # MQTT/SSL
sudo firewall-cmd --permanent --add-port=9092/tcp # Kafka
sudo firewall-cmd --permanent --add-port=3000/tcp # Grafana
sudo firewall-cmd --reload

2. 内核参数优化(/etc/sysctl.conf)

conf
# 网络性能优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_max_syn_backlog = 65536 # 文件句柄限制
fs.file-max = 2097152
fs.nr_open = 2097152 # MQTT连接优化
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15

二、MQTT Broker集群部署(EMQX企业版)

1. 集群化部署

bash
# 安装EMQX企业版
curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash
sudo dnf install emqx-enterprise -y # 配置集群(3节点示例)
# 节点1(10.0.0.1):
echo "cluster.name = iot_platform" >> /etc/emqx/emqx.conf
echo "node.name = emqx@10.0.0.1" >> /etc/emqx/emqx.conf # 节点2(10.0.0.2):
emqx_ctl cluster join emqx@10.0.0.1

2. 安全加固配置

bash
# 1. 启用TLS加密
sudo mkdir /etc/emqx/certs
sudo certbot certonly --standalone -d mqtt.example.com
sudo cp /etc/letsencrypt/live/mqtt.example.com/* /etc/emqx/certs/ # 2. 配置EMQX(/etc/emqx/emqx.conf)
listeners.ssl.default {
bind = "0.0.0.0:8883"
max_connections = 100000
ssl_options {
keyfile = "/etc/emqx/certs/privkey.pem"
certfile = "/etc/emqx/certs/fullchain.pem"
}
} # 3. 设备级认证
emqx_ctl users add device_001 $6$rounds=10000$somesalt$hashed_password

3. 主题权限控制

conf
# /etc/emqx/acl.conf
{allow, {user, "device_001"}, publish, ["sensors/001/#"]}
{allow, {user, "backend"}, subscribe, ["sensors/#"]}
{deny, all}

三、数据处理与存储架构

1. 消息队列缓冲(Kafka)

bash
# 安装Kafka
wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz
tar -xzf kafka_2.13-3.4.0.tgz # 配置集群(3节点)
# server.properties
broker.id=1
listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://node1:9092
zookeeper.connect=node1:2181,node2:2181,node3:2181

2. 时序数据库(TimescaleDB)

bash
# 安装PostgreSQL 15 + TimescaleDB
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf module disable postgresql
sudo dnf install postgresql15-server postgresql15-contrib timescaledb-2-postgresql-15 # 初始化数据库
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
sudo systemctl enable --now postgresql-15 # 创建超级表
CREATE TABLE sensor_data (
time TIMESTAMPTZ NOT NULL,
device_id TEXT NOT NULL,
value DOUBLE PRECISION NOT NULL
);
SELECT create_hypertable('sensor_data', 'time');

3. 数据清洗服务(Python示例)

python
from kafka import KafkaConsumer
import psycopg2 # Kafka消费者
consumer = KafkaConsumer(
'raw_sensor_data',
bootstrap_servers=['kafka1:9092', 'kafka2:9092'],
security_protocol='SSL',
ssl_cafile='ca.pem'
) # TimescaleDB连接
conn = psycopg2.connect("dbname=tsdb user=tsdbadmin")
cursor = conn.cursor() for message in consumer:
data = json.loads(message.value) # 数据验证
if not validate_sensor_data(data):
continue # 数据清洗
cleaned = clean_data(data) # 写入数据库
cursor.execute(
"INSERT INTO sensor_data (time, device_id, value) VALUES (%s, %s, %s)",
(cleaned['timestamp'], cleaned['device_id'], cleaned['value'])
)
conn.commit() # 更新缓存
redis.set(f"latest:{cleaned['device_id']}", json.dumps(cleaned))

四、安全加固体系

1. 传输层安全

协议 端口 加密方式 证书管理
MQTT 8883 TLS 1.3 Let's Encrypt自动更新
HTTPS 443 TLS 1.3 企业级证书
Database 5432 TLS双向认证 自签名CA

2. 数据加密策略

python
# 设备端数据加密示例
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend def encrypt_data(data, key):
iv = os.urandom(12)
cipher = Cipher(
algorithms.AES(key),
modes.GCM(iv),
backend=default_backend()
)
encryptor = cipher.encryptor()
ciphertext = encryptor.update(data) + encryptor.finalize()
return iv + encryptor.tag + ciphertext

3. 访问控制矩阵

角色 MQTT权限 DB访问 API权限
设备 发布特定主题
数据服务 订阅所有主题 只写 内部网络访问
前端应用 只读 JWT认证+RBAC
管理员 管理主题 读写 管理员权限

五、运维监控体系

1. 监控组件部署

bash
# Prometheus安装
sudo dnf install prometheus # Node Exporter
sudo dnf install node_exporter # Grafana
sudo dnf install grafana

2. 关键监控指标

yaml
# prometheus.yml 片段
scrape_configs:
- job_name: 'emqx'
static_configs:
- targets: ['emqx1:18083', 'emqx2:18083']
- job_name: 'postgres'
static_configs:
- targets: ['db1:9187']
- job_name: 'kafka'
static_configs:
- targets: ['kafka1:7071']

3. 告警规则示例

yaml
groups:
- name: MQTT服务
rules:
- alert: EMQX节点离线
expr: up{job="emqx"} == 0
for: 5m
labels:
severity: critical
annotations:
summary: "MQTT节点 {{ $labels.instance }} 离线" - alert: 消息积压
expr: kafka_consumergroup_lag > 10000
for: 10m
labels:
severity: warning

六、设备接入与扩展方案

1. 设备接入流程

图表

2. 设备管理API设计

python
# 设备注册API
@app.route('/api/v1/devices', methods=['POST'])
@jwt_required()
def register_device():
data = request.get_json()
device_id = generate_device_id() # 创建数据库记录
db.execute("""
INSERT INTO devices (id, name, type, owner)
VALUES (%s, %s, %s, %s)
""", (device_id, data['name'], data['type'], get_jwt_identity())) # 生成设备凭证
credential = generate_device_credential(device_id) return jsonify({
'device_id': device_id,
'username': credential['username'],
'password': credential['password'],
'certificate': credential['cert_pem']
}), 201

3. 多协议支持方案

协议 转换方式 适用场景
HTTP EMQX Webhook 传统设备改造
CoAP CoAP-MQTT代理网关 低功耗设备
Modbus 边缘计算转换 工业设备
LoRaWAN 网络服务器集成 长距离物联网

七、日常运维手册

1. 备份策略

bash
# 数据库每日备份
pg_dump -U postgres -Fc tsdb > /backup/tsdb-$(date +%F).dump # 配置文件备份
rsync -av /etc/emqx /backup/configs/emqx
rsync -av /etc/kafka /backup/configs/kafka # 证书备份
tar -czf /backup/certs-$(date +%F).tar.gz /etc/letsencrypt/{live,archive}

2. 灾难恢复流程

  1. 恢复最新数据库备份

  2. 重建EMQX集群

  3. 恢复Kafka偏移量

  4. 验证数据完整性

  5. 逐步恢复设备连接

3. 性能调优命令

bash
# 查看MQTT连接数
emqx_ctl clients list # 检查Kafka积压
kafka-consumer-groups.sh --describe --group data_consumers # 时序数据库维护
timescaledb-tune --quiet --yes

八、扩展架构设计

1. 边缘计算集成

图表

2. 数据管道扩展

python
# 添加AI处理管道
from kafka import KafkaProducer ai_producer = KafkaProducer(bootstrap_servers='kafka:9092') def process_for_ai(data):
# 特征提取
features = extract_features(data) # 发送到AI服务队列
ai_producer.send('ai_processing', json.dumps(features).encode()) # 在清洗服务中调用
process_for_ai(cleaned_data)

3. 多区域部署

bash
# 跨区域EMQX集群
emqx_ctl cluster join emqx@us-east-1.platform.com # 数据库级联复制
# 主库(欧洲)
CREATE PUBLICATION euro_publication FOR TABLE sensor_data; # 从库(亚洲)
CREATE SUBSCRIPTION asia_subscription
CONNECTION 'host=euro-db port=5432 dbname=tsdb'
PUBLICATION euro_publication;

九、前端展示系统

1. 实时数据大屏

javascript
// 使用MQTT.js直接订阅
const client = mqtt.connect('wss://mqtt.example.com:8084/mqtt', {
username: 'web_user',
password: 'secure_token'
}) client.subscribe('sensors/+/status')
client.on('message', (topic, payload) => {
const data = JSON.parse(payload)
updateDashboard(data)
})

2. 设备管理界面功能

  1. 设备状态监控(在线/离线)

  2. 实时数据曲线(Chart.js)

  3. 历史数据查询(时间范围选择)

  4. 告警管理(阈值设置)

  5. 固件OTA升级

3. 移动APP集成

kotlin
// Android数据获取示例
suspend fun fetchSensorData(deviceId: String): List<SensorData> {
return withContext(Dispatchers.IO) {
val response = apiService.getDeviceData(
deviceId = deviceId,
from = Instant.now().minus(1, ChronoUnit.DAYS).toString(),
to = Instant.now().toString()
)
response.data ?: emptyList()
}
}

十、持续演进路线

  1. 阶段1(基础平台)

    • EMQX集群部署

    • 核心数据处理流水线

    • 基础监控

  2. 阶段2(安全加固)

    • 设备证书管理

    • 数据端到端加密

    • 审计日志

  3. 阶段3(智能扩展)

    • 边缘计算节点

    • AI异常检测

    • 预测性维护

  4. 阶段4(全球化部署)

    • 多区域集群

    • 数据主权合规

    • 跨云架构

本方案基于CentOS Stream 8构建了企业级物联网平台,通过多层次安全加固、全链路监控、弹性扩展架构,支持从数百到数百万设备的平滑扩展,日均处理能力可达亿级数据点,满足工业4.0场景需求。

基于CentOS Stream 8的物联网数据采集与展示方案的更多相关文章

  1. Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)

    Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建) 具体案例:局域网内有两台主机,一台Linux.一台Windows,现在需要配置一台Cacti监控服务器对这两台 ...

  2. [转帖]CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布

    CentOS 8.0.1905 和CentOS Stream(滚动发行)正式发布 https://zhuanlan.zhihu.com/p/84001292 还发现openssl 的 版本太高 不兼容 ...

  3. 基于.NET6的开源工业物联网网关

    什么是工业物联网网关 工业物联网网关(IIoTGateway)是一种硬件设备或软件程序,作为本地设备(如PLC.扫码枪.机器人.数控机床.非标上位机等)与云端系统(如物联网平台.SCADA系统.MES ...

  4. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.7. 配置资源与参数

    2.7.配置资源与参数 2.7.1. 修改主机名称 [root@linuxrac1 ~]# cd /etc/sysconfig [root@linuxrac1 sysconfig]# vi netwo ...

  5. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.6. 安装Oracle所依赖的必要包

    2.6. 安装Oracle所依赖的必要包 2.6.1. 检查Oracle所依赖的必要rpm包 [root@localhost /]#rpm -q binutils compat-libstdc elf ...

  6. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.5. 配置网络

    2.5. 配置网络 2.5.1. 配置网络 Oracle Rac数据库涉及到公用网络和私有网络,因此要做网络划分和IP地址规划,下表列出了要安装的RAC数据库对应的IP地址.主机名以及网络连接类型: ...

  7. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.4. 安装JDK

    2.4.安装JDK 2.4.1.准备JDK 在百度搜索:JDK下载 2.4.2.上传JDK put E:\软件安装文件\jdk-8u11-linux-x64.rpm /home/linuxrac1/D ...

  8. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.3配置共享磁盘

    2.3.配置共享磁盘 2.3.1.创建共享磁盘 在cmd中进入WMware Workstation 10.0 安装目录: 1.创建存储Oracle Clusterware文件  (Oracle Clu ...

  9. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.2安装操作系统CentOS5.4

    2.2. 安装操作系统CentOS5.4 两个虚拟机都安装,此步骤在创建虚拟机节点时: 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境所有链接: 1.资源 ...

  10. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:2.搭建环境-2.1创建虚拟机

    2.1.创建虚拟机 2.1.1. 创建虚拟机节点1 2.1.2.  创建虚拟机节点2 操作如节点1. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境所有链 ...

随机推荐

  1. 实现Windows之间(win10)的桌面连接的三步走方法

    实现Windows之间(win10)的远程桌面连接的三步走方法 ‍ 目录 ‍ 目录 实现Windows之间(win10)的远程桌面连接的三步走方法 目录 环境 step1:打开两台Windows电脑的 ...

  2. linux 下给网卡添加ipv6、路由

    route命令的使用举例如下:   route // 显示路由信息.   route add –host 192.168.1.110 dev eth0  // 给网卡eth0的路由表中加入新地址192 ...

  3. ANSYS 导出节点的位移数据

    1. 数据保存 确定待提取的节点编号: 获取节点位移变量: 将节点位移变量存储到数组中,用于数据传递: ! 输出对应节点的位移到csv文件 ! 注意同时导入.db和.rst,并切换到/post26模块 ...

  4. 【Java】可比较泛型建数组传递报强转类型错误解决方案

    问题 可比较泛型怎么新建数组? 自己写基于AVL树的散列表时,在自动扩容的时候需要遍历AVL树的Key,所以需要AVL树提供一个方法返回一个Key数组以遍历,初始实现如下: /** * 用于辅助遍历K ...

  5. leetcode每日一题:向字符串添加空格

    题目 2109. 向字符串添加空格 给你一个下标从 0 开始的字符串 s ,以及一个下标从 0 开始的整数数组 spaces . 数组 spaces 描述原字符串中需要添加空格的下标.每个空格都应该插 ...

  6. 利用 APEX 打造 Oracle 23ai 智能开发平台

    Oracle 23ai 有很多新功能,但用户痛点是不会用. 因此计划开发一个适合小白的图形化界面Oracle 23ai智能开发平台,过程中也能学习APEX的玩法. 本篇先拿Oracle数据库向量操作相 ...

  7. Unity中检查重复的资源

    目的:检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的.因此需要写一个检查工具来检查项目中是否存在重复的资源. ...

  8. @PathVaribale

    /** * @pathVaribale * 作用: 用于获取url 中的占位符的值. * 例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符. * url 支持占位符是 ...

  9. python,循环中通过判断条件中止循环的方法(braek 语句)

    直接对下方代码进行解析 for a in range(5): print(a) if a == 2: break 依次读取range内的数字,并答应出来.当读取出来的数字是2时,结束循环,执行后入下图 ...

  10. CSS定位的写法

    如上图,商品添加完成后,需要验证商品是否添加成功,通过验证商品列表内是否存在指定名称的商品即可实现验证 浏览器自动获取的xpath=//*[@id="ProductName-divrid53 ...