ビデオ監視システムは、リソースの共有、データ統合、コンピューティング能力の向上を実現する、計画、構築、展開にクラウドモードを採用しています。また、オープンエコロジーとビジネスインテリジェンスにより、ビデオ監視システムは、実際の戦闘での公安に役立ちます。街はより安全です。TSINGSEE Qingxi Video Teamによって開発されたEasyCVRは、比較的完全なビデオ監視クラウドプラットフォームであり、さまざまなプロトコルでカメラの統合アクセスを実現し、リアルタイムの監視カメラビデオストリーム表示を実現できます。
最近、私たちのR&Dチームは、Hikvision EHomeプライベートプロトコルのR&DをEasyCVRに統合しました。以前のブログ投稿では、Ehome プロトコルの呼び出しプロセスの紹介、おそらくEhomeプロトコルのアクセスプロセスについて説明しました。この記事では、Ehomeプロトコルでのファイル検索操作プロセスについて説明します。
Ehomeプロトコルでのファイル検索操作プロセス
Haikang Ehomeのプライベートプロトコルにアクセスした後、中央管理サービス(CMS)を介してデバイスストレージに保存されたビデオまたはオーディオファイルを検索して、再生に使用することもできます。ファイル検索を実行する前に、NET_ECMS_Initを実行してCMSを初期化し、NET_ECMS_StartListenを実行してCMS監視サービスを開始し、デバイス登録情報を受信してください。
1. NET_ECMS_StartFindFile_V11を呼び出してファイルの検索を開始します
2. NET_ECMS_FindNextFile_V11を呼び出して検索されたファイルを1つずつ列挙します
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();