当前位置:   article > 正文

全景AR增强监视系统对接SkeyeIVMS视频云管控系统实现软硬件资源的健康状态管理(三)_skeyevss官网

skeyevss官网

全景AR增强监视系统对接SkeyeIVMS视频云管控系统实现软硬件资源的健康状态管理(三)

1、写在前面

前篇我们已经实现了一个 Monitor 所需要大部分的内容。

然而,硬件资源的监控相对来说比较麻烦。

不过,我们可以借助 Qt,实际上它也提供了不少相关的 Api。

2、正文开始

现在我们需要监控机器的硬件资源。

所谓硬件资源,主要分为三种:

1、获取磁盘使用:

Qt 中获取磁盘信息的类为 QStorageInfo

QStorageInfo

允许检索有关卷空间的信息,其装入点,标签和文件系统名称。

您可以通过将卷的挂载点作为构造函数参数传递给函数的挂载点来创建 QStorageInfo 的实例,或者您可以使用 setPath() 方法设置它。 

静态挂载 volumes() 方法可用于获取所有已安装文件系统的列表。

QStorageInfo 始终高速缓存检索到的信息,但可以调用 refresh() 来使缓存无效。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

现在我们使用他实现一个获取磁盘用量的通用接口:

QVariantList MonitorApi::getDrives()
{
    QVariantList drives;
    for (const QStorageInfo &storage: QStorageInfo::mountedVolumes()) {
        if (storage.isValid() && storage.isReady()) {
            if (!storage.isReadOnly()) {
                QVariantMap drive;
                uint driveType;
                QString driveName = storage.name();
#ifdef Q_OS_WIN
                driveType = GetDriveType(LPCWSTR(storage.rootPath().utf16()));
                switch (driveType) {
                case 2:
                    driveName = storage.name().isEmpty() ? QStringLiteral("U盘") : storage.name();
                    break;
                case 3:
                    driveName = storage.name().isEmpty() ? QStringLiteral("本地磁盘") : storage.name();
                    break;
                case 4:
                    driveName = storage.name().isEmpty() ? QStringLiteral("网络磁盘") : storage.name();
                    break;
                case 5:
                    driveName = storage.name().isEmpty() ? QStringLiteral("CD-ROM 驱动器") : storage.name();
                    break;
                case 6:
                    driveName = storage.name().isEmpty() ? QStringLiteral("RAM磁盘") : storage.name();
                    break;
                default:
                    driveName = storage.name().isEmpty() ? QStringLiteral("磁盘") : storage.name();
                    break;
                }
#endif
                drive["drivePath"] = storage.rootPath();
                drive["driveName"] = driveName;
                drive["usedSize"] = storage.bytesTotal() - storage.bytesFree();
                drive["totalSize"] = storage.bytesTotal();
                drives.append(drive);
            }
        }
    }

    return drives;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

当然,Windows 平台的磁盘名稍有不同。

2、获取 CPU 利用率:

qreal MonitorApi::getCpuUsageRate()
{
    qreal usageRate = 0.0;

#ifdef Q_OS_WIN
    static FILETIME preidleTime;
    static FILETIME prekernelTime;
    static FILETIME preuserTime;

    FILETIME idleTime;
    FILETIME kernelTime;
    FILETIME userTime;

    GetSystemTimes(&idleTime, &kernelTime, &userTime);

    quint64 a, b;
    quint64 idle, kernel, user;

    a = (quint64(preidleTime.dwHighDateTime) << 32) | preidleTime.dwLowDateTime;
    b = (quint64(idleTime.dwHighDateTime ) << 32) | idleTime.dwLowDateTime;
    idle = b -a;

    a = (quint64(prekernelTime.dwHighDateTime) << 32) | prekernelTime.dwLowDateTime;
    b = (quint64(kernelTime.dwHighDateTime) << 32) | kernelTime.dwLowDateTime;
    kernel = b - a;

    a = (quint64(preuserTime.dwHighDateTime) << 32) | preuserTime.dwLowDateTime;
    b = (quint64(userTime.dwHighDateTime) << 32) | userTime.dwLowDateTime;
    user = b - a;

    usageRate = qreal(kernel + user - idle) / qreal(kernel + user);

    preidleTime = idleTime;
    prekernelTime = kernelTime;
    preuserTime = userTime;
#endif

    return usageRate > 1.0 ? 1.0 : usageRate;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

3、获取内存使用率:

QVariant MonitorApi::getMemoryStatus()
{
    QVariantMap map;
#ifdef Q_OS_WIN
    MEMORYSTATUSEX statex;
    statex.dwLength = sizeof (statex);
    GlobalMemoryStatusEx(&statex);
    quint64 memoryAll = statex.ullTotalPhys;
    quint64 memoryFree = statex.ullAvailPhys;
    quint64 memoryUsed = memoryAll - memoryFree;
    map["usedSize"] = memoryUsed;
    map["totalSize"] = memoryAll;
#endif

    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

4、获取网络流量:

QVariant MonitorApi::getNetworkStatus()
{
    QVariantMap map;

#ifdef Q_OS_WIN
    static bool initialized = false;
    static quint64 preRecvTotal = 0;
    static quint64 preSendTotal = 0;

    quint64 recvTotal = 0;
    quint64 sendTotal = 0;

    MIB_IF_ROW2 *ifRow;
    PMIB_IF_TABLE2 ifTable;

    if (GetIfTable2(&ifTable) == NO_ERROR)  {
        QSet<QString> addressSet;
        for (DWORD i = 0; i < ifTable->NumEntries; i++) {
            ifRow = (MIB_IF_ROW2 *)&ifTable->Table[i];
            if (ifRow->Type == IF_TYPE_ETHERNET_CSMACD) {
                QString addr;
                for (ULONG i = 0; i < ifRow->PhysicalAddressLength; i++) {
                    addr += QString::number(ifRow->PhysicalAddress[i], 16).rightJustified(2, '0');
                }
                if (!addressSet.contains(addr)) {
                    addressSet.insert(addr);
                    recvTotal += ifRow->InOctets;
                    sendTotal += ifRow->OutOctets;
                    //qDebug() << i << addr << ifRow->InOctets << ifRow->OutOctets;
                }
            }
        }
        FreeMibTable(ifTable);
    }

    if (!initialized) {
        preRecvTotal = recvTotal;
        preSendTotal = sendTotal;
        initialized = true;
    }

    map["downloadSize"] = recvTotal - preRecvTotal;
    map["uploadSize"] = sendTotal - preSendTotal;
    map["trafficSize"] = (recvTotal + sendTotal) - (preRecvTotal + preSendTotal);

    preRecvTotal = recvTotal;
    preSendTotal = sendTotal;
#endif

    return map;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

关于SkeyeARS

SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。

详细说明:http://www.openskeye.cn/web/product/ars

获取更多信息

邮件:support@openskeye.cn

QQ交流群:102644504

SkeyeVSS综合安防互联网无插件播放解决方案

SkeyeARS全景AR增强监视系统解决方案

SkeyeIVMS集群式视频云管控平台解决方案

Copyright © OpenSKEYE Team 2018-2022

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/535750
推荐阅读
相关标签
  

闽ICP备14008679号