用于打印海康设备告警的小程序

#include <stdio.h>
#include <assert.h>
#include <time.h>
#include <Windows.h>
#include "HCNetSDK.h"

#define ERR     NET_DVR_GetLastError()
#define ERR_MSG NET_DVR_GetErrorMsg()

#define PRINT_INFO(bCondition, strFunction) if (bCondition) printf("\n%s OK!", strFunction); else printf("\n%s fail, error = %d, msg = %s", strFunction, ERR, ERR_MSG)

class AutoLib
{
public:
AutoLib()
{
   PRINT_INFO(NET_DVR_Init(), "NET_DVR_Init");
}

~AutoLib()
{
   PRINT_INFO(NET_DVR_Cleanup(), "NET_DVR_Cleanup");
}
};

class AutoUser
{
public:
AutoUser() : m_userId(-1)
{
   const char* file = ".\\hik.ini";
   const char* section = "config";

   char ip[32] = {0};
   DWORD ret = GetPrivateProfileString(section, "ip", "192.168.0.189", ip, sizeof(ip), file);
   DWORD port = GetPrivateProfileInt(section, "port", 8000, "hik.ini");

   char username[32] = {0};
   ret = GetPrivateProfileString(section, "username", "admin", username, sizeof(username), file);

   char password[32] = {0};
   ret = GetPrivateProfileString(section, "password", "1234", password, sizeof(password), file);

   printf("\nip = %s, port = %d, username = %s, password = %s", ip, port, username, password);
   NET_DVR_DEVICEINFO i = {0};
   m_userId = NET_DVR_Login(ip, port, username, password, &i);
   PRINT_INFO((m_userId >= 0), "NET_DVR_Login");
}

~AutoUser()
{
   PRINT_INFO(NET_DVR_Logout(m_userId), "NET_DVR_Logout");
}

LONG GetUserId() const
{
   return m_userId;
}
private:
LONG m_userId;
};

const char* strAlarm[10] =
{
"external alarm",//0
"disk full",//1
"video lost",//2
"motion",//3
"disk not format",//4
"disk error",//5
"shelter",//6
"unmatch",//7
"invalid access",//8
"com status"//9
};

void fPrintArray(FILE* f, const char* name, const DWORD* p, size_t count)
{
fprintf(f, "\n%20s: ", name);
for (size_t i = 0; i < count; ++i)
{
   fprintf(f, "%d ", p[i]);
}
}

BOOL CALLBACK OnMessage(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen, DWORD dwUser);

class AutoListener
{
public:
AutoListener(LONG userId) : m_alarmHandle(-1), m_file(NULL)
{
   BOOL b = NET_DVR_SetDVRMessageCallBack(OnMessage, (DWORD)this);
   PRINT_INFO(b, "NET_DVR_SetDVRMessageCallBack");

   b = NET_DVR_StartListen(NULL, 7200);
   PRINT_INFO(b, "NET_DVR_StartListen");
   if (b)
   {
    m_alarmHandle = NET_DVR_SetupAlarmChan(userId);
    PRINT_INFO((m_alarmHandle >= 0), "NET_DVR_SetupAlarmChan");
    m_file = fopen("hik_alm.txt", "w");
   }
}

~AutoListener()
{
   BOOL b = NET_DVR_CloseAlarmChan(m_alarmHandle);
   PRINT_INFO(b, "NET_DVR_CloseAlarmChan");
   b = NET_DVR_StopListen();
   PRINT_INFO(b, "NET_DVR_StopListen");

   fclose(m_file);
}

FILE* GetFile()
{
   return m_file;
}
private:
LONG m_alarmHandle;
FILE* m_file;
};

BOOL CALLBACK OnMessage(LONG lCommand,char *sDVRIP,char *pBuf,DWORD dwBufLen, DWORD dwUser)
{
AutoListener* listener = (AutoListener*)dwUser;

if (lCommand == COMM_ALARM)
{
   assert(dwBufLen == sizeof(NET_DVR_ALARMINFO));
   NET_DVR_ALARMINFO* p = (NET_DVR_ALARMINFO*)pBuf;

   char str[30] = {0};
   time_t now = time(NULL);
   struct tm datetime = {0};  
   localtime_s(&datetime, &now);
   _snprintf_s(str, 30, 30, "%d-%02d-%02d %02d:%02d:%02d",datetime.tm_year+1900,datetime.tm_mon+1,datetime.tm_mday,datetime.tm_hour,datetime.tm_min,datetime.tm_sec);

   //print to stdout
   fprintf(stdout, "\nOnMessage %s==============================", str);
   fprintf(stdout, "\n%20s: %s", "dwAlarmType", strAlarm[p->dwAlarmType]);
   fprintf(stdout, "\n%20s: %d", "dwAlarmInputNumber", p->dwAlarmInputNumber);
   fPrintArray(stdout, "dwAlarmOutputNumber", p->dwAlarmOutputNumber, MAX_ALARMOUT);
   fPrintArray(stdout, "dwAlarmRelateChannel", p->dwAlarmRelateChannel, MAX_CHANNUM);
   fPrintArray(stdout, "dwChannel", p->dwChannel, MAX_CHANNUM);
   fPrintArray(stdout, "dwDiskNumber", p->dwDiskNumber, MAX_DISKNUM);

   //print to file
   fprintf(listener->GetFile(), "\nOnMessage %s==============================", str);
   fprintf(listener->GetFile(), "\n%20s: %s", "dwAlarmType", strAlarm[p->dwAlarmType]);
   fprintf(listener->GetFile(), "\n%20s: %d", "dwAlarmInputNumber", p->dwAlarmInputNumber);
   fPrintArray(listener->GetFile(), "dwAlarmOutputNumber", p->dwAlarmOutputNumber, MAX_ALARMOUT);
   fPrintArray(listener->GetFile(), "dwAlarmRelateChannel", p->dwAlarmRelateChannel, MAX_CHANNUM);
   fPrintArray(listener->GetFile(), "dwChannel", p->dwChannel, MAX_CHANNUM);
   fPrintArray(listener->GetFile(), "dwDiskNumber", p->dwDiskNumber, MAX_DISKNUM);
}
return TRUE;
}

int main()
{
AutoLib lib;
AutoUser user;
AutoListener listener(user.GetUserId());

while (1)
{
   printf("\npress q to quit.");
   if (getchar() == 'q')
   {
    break;
   }
}

return 0;
}

类别:c++ 查看评论

原文链接: https://www.cnblogs.com/joeguo/archive/2010/09/02/1889242.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    用于打印海康设备告警的小程序

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14617

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:19
下一篇 2023年2月7日 下午2:19

相关推荐