KeremOzcn/industrialsense-iot-monitoring
GitHub: KeremOzcn/industrialsense-iot-monitoring
这是一个专为纺织工厂设计的实时物联网监控与异常检测系统,结合规则引擎和AI预测提升生产可靠性。
Stars: 0 | Forks: 0
# IndustrialSense
**实时物联网传感器监控与异常检测系统 — 专为纺织编织工厂环境设计。**
一款生产级的 Spring Boot 应用程序,用于接收来自工厂车间设备(织机、纱锭、电力系统)的实时传感器数据,运行可配置的基于规则的异常检测,并提供安全的 REST API。内置的 AI 预测器使用 Z 分数分析来预测未来的异常,从而在造成停机前进行预警。
## 架构
```
┌──────────────────────────────────────────────────────────────┐
│ Client / Swagger UI │
└─────────────────────────┬────────────────────────────────────┘
│ HTTP (JWT Bearer)
┌─────────────────────────▼────────────────────────────────────┐
│ sensor-api (Spring Boot 3.2 / Java 17) │
│ │
│ ┌─────────────┐ ┌───────────────────┐ ┌───────────────┐ │
│ │ Auth Layer │ │ REST Controllers │ │ Rate Limit │ │
│ │ JWT / BCrypt│ │ /api/sensors │ │ Bucket4j + │ │
│ └─────────────┘ │ /api/anomalies │ │ Caffeine │ │
│ │ /api/auth │ └───────────────┘ │
│ └────────┬──────────┘ │
│ │ │
│ ┌─────────────────────────▼──────────────────────────────┐ │
│ │ Service Layer │ │
│ │ SensorService │ SensorReadingService │ │
│ │ AnomalyDetectionService │ AIPredictionService │ │
│ │ (rule engine) (async WebClient) │ │
│ └─────────────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌─────────────────────────▼──────────────────────────────┐ │
│ │ Persistence (Spring Data JPA + Flyway) │ │
│ └─────────────────────────┬──────────────────────────────┘ │
└────────────────────────────┼─────────────────────────────────┘
│
┌───────────────────┼──────────────────┐
│ │ │
┌────────▼──────┐ ┌─────────▼──────┐ ┌────────▼──────────┐
│ PostgreSQL 15 │ │ Redis 7 │ │ anomaly-predictor │
│ (primary DB) │ │ (response │ │ FastAPI / Python │
│ │ │ cache) │ │ Z-score model │
└───────────────┘ └────────────────┘ └───────────────────┘
▲
┌────────┴─────────────────────────────────────────────────┐
│ sensor-simulator (Spring Boot, embedded) │
│ Generates realistic readings every 5 s with ±5% noise │
│ and configurable anomaly injection (default: 10%) │
└──────────────────────────────────────────────────────────┘
```
## 传感器类型(纺织工厂领域)
| 类型 | 单位 | 正常范围 | 异常阈值 |
|---|---|---|---|
| `TEMPERATURE` | °C | 22 – 38 | < 10 或 > 52 |
| `HUMIDITY` | %RH | 58 – 76 | < 45 或 > 88 |
| `VIBRATION` | mm/s | 0.3 – 2.1 | < 0 或 > 5.5 |
| `THREAD_TENSION` | cN | 90 – 170 | < 55 或 > 220 |
| `RPM` | rpm | 380 – 710 | < 280 或 > 820 |
| `POWER_CONSUMPTION` | kW | 30 – 100 | < 2 或 > 145 |
## 技术栈
| 层级 | 技术 |
|---|---|
| 语言 | Java 17 |
| 框架 | Spring Boot 3.2.5 |
| 安全 | Spring Security 6, JJWT 0.12.6 (HMAC-SHA256) |
| 持久层 | Spring Data JPA, Hibernate 6, Flyway |
| 数据库 | PostgreSQL 15 (生产) / H2 内存数据库 (开发/测试) |
| 缓存 | Redis 7 + Spring Cache |
| 速率限制 | Bucket4j + Caffeine (有界缓存, 支持 10k 客户端) |
| HTTP 客户端 | Spring WebFlux WebClient (非阻塞) |
| 构建工具 | Maven 3 — 多模块 |
| API 文档 | SpringDoc OpenAPI 3 / Swagger UI |
| AI 预测器 | FastAPI + NumPy (Z 分数, Python 3.11) |
| 测试 | JUnit 5, Mockito, AssertJ, Spring Boot Test |
| 容器化 | Docker, Docker Compose |
## 快速开始
### 选项 1 — Docker Compose (推荐)
启动 PostgreSQL、Redis 和 AI 预测器。同时运行 Spring Boot 应用。
```
# 克隆
git clone && cd JavaProject
# 设置所需密钥
export APP_JWT_SECRET="replace-with-a-256-bit-secret"
export ADMIN_USERNAME="admin"
export ADMIN_PASSWORD="{bcrypt}\$2a\$10\$..." # bcrypt hash
# 启动基础设施
docker compose up -d
# 运行 API (生产配置)
cd sensor-api
mvn spring-boot:run -Dspring-boot.run.profiles=prod
```
- API: `http://localhost:8080`
- 生产环境中 Swagger UI 已禁用(可通过 `springdoc.swagger-ui.enabled=true` 重新启用)
### 选项 2 — 开发模式 (无 Docker)
使用 H2 内存数据库。模拟器自动启动。
```
cd sensor-api
mvn spring-boot:run
```
- API: `http://localhost:8081`
- Swagger UI: `http://localhost:8081/swagger-ui.html`
- H2 控制台: `http://localhost:8081/h2-console`
- 默认凭据: `admin` / `admin123`
## 环境变量(生产环境)
| 变量 | 是否必需 | 描述 |
|---|---|---|
| `APP_JWT_SECRET` | 是 | HMAC-SHA256 签名密钥 (≥ 256 位) |
| `ADMIN_USERNAME` | 是 | 管理员账户用户名 |
| `ADMIN_PASSWORD` | 是 | BCrypt 编码的管理员密码 |
| `SPRING_DATASOURCE_URL` | 是 | PostgreSQL JDBC URL |
| `SPRING_DATASOURCE_USERNAME` | 是 | 数据库用户名 |
| `SPRING_DATASOURCE_PASSWORD` | 是 | 数据库密码 |
| `SPRING_REDIS_HOST` | 是 | Redis 主机名 |
| `AI_PREDICTOR_URL` | 否 | AI 预测器基础 URL (默认: `http://localhost:8000`) |
## API 参考
除 `/api/auth/login` 外,所有端点都需要 `Authorization: Bearer `。
### 认证
```
POST /api/auth/login
```
```
// Request
{ "username": "admin", "password": "admin123" }
// Response
{
"success": true,
"data": {
"token": "eyJ...",
"tokenType": "Bearer",
"expiresIn": 86400
}
}
```
### 传感器
| 方法 | 路径 | 描述 |
|---|---|---|
| `POST` | `/api/sensors` | 注册传感器 |
| `GET` | `/api/sensors?page=0&size=50` | 列出所有传感器(分页) |
| `GET` | `/api/sensors/{id}` | 根据 ID 获取传感器 |
**注册示例:**
```
{
"name": "VIBR-LOOM-01",
"type": "VIBRATION",
"location": "Weaving Hall A",
"unit": "mm/s"
}
```
### 读数
| 方法 | 路径 | 描述 |
|---|---|---|
| `POST` | `/api/sensors/{id}/readings` | 提交读数 |
| `GET` | `/api/sensors/{id}/readings` | 获取读数(分页,最新优先) |
| `GET` | `/api/sensors/{id}/readings?anomalyOnly=true` | 仅异常读数 |
**提交示例:**
```
{ "value": 4.8 }
```
### 异常
| 方法 | 路径 | 描述 |
|---|---|---|
| `GET` | `/api/anomalies` | 所有传感器的所有异常(分页) |
所有响应使用统一的信封格式:
```
{ "success": true, "data": { ... }, "error": null }
```
## 异常检测流水线
当一个读数被提交时,会运行两个引擎:
1. **规则引擎** (`AnomalyDetectionService`) — 同步,在事务内执行。
加载该传感器的所有 `AnomalyRule` 记录并检查每个阈值。如果任何规则被违反(`value < minThreshold` 或 `value > maxThreshold`),则该读数将以 `isAnomaly = true` 持久化保存。
2. **AI 预测器** (`AIPredictionService`) — 异步,非阻塞。
读数保存后,最近的 20 个读数将通过 WebClient 发送到 FastAPI Z 分数服务。如果 `|Z-score| ≥ 3.0` (3-sigma 规则),则会标记一个预测性异常。此过程不会阻塞 HTTP 响应。
## 运行测试
```
cd sensor-api
mvn test
```
**17 个测试 — 0 个失败:**
| 测试套件 | 测试数 | 类型 |
|---|---|---|
| `AnomalyDetectionServiceTest` | 10 — 边界、多规则、空安全 | 单元测试 |
| `SensorIntegrationTest` | 6 — 完整 HTTP、真实 Spring 上下文、H2 | 集成测试 |
| `IndustrialSenseApplicationTests` | 1 — 上下文加载 | 冒烟测试 |
## 项目结构
```
JavaProject/
├── pom.xml # Root parent POM
├── docker-compose.yml # PostgreSQL + Redis + predictor
├── sensor-api/ # Main Spring Boot application
│ └── src/
│ ├── main/java/com/industrialsense/
│ │ ├── controller/ # REST controllers (Auth, Sensor, Anomaly)
│ │ ├── service/ # Business logic
│ │ ├── model/ # JPA entities
│ │ ├── dto/ # Request / response Java records
│ │ ├── repository/ # Spring Data JPA repositories
│ │ ├── security/ # JWT provider, auth filter, SecurityConfig
│ │ ├── config/ # CORS, cache, OpenAPI, properties
│ │ └── filter/ # RateLimitFilter, RequestLoggingFilter
│ └── test/java/com/industrialsense/
│ ├── SensorIntegrationTest.java
│ └── service/AnomalyDetectionServiceTest.java
├── sensor-simulator/ # Embedded scheduled data generator
│ └── src/main/java/.../simulator/
│ └── SensorDataGenerator.java
└── anomaly-predictor/ # Python AI microservice
├── main.py # Z-score prediction endpoint (FastAPI)
├── requirements.txt
└── Dockerfile
```
## 安全设计
- JWT 认证 (HMAC-SHA256, 符合 RFC 6750 — `expiresIn` 单位为秒)
- BCrypt 密码哈希
- 速率限制:每 IP 每 10 秒 20 次请求 — 使用 Caffeine 支持的有界缓存(最大 10k 条目,2 分钟 TTL)的 Bucket4j
- 所有日志记录的请求 URI 均防止 CRLF 注入
- 所有请求 DTO 使用 Bean 验证 (`@NotBlank`, `@NotNull`, `@Size`, `@Pattern`)
- 不信任 `X-Forwarded-For` — 客户端 IP 仅从 `remoteAddr` 解析
- 生产环境禁用 Swagger UI 和 H2 控制台
- 通配符 CORS 限制于 `@Profile("!prod")`
- 无硬编码密钥 — 所有凭据在启动时从环境变量获取;如果未设置,`@NotBlank` 验证会快速失败
## 许可证
MIT
标签:AV绕过, Docker, FastAPI, JWT认证, REST API, Spring Boot, Swagger UI, TCP/UDP协议, Z-score分析, 云计算, 人工智能, 传感器数据处理, 域名枚举, 安全防御评估, 工业物联网, 异常检测, 搜索引擎查询, 测试用例, 生产环境部署, 用户模式Hook绕过, 纺织制造, 缓存优化, 规则引擎, 请求拦截, 预测性维护