視頻監控系統視頻上雲解決方案EasyCVR集成海康EHome私有協議系列——報警模塊說明


視頻聯網雲平台EasyCVR是一個集視頻聯網共享、存儲、流媒體轉發、視頻轉碼、視頻上雲、智能分析統一等多種功能為一體的流媒體視頻服務融合性平台。EasyCVR可以集成海康EHome私有協議,本文講一下EasyCVR集成海康EHome協議報警模塊。

開啟監聽服務並接收設備報警信息依賴於中心管理服務(CMS)和報警管理服務(AMS)。監聽服務開啟后,當報警被觸發時,設備會自動上傳報警,因此可通過配置監聽服務(即AMS)接收報警信息。

開啟監聽服務並接收報警的接口調用流程圖:

操作基本步驟:

1、調用NET_EALARM_StartListen開啟AMS報警監聽並注冊回調函數用於接收報警信息。AMS的IP地址和端口號由CMS發送給設備。

2、當報警觸發時,從AMS注冊的回調函數中獲取報警信息進行處理。

3、調用NET_EALARM_StopListen停止AMS報警監聽。

4、調用NET_ECMS_ForceLogout強制注銷設備

前提條件:
1、請確保已調用NET_ECMS_Init和NET_EALARM_Init初始化CMS和AMS。
2、請確保已調用NET_ECMS_StartListen開啟CMS監聽以接收設備注冊信息。

如果是ehome v4 版本,設備要設置SessionKey,SessionKey可通過回調數據類型“enum_dev_sessionkey”獲得。

開啟監聽服務並接收報警的示例代碼

注:在該示例代碼中,CMS和AMS安裝在同一台電腦的同一個程序中。

#include <stdio.h>
#include <Windows.h>
#include "HCISUPCMS.h"
#include "HCISUPAlarm.h"
 
LONG lLoginID = -1;
LONG lListenHandle = -1;
 
//
//注冊回調函數
BOOL CALLBACK RegisterCallBack(LONG lUserID, DWORD dwDataType, void *pOutBuffer, DWORD dwOutLen, void *pInBuffer, DWORD dwInLen, void *pUser)
{
    if (ENUM_DEV_ON == dwDataType)
    {
        NET_EHOME_DEV_REG_INFO *pDevInfo = (NET_EHOME_DEV_REG_INFO *)pOutBuffer;
 
        if (pDevInfo != NULL)
        {
          lLoginID = lUserID;
          printf("On-line, lUserID: %d, Device ID: %s\n", lLoginID, pDevInfo->byDeviceID);
        }
        //輸入參數
        NET_EHOME_SERVER_INFO *pServerInfo = (NET_EHOME_SERVER_INFO *)pInBuffer;
        pServerInfo->dwTimeOutCount = 6; //心跳超時次數
        pServerInfo->dwKeepAliveSec = 15; //心跳間隔
        memcpy(pServerInfo->struUDPAlarmSever.szIP, "10.16.2.123", sizeof("10.16.2.123")); //報警服務器IP地址(TCP協議) 
        pServerInfo->struUDPAlarmSever.wPort = 7200; //報警服務器端口(UDP協議),需要和報警服務器啟動監聽的端口一致
        pServerInfo->dwAlarmServerType = 0;  //報警服務器類型:0- 只支持UDP協議上報,1- 支持UDP、TCP兩種協議上報
    }
    else if (ENUM_DEV_OFF == dwDataType)
    {
        printf("Off-line, lUserID: %d\n", lUserID);
        NET_ECMS_ForceLogout(lUserID);       
    }
    else
    {
    }
 
    return TRUE;
}
 
//
//AMS報警回調函數
BOOL CALLBACK AlarmMSGCallBack(LONG lHandle, NET_EHOME_ALARM_MSG *pAlarmMsg, void *pUserData)
{
    lListenHandle = lHandle;
 
    DWORD dwType = pAlarmMsg->dwAlarmType;  //不同的報警類型(dwAlarmType),pAlarmInfo對應不同的報警信息類型
    printf("Callback of alarm listening, dwAlarmType[%d]\n", dwType);
 
    switch(dwType)
    {
    case EHOME_ALARM_UNKNOWN://未知報警信息
        printf("Unknown Alarm Type!\n");
        break;
    case EHOME_ALARM://基本報警信息:移動偵測、視頻遮蓋、視頻丟失、PIR報警、人臉偵測、區域入侵等
        NET_EHOME_ALARM_INFO struAlarmInfo;
        memcpy(&struAlarmInfo, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_ALARM_INFO));
        printf("Basic Alarm: Device ID[%s], szAlarmTime[%s], Alarm Type[%d], Action[%d], VideoChannel[%d]!\n", struAlarmInfo.szDeviceID, \
            struAlarmInfo.szAlarmTime, struAlarmInfo.dwAlarmType, struAlarmInfo.dwAlarmAction, struAlarmInfo.dwVideoChannel);
        break;
    case EHOME_ALARM_HEATMAP_REPORT://熱度圖報告上傳
        NET_EHOME_HEATMAP_REPORT struHeatmapInfo;
        memcpy(&struHeatmapInfo, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_HEATMAP_REPORT));
        printf("Heatmap report: Device ID[%s], StartTime[%s], StopTime[%s], dwVideoChannel[%d]!\n", struHeatmapInfo.byDeviceID, \
            struHeatmapInfo.byStartTime, struHeatmapInfo.byStopTime, struHeatmapInfo.dwVideoChannel);
        break;
    case EHOME_ALARM_FACESNAP_REPORT://人臉抓拍報告上傳
        NET_EHOME_FACESNAP_REPORT struFaceSnap;
        memcpy(&struFaceSnap, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_FACESNAP_REPORT));
        printf("Face snap: Device ID[%s], AlarmTime[%s], dwFaceScore[%d], dwVideoChannel[%d]!\n", struFaceSnap.byDeviceID, \
            struFaceSnap.byAlarmTime, struFaceSnap.dwFaceScore, struFaceSnap.dwVideoChannel);
        break;
    case EHOME_ALARM_GPS://GPS信息上傳
        NET_EHOME_GPS_INFO struGpsInfo;
        memcpy(&struGpsInfo, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_GPS_INFO));
        printf("GPS info: Device ID[%s], SampleTime[%s], Longitude[%d], Latitude[%d]!\n", struGpsInfo.byDeviceID, \
            struGpsInfo.bySampleTime, struGpsInfo.dwLongitude, struGpsInfo.dwLatitude );
        break;
    case EHOME_ALARM_CID_REPORT://報警主機CID報警信息
        NET_EHOME_CID_INFO struCIDInfo;
        memcpy(&struCIDInfo, pAlarmMsg->pAlarmInfo, sizeof(NET_EHOME_CID_INFO));
        printf("CID info: Device ID[%s], AlarmTime[%s], CID Code[%d], CID Type[%d], CID Describe[%s]!\n", struCIDInfo.byDeviceID, \
        struCIDInfo.byTriggerTime, struCIDInfo.dwCIDCode, struCIDInfo.dwCIDType, struCIDInfo.byCIDDescribe );
        break;
    default:
        break;
    }
 
    return TRUE;
}
 
void main(){
 
    
    //開啟AMS報警監聽
 
    //AMS初始化
    NET_EALARM_Init();
 
    //報警監聽參數
    NET_EHOME_ALARM_LISTEN_PARAM struListen = {0};
    memcpy(struListen.struAddress.szIP, "10.16.2.123", sizeof("10.16.2.123"));
    struListen.struAddress.wPort = 7200; //報警服務的監聽端口
    struListen.fnMsgCb = AlarmMSGCallBack; //報警回調函數
    struListen.pUserData = NULL;
    struListen.byProtocolType = 1; //0- TCP方式(保留,暫不支持),1- UDP方式
 
    //啟動報警監聽
    LONG lHandle = NET_EALARM_StartListen(&struListen);
    if(lHandle < -1)
    {
        printf("NET_EALARM_StartListen failed, error code: %d\n", NET_EALARM_GetLastError());
        NET_EALARM_Fini();
        return;
    }
    printf("NET_EALARM_StartListen!\n");
    //
 
    
    //CMS注冊模塊初始化
    NET_ECMS_Init();
 
    //注冊監聽參數
    NET_EHOME_CMS_LISTEN_PARAM struCMSListenPara = {0};
    memcpy(struCMSListenPara.struAddress.szIP, "0.0.0.0", sizeof("0.0.0.0"));
    struCMSListenPara.struAddress.wPort = 7660;
    struCMSListenPara.fnCB = RegisterCallBack;
 
    //啟動監聽,接收設備注冊信息,注冊回調函數里面需要發送報警主機IP和端口給設備
    LONG lListen = NET_ECMS_StartListen(&struCMSListenPara);
    if(lListen < -1)
    {
        printf("NET_ECMS_StartListen failed, error code: %d\n", NET_ECMS_GetLastError());
        NET_ECMS_Fini();
        return;
    }
    printf("NET_ECMS_StartListen!\n");
 
    while(1)
    {
        Sleep(1000);  //注冊成功之后再做后續操作
        if(lLoginID >= 0)
        {
            break;
        }
    }
 
    Sleep(300000); //等待5分鍾,接收報警信息
 
    
    //退出
 
    //CMS停止監聽
    if(!NET_ECMS_StopListen(lListen))
    {
        printf("NET_ECMS_StopListen failed, error code: %d\n", NET_ECMS_GetLastError());
    }
 
    //CMS反初始化,釋放資源
    NET_ECMS_Fini();
 
    //AMS停止報警監聽
    if(lListenHandle >= 0)
    {
        if (!NET_EALARM_StopListen(lListenHandle))
        {
            printf("NET_EALARM_StopListen failed, error code: %d\n", NET_ECMS_GetLastError());
        }
    }
    //AMS反初始化,釋放資源
    NET_EALARM_Fini();
 
    printf("Exit!");
}

 如果大家還想了解更多關於EasyCVR集成海康EHome私有協議的調用和說明,可以翻閱TSINGSEE青犀視頻往期相關文章,其中包括:設備錄像回看說明、語音對講操作流程、Ehome協議調用流程介紹等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM