全景AR增强监视系统对接SkeyeIVMS视频云管控系统实现软硬件资源的健康状态管理(二)
1、写在前面
上一篇中我们简单讲解了 健康状态
的功能。
实际上,仅仅从效果图上看不足以了解。
所以接下来,我们准备好实现一个简单的 健康状态场景
,才能理解其强大。
2、正文开始
首先,健康状态
的实质是 状态监控
,这点我们一点要记住。
因此,我们首先需要一个无限获取状态的 Linux 守护进程
或 Windows 服务
。
这里先简单称其为 Monitor
。
我们的 SkeyeARS
需要 Monitor
提供所有的软硬件状态。
因此,Monitor
需要做到以下几点:
- 提供设备的软件资源监控。
而我们主要实现的是对运行程序的监控,即所谓的 看门狗
。
所以只需要获取监控程序运行状态即可,下面是获取进程数的 Windows
实现。
int MonitorApi::getProcessCount(const QString &processName)
{
//进程计数
static bool initialized = false;
int count = 0;
QString fileName = QFileInfo(processName).fileName();
QString fullName = QDir::toNativeSeparators(QFileInfo(processName).absoluteFilePath());
#ifdef Q_OS_WIN
if (!initialized) {
//提升进程权限
LUID luidTmp;
HANDLE tokenHnadle;
TOKEN_PRIVILEGES tkp;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &tokenHnadle)) {
if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp)) {
qDebug() << "LookupPrivilegeValue Faile! Error =" << GetLastError();
CloseHandle(tokenHnadle);
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luidTmp;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!AdjustTokenPrivileges(tokenHnadle, FALSE, &tkp, sizeof(tkp), NULL, NULL)) {
qDebug() << "AdjustTokenPrivileges Faile! Error =" << GetLastError();
CloseHandle(tokenHnadle);
}
CloseHandle(tokenHnadle);
}
initialized = true;
}
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
//创建进程快照句柄
HANDLE processSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
//创建句柄失败
if (processSnapshotHandle == INVALID_HANDLE_VALUE)
return -1;
//找第一个
bool isExist = Process32First(processSnapshotHandle, &pe32);
while(isExist) {
auto name = QString::fromWCharArray(pe32.szExeFile);
//进程名不区分大小写
if(fileName.compare(name, Qt::CaseInsensitive) == 0) {
HMODULE modules[512] = {0};
DWORD needed = 0;
TCHAR mouduleName[MAX_PATH];
BOOL is64Process;
HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
if (processHandle) {
IsWow64Process(processHandle, &is64Process); //判断是32位还是64位进程
EnumProcessModulesEx(processHandle, modules, sizeof(modules), &needed, is64Process ? LIST_MODULES_32BIT : LIST_MODULES_64BIT);
if (needed > 0) {
GetModuleFileNameEx(processHandle, modules[0], mouduleName, MAX_PATH);
if (QString::fromWCharArray(mouduleName) == fullName)
count ;
}
CloseHandle(processHandle);
}
}
//找下一个
isExist = Process32Next(processSnapshotHandle, &pe32);
}
#endif
return count;
}
- 提供机器的硬件资源监控。
所谓硬件资源,主要分为三种:
1、磁盘使用。
2、CPU 利用率。
3、内存使用率。
4、网络流量。
- 提供状态给所有需要的系统( 例如
SkeyeARS
)。
而如何将状态提供给其他系统呢,一种想法使用消息队列。
我们可以将获取到的软硬件资源,封装后发布出去。
对于感兴趣的系统,则可以按自己的需要,订阅消息即可。
在我们的 Monitor
中,采用的消息队列为:ZeroMQ
。
关于SkeyeARS
SkeyeARS全景AR增强监视系统, 是视开科技开发的一款基于宽场景多路视频无缝拼接、视频实时增强、监视目标增强显示、目标自动跟踪、视频存储回放、远程数据传输和多通道全景视频同步显示等功能的综合视频AR增强监视系统,广泛应用于智慧交通、智慧城市、智慧机场等大场景智能监控领域。