Hikvision EHome 사설 프로토콜 시리즈 파일 검색 작업 프로세스와 통합 된 영상 감시 시스템 클라우드 솔루션 EasyCVR

영상 감시 시스템은 계획, 구축 및 배포를 위해 클라우드 모드를 채택하여 리소스 공유, 데이터 통합 ​​및 컴퓨팅 성능 향상을 실현하고 개방형 생태 및 비즈니스 인텔리전스를 통해 실제 전투에서 비디오 감시 시스템이 공공 보안에 더 나은 서비스를 제공합니다. 도시는 더 안전합니다. TSINGSEE Qingxi Video Team에서 개발 한 EasyCVR은 비교적 완벽한 비디오 감시 클라우드 플랫폼으로, 서로 다른 프로토콜을 사용하여 카메라에 대한 통합 액세스를 실현하고 실시간 감시 카메라 비디오 스트림보기를 실현할 수 있습니다.

EasyCVR 배경 관리 비디오 액세스 비디오 스퀘어 V1.1.png

최근 우리 R & D 팀은 EasyCVR에 Hikvision EHome 사설 프로토콜의 R & D를 통합했습니다. 이전 블로그 게시물에서는 Ehome 프로토콜 호출 프로세스도입에 대해 이야기했으며 Ehome 프로토콜 액세스 프로세스에 대해 이야기했을 것입니다. 이 기사에서는 Ehome 프로토콜에서 파일 검색 작업 프로세스에 대해 설명합니다.

Ehome 프로토콜에 따른 파일 검색 작업 프로세스

Haikang Ehome의 개인 프로토콜에 액세스 한 후 재생에 사용할 수있는 중앙 관리 서비스 (CMS)를 통해 장치 저장소에 저장된 비디오 또는 오디오 파일을 검색 할 수도 있습니다. 파일 검색을 수행하기 전에 NET_ECMS_Init를 수행하여 CMS를 초기화하고 NET_ECMS_StartListen을 수행하여 CMS 모니터링 서비스를 시작하여 장치 등록 정보를 수신하십시오.

파일 검색의 인터페이스 호출 흐름도

78.png

기본 작동 단계

1. NET_ECMS_StartFindFile_V11을 호출하여 파일 찾기를 시작합니다
. 2. NET_ECMS_FindNextFile_V11을 호출하여 검색된 파일을 하나씩 열거합니다.
3. NET_ECMS_StopFindFile을 호출하여 파일 찾기를 중지합니다
. 4. NET_ECMS_ForceLogout을 호출하여 장치에서 로그 아웃합니다.

#include <stdio.h>
#include <Windows.h>
#include "HCISUPCMS.h"
#include "HCISUPStream.h"
#include "plaympeg4.h"

LONG lLoginID = -1;
LONG lLinkHandle = -1;
LONG lPlayHandle = -1;
FILE *Videofile = NULL;

//初始化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;

//开启监听服务并接收设备注册信息
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;
    }
}

//查找视频文件
NET_EHOME_REC_FILE_COND struFindCond = {0};
struFindCond.dwChannel =1;  //通道号,从1开始
struFindCond.dwRecType = 0xff; //所有类型
struFindCond.dwStartIndex = 0;  //搜索起始位置
struFindCond.dwMaxFileCountPer = 5;  //单次可搜索的最多文件数量

//搜索开始时间
struFindCond.struStartTime.wYear = (WORD)2015;
struFindCond.struStartTime.byMonth = (BYTE)5;
struFindCond.struStartTime.byDay = (BYTE)18;
struFindCond.struStartTime.byHour = (BYTE)10; 
struFindCond.struStartTime.byMinute = (BYTE)0;
struFindCond.struStartTime.bySecond = (BYTE)0;

//搜索结束时间
struFindCond.struStopTime.wYear = (WORD)2015;
struFindCond.struStopTime.byMonth = (BYTE)5;
struFindCond.struStopTime.byDay = (BYTE)18;
struFindCond.struStopTime.byHour = (BYTE)12;
struFindCond.struStopTime.byMinute = (BYTE)59;
struFindCond.struStopTime.bySecond = (BYTE)59;

LONG lSearchType = 0; //查找视频文件
LONG lFileHandle = NET_ECMS_StartFindFile_V11(lLoginID, lSearchType, &struFindCond, sizeof(struFindCond)); //开始文件查找
if (lFileHandle < 0)
{		 
    printf("NET_ECMS_StartFindFile_V11 failed, error code: %d\n", NET_ECMS_GetLastError());
    NET_ECMS_Fini();
    return;
} 
printf("NET_ECMS_StartFindFile_V11!\n");

LONG lRet = -1;
char csTmp[256] = {0};	
char szFileName[MAX_FILE_NAME_LEN] = {0};

NET_EHOME_REC_FILE struFileInfo = {0};

//可在线程中查找文件
while(1)
{
    lRet = NET_ECMS_FindNextFile_V11(lFileHandle, &struFileInfo, sizeof(struFileInfo));//逐个获取搜索结果
    if (lRet == ENUM_GET_NEXT_STATUS_SUCCESS)
    {
        if (struFileInfo.dwFileSize / 1024 == 0)
        {
            sprintf(csTmp,"%d",struFileInfo.dwFileSize);
        }
        else if (struFileInfo.dwFileSize / 1024 > 0 && struFileInfo.dwFileSize /(1024*1024) == 0)
        {
            sprintf(csTmp,"%dK",struFileInfo.dwFileSize/1024);
        }
        else
        {
            sprintf(csTmp,"%dM",struFileInfo.dwFileSize /1024/1024);
        }

        printf("Filename[%s], Filesize[%s], StarTime[%04d-%02d-%02d %02d:%02d:%02d], StopTime[%04d-%02d-%02d %02d:%02d:%02d] \n", \
           struFileInfo.szFileName, csTmp, struFileInfo.struStartTime.wYear, struFileInfo.struStartTime.byMonth, \
           struFileInfo.struStartTime.byDay, struFileInfo.struStartTime.byHour, struFileInfo.struStartTime.byMinute,\
           struFileInfo.struStartTime.bySecond, struFileInfo.struStopTime.byDay, struFileInfo.struStopTime.byHour, \
           struFileInfo.struStopTime.byMinute, struFileInfo.struStopTime.bySecond);//搜索到的文件信息

        memcpy(szFileName, struFileInfo.sFileName, MAX_FILE_NAME_LEN);
    }
    else
    {
        if (lRet == ENUM_GET_NETX_STATUS_NEED_WAIT)
        {
            Sleep(5);
            continue;
        }

        if ((lRet == ENUM_GET_NETX_STATUS_NO_FILE) || (lRet == ENUM_GET_NEXT_STATUS_FINISH))
        {
            printf("No more file!\n");
            break;
        }
        else if(lRet == ENUM_GET_NEXT_STATUS_NOT_SUPPORT)
        {
            printf("Device does not support!\n");
            break;
        }
        else
        {
            printf("Failed to find a file, for the server is busy or network failure!\n");
            break;
        }
    }
}
//CMS停止监听服务
if(!NET_ECMS_StopListen(lListen))
{
    printf("NET_ECMS_StopListen failed, error code: %d\n", NET_ECMS_GetLastError());
}

//释放被CMS占用的资源
NET_ECMS_Fini();

추천

출처blog.csdn.net/EasyNVS/article/details/108081987