IOT物联网设备统计指标体系与计算方法
🟢 在线设备数
定义
当前时刻与云端平台保持稳定网络连接、可正常接收指令和上报数据的活跃设备数量。
计算方式
# 设备统计指标计算说明
## 📊 概述
本文档详细说明系统中各设备统计指标的定义和计算方式,所有计算均基于真实数据源,确保数据的准确性和实时性。
## 🖥️ 设备总数
### 定义
系统中已完成注册、激活并投入使用的物理设备总量,反映业务规模和市场覆盖范围。
### 计算方式
```sql
-- 核心数据表:device
-- 关键字段:is_deleted(软删除标记)
SELECT COUNT(*) AS total_devices
FROM device
WHERE is_deleted = 0 -- 排除逻辑删除设备
AND device_id IS NOT NULL -- 设备ID非空验证
AND status IN ('ONLINE', 'OFFLINE', 'ACTIVE', 'INACTIVE'); -- 有效状态验证
核心代码
/**
* 设备总数计算 - 企业级实现
*/
public Long getTotalDeviceCount() {
return deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0) // 软删除过滤
.isNotNull(Device::getDeviceId) // 设备ID完整性校验
.in(Device::getStatus,
Arrays.asList("ONLINE", "OFFLINE", "ACTIVE", "INACTIVE")) // 状态有效性验证
);
}
-- 多维度在线状态判定
SELECT COUNT(DISTINCT d.device_id) AS online_devices
FROM device d
LEFT JOIN device_status_log dsl ON d.device_id = dsl.device_id
WHERE d.is_deleted = 0
AND d.status = 'ONLINE' -- 设备表状态
AND (dsl.status = 'ONLINE' OR dsl.status IS NULL) -- 状态日志校验
AND (dsl.event_time >= DATE_SUB(NOW(), INTERVAL 5 MINUTE) -- 5分钟内活跃
OR dsl.event_time IS NULL)
AND d.last_online_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE); -- 10分钟内在线
核心代码
/**
* 在线设备数计算 - 多维度交叉验证
*/
public Long calculateOnlineDevices() {
// 1. 基础状态统计
Long baseOnlineCount = deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0)
.eq(Device::getStatus, "ONLINE")
);
// 2. Redis实时状态验证
Set<String> redisOnlineDevices = redisTemplate.keys("device:status:ONLINE:*");
Long redisOnlineCount = redisOnlineDevices != null ?
(long) redisOnlineDevices.size() : 0L;
// 3. 状态日志时间窗口验证
Long recentOnlineCount = deviceStatusLogMapper.selectCount(
Wrappers.<DeviceStatusLog>lambdaQuery()
.eq(DeviceStatusLog::getStatus, "ONLINE")
.ge(DeviceStatusLog::getEventTime,
DateUtils.addMinutes(new Date(), -5)) // 5分钟时间窗口
);
// 4. 综合判定:取最小值确保准确性
return Math.min(Math.min(baseOnlineCount, redisOnlineCount), recentOnlineCount);
}
🔴 离线设备数
定义
当前无法与云端建立稳定连接、处于失联状态的设备数量,反映网络稳定性和设备健康度。
计算方式
-- 离线设备综合判定
SELECT COUNT(*) AS offline_devices
FROM device d
WHERE d.is_deleted = 0
AND (
-- 条件1:设备表状态为离线
d.status = 'OFFLINE'
-- 条件2:最后在线时间超过阈值
OR (d.last_online_time < DATE_SUB(NOW(), INTERVAL 15 MINUTE)
AND d.status != 'ONLINE')
-- 条件3:状态日志中最近无在线记录
OR NOT EXISTS (
SELECT 1 FROM device_status_log dsl
WHERE dsl.device_id = d.device_id
AND dsl.status = 'ONLINE'
AND dsl.event_time >= DATE_SUB(NOW(), INTERVAL 10 MINUTE)
)
);
核心代码
/**
* 离线设备统计 - 多层次判定算法
*/
public DeviceHealthStats calculateOfflineDevices() {
DeviceHealthStats stats = new DeviceHealthStats();
// 1. 基础离线统计
Long baseOffline = deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0)
.eq(Device::getStatus, "OFFLINE")
);
// 2. 疑似离线设备(状态不一致)
Long suspectedOffline = deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0)
.ne(Device::getStatus, "ONLINE")
.lt(Device::getLastOnlineTime,
DateUtils.addMinutes(new Date(), -15))
);
stats.setTotalOffline(baseOffline + suspectedOffline);
return stats;
}
🔥 活跃设备
定义
在特定时间范围内产生实际业务操作(按摩任务)的设备数量,反映设备的实际使用价值和用户活跃度。
计算方式
-- 活跃设备多时间维度统计
SELECT
COUNT(DISTINCT device_id) AS active_devices,
time_range
FROM (
-- 今日活跃
SELECT device_id, 'today' AS time_range
FROM massage_task
WHERE DATE(create_time) = CURDATE()
UNION ALL
-- 本周活跃
SELECT device_id, 'week' AS time_range
FROM massage_task
WHERE YEARWEEK(create_time) = YEARWEEK(CURDATE())
UNION ALL
-- 本月活跃
SELECT device_id, 'month' AS time_range
FROM massage_task
WHERE YEAR(create_time) = YEAR(CURDATE())
AND MONTH(create_time) = MONTH(CURDATE())
) AS activity
GROUP BY time_range;
核心代码
/**
* 活跃设备分析 - 多时间维度统计
*/
public Map<String, ActiveDeviceStats> calculateActiveDevices() {
Map<String, ActiveDeviceStats> statsMap = new HashMap<>();
// 1. 今日活跃设备
ActiveDeviceStats todayStats = new ActiveDeviceStats();
todayStats.setActiveCount(massageTaskMapper.selectTodayActiveDeviceCount(
DateUtils.getTodayStart(), new Date()));
statsMap.put("today", todayStats);
// 2. 本周活跃设备
ActiveDeviceStats weekStats = new ActiveDeviceStats();
weekStats.setActiveCount(massageTaskMapper.selectActiveDeviceCountByPeriod(
DateUtils.getWeekStart(), new Date()));
statsMap.put("week", weekStats);
// 3. 本月活跃设备
ActiveDeviceStats monthStats = new ActiveDeviceStats();
monthStats.setActiveCount(massageTaskMapper.selectActiveDeviceCountByPeriod(
DateUtils.getMonthStart(), new Date()));
statsMap.put("month", monthStats);
return statsMap;
}
📈 设备在线率
定义
在线设备在总设备中的占比,反映整体设备连接稳定性和网络服务质量,是基础设施健康度的核心指标。
计算方式
-- 设备在线率精确计算
SELECT
ROUND(
(COUNT(CASE WHEN status = 'ONLINE' THEN 1 END) * 100.0 / COUNT(*)),
2
) AS online_rate_percent,
COUNT(*) AS total_devices,
COUNT(CASE WHEN status = 'ONLINE' THEN 1 END) AS online_devices
FROM device
WHERE is_deleted = 0
AND device_id IN (
SELECT DISTINCT device_id FROM device_status_log
WHERE event_time >= DATE_SUB(NOW(), INTERVAL 24 HOUR)
); -- 24小时内有状态更新的设备
核心代码
/**
* 设备在线率计算 - 企业级精度保障
*/
public DeviceOnlineRate calculateOnlineRate() {
DeviceOnlineRate rate = new DeviceOnlineRate();
// 1. 获取有效设备总数(24小时内有状态更新)
Long totalValidDevices = deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0)
.in(Device::getDeviceId,
deviceStatusLogMapper.selectRecentActiveDevices(24))
);
// 2. 获取稳定在线设备数(排除瞬时在线)
Long stableOnlineDevices = deviceMapper.selectCount(
Wrappers.<Device>lambdaQuery()
.eq(Device::getIsDeleted, 0)
.eq(Device::getStatus, "ONLINE")
.ge(Device::getLastOnlineTime,
DateUtils.addMinutes(new Date(), -30))
);
// 3. 计算精确在线率
double onlineRate = totalValidDevices > 0 ?
(double) stableOnlineDevices / totalValidDevices * 100 : 0;
rate.setOnlineRate(Math.round(onlineRate * 100) / 100.0);
rate.setTotalDevices(totalValidDevices);
rate.setOnlineDevices(stableOnlineDevices);
return rate;
}
💪 设备使用率
定义
在特定时间范围内产生业务价值的设备占比,直接反映设备资产利用效率和投资回报率。
计算方式
-- 设备使用率多维度分析
SELECT
-- 基础使用率
ROUND(
(COUNT(DISTINCT mt.device_id) * 100.0 / COUNT(DISTINCT d.device_id)),
2
) AS overall_usage_rate
FROM device d
LEFT JOIN (
-- 设备使用统计子查询
SELECT
device_id,
COUNT(*) AS daily_tasks,
SUM(task_time) AS total_duration
FROM massage_task
WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) -- 近7天数据
GROUP BY device_id
) mt ON d.device_id = mt.device_id
WHERE d.is_deleted = 0;
核心代码
/**
* 设备使用率深度分析
*/
public DeviceUsageAnalytics analyzeDeviceUsage() {
DeviceUsageAnalytics analytics = new DeviceUsageAnalytics();
// 1. 基础使用率计算
Long totalDevices = getTotalDeviceCount();
Long usedDevices = massageTaskMapper.selectCount(
Wrappers.<MassageTask>lambdaQuery()
.select(MassageTask::getDeviceId)
.ge(MassageTask::getCreateTime,
DateUtils.addDays(new Date(), -7)) // 近7天
.groupBy(MassageTask::getDeviceId)
);
double basicUsageRate = totalDevices > 0 ?
(double) usedDevices / totalDevices * 100 : 0;
analytics.setBasicUsageRate(basicUsageRate);
analytics.setAnalysisPeriod("7d");
return analytics;
}
🎯 关键业务逻辑说明
数据源说明
-
设备基础信息:来自
device表 -
设备状态:来自
device表的status字段 +device_status_log表 -
设备使用记录:来自
massage_task表 -
实时状态:来自 Redis 缓存
时间范围定义
-
今日:从当天00:00:00到当前时间
-
本周:从当周第一天00:00:00到当前时间
-
本月:从当月1日00:00:00到当前时间
-
实时状态:基于设备最后上报状态和时间窗口
数据准确性保障
-
软删除机制:所有查询都排除
is_deleted = 1的记录 -
多源验证:设备表、状态日志、Redis缓存三重验证
-
时间窗口过滤:5分钟活跃时间窗口,排除瞬时连接
-
去重计数:活跃设备统计使用
DISTINCT确保准确性 -
完整性校验:核心字段非空验证,状态有效性验证
📋 示例数据
| 指标 | 计算值 | 说明 |
|---|---|---|
| 设备总数 | 156台 | 系统中所有有效注册设备 |
| 在线设备数 | 128台 | 当前稳定在线连接的设备 |
| 离线设备数 | 28台 | 当前离线或连接异常的设备 |
| 活跃设备数(今日) | 89台 | 今日有使用记录的设备 |
| 设备在线率 | 82.05% | 稳定在线设备占比 |
| 设备使用率(7天) | 57.05% | 近7天有使用记录的设备占比 |
🔄 更新频率
-
实时指标:设备状态、在线/离线数量(实时更新)
-
每日指标:活跃设备、使用率(每日零点重置)
-
月度指标:月度使用统计(每月1日重置)
-
健康度评分:每小时计算更新
📊 数据驱动决策 · 🔧 技术保障准确 · 💰 分析创造价值
我们根据提供的1.md文件内容,提取真实数据的计算方式,并按照要求的格式编写README文档。
注意:我们只关注真实数据的计算,假数据部分忽略。
根据1.md文件,我们可以提取每个指标的定义和计算方式(包括SQL和Java代码)。
我们将按照以下结构组织每个指标:
-
定义
-
计算方式(包括SQL和Java代码片段)
但是,请注意,1.md文件中有些指标有多个计算维度(例如活跃设备有今日、本周、本月),在README中我们重点说明核心计算逻辑。
由于README要求重点解释真实数据的计算方式,我们将从1.md中提取真实数据计算的部分,忽略假数据部分。
更多推荐
所有评论(0)