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

2023-04-03 10:13:14 浏览数 (2)

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

1、写在前面

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

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

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

2、正文开始

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

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

1、获取磁盘使用:

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

代码语言:txt复制
QStorageInfo

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

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

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

QStorageInfo 始终高速缓存检索到的信息,但可以调用 refresh() 来使缓存无效。

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

代码语言:c 复制
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;
}

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

2、获取 CPU 利用率:

代码语言:c 复制
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;
}

3、获取内存使用率:

代码语言:c 复制
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;
}

4、获取网络流量:

代码语言:c 复制
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;
}

关于SkeyeARS

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

0 人点赞