Configure Door Control Schedule

You can configure the week or holiday schedule to regularly control the door statuses, including Remain Open (access without authentication), Remain Closed (access is not allowed), and Normal (access with authentication), in some specific time periods.

  • Make sure you have called NET_DVR_Init to initialize the development environment.

  • Make sure you have called NET_DVR_Login_V40 to log in to device.

Figure 1 Programming Flow of Configuring Door Control Schedule

  1. Call NET_DVR_GetDeviceAbility, specify the capability type dwAbilityType to "ACS_ABILITY", set the input buffer (pInBuf) to XML_Desc_AcsAbility for getting the access control capability to check if configuring door control schedule is supported.

    The capability is returned in the message XML_AcsAbility by the output pointer (pOutBuf).

    If the node <DoorStatusPlan> is returned, it indicates that configuring door control schedule is supported, and you can continue to perform the following steps.

    Otherwise, configuring door control schedule is not supported, please end this task.

  2. Perform one of the following operations to set week or holiday schedule for door control.
      1. Call NET_DVR_GetDVRConfig with "NET_DVR_GET_WEEK_PLAN_CFG" (command No.: 2100) to get the existing week schedule configurations for reference.

        Note:

        The week schedule parameters are returned in the structure NET_DVR_WEEK_PLAN_CFG by output buffer (lpOutBuffer).

      2. Call NET_DVR_SetDVRConfig with "NET_DVR_SET_WEEK_PLAN_CFG" (command No.: 2101) and set the input buffer (lpInBuffer) to NET_DVR_WEEK_PLAN_CFG for setting the week schedule.

      1. Call NET_DVR_GetDVRConfig with "NET_DVR_GET_DOOR_STATUS_HOLIDAY_PLAN" (command No.: 2102) to get the existing holiday schedule configurations for reference.

        Note:

        The holiday schedule parameters are returned in the structure NET_DVR_HOLIDAY_PLAN_CFG by output buffer (lpOutBuffer).

      2. Call NET_DVR_SetDVRConfig with "NET_DVR_SET_DOOR_STATUS_HOLIDAY_PLAN" (command No.: 2103) and set the input buffer (lpInBuffer) to NET_DVR_HOLIDAY_PLAN_CFG for setting the week schedule.

      3. Call NET_DVR_GetDVRConfig with "NET_DVR_GET_DOOR_STATUS_HOLIDAY_GROUP" (command No.: 2104) to get the existing holiday group configurations for reference.

        Note:

        The holiday group parameters are returned in the structure NET_DVR_HOLIDAY_GROUP_CFG by output buffer (lpOutBuffer).

      4. Call NET_DVR_SetDVRConfig with "NET_DVR_SET_DOOR_STATUS_HOLIDAY_GROUP" (command No.: 2105) and set the input buffer (lpInBuffer) to NET_DVR_HOLIDAY_GROUP_CFG for adding the configured holiday schedule to a holiday group.

  3. Optional: Call NET_DVR_GetDVRConfig with "NET_DVR_GET_DOOR_STATUS_PLAN_TEMPLATE" (command No.: 2106) to get the existing schedule template configurations for reference.
    Note:

    The schedule template parameters are returned in the structure NET_DVR_PLAN_TEMPLATE by output buffer (lpOutBuffer).

  4. Call NET_DVR_SetDVRConfig with "NET_DVR_SET_DOOR_STATUS_PLAN_TEMPLATE" (command No.: 2107) and set the input buffer (lpInBuffer) to NET_DVR_PLAN_TEMPLATE for setting the schedule template.
  5. Optional: Call NET_DVR_GetDVRConfig with "NET_DVR_GET_DOOR_STATUS_PLAN" (command No.: 2110) to get the existing door control schedule configurations for reference.
    Note:

    The door control schedule parameters are returned in the structure NET_DVR_DOOR_STATUS_PLAN by output buffer (lpOutBuffer).

  6. Call NET_DVR_SetDVRConfig with "NET_DVR_SET_DOOR_STATUS_PLAN" (command No.: 2111) and set the input buffer (lpInBuffer) to NET_DVR_DOOR_STATUS_PLAN for linking the configured template to the door control schedule and finishing the configuration.

Sample Code for Configuring Door Control Schedule

#include <stdio.h>
#include <iostream>
#include <afx.h>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;

void main()
{
	//---------------------------------------
	//Initialize
	NET_DVR_Init();
	
	//Set connection timeout and reconnection function
	NET_DVR_SetConnectTime(2000, 1);
	NET_DVR_SetReconnect(10000, true);
	
	//---------------------------------------
	//Log in to device
	LONG lUserID;
	//Login parameters, including device IP address, user name, password, and so on
	NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
	struLoginInfo.bUseAsynLogin = 0; //Synchronous login mode
	strcpy(struLoginInfo.sDeviceAddress, "192.168.1.64"); //Device IP address
	struLoginInfo.wPort = 8000; //Device service port number
	strcpy(struLoginInfo.sUserName, "admin"); //User name
	strcpy(struLoginInfo.sPassword, "abcd1234"); //Password
	
	//Device information, output parameter
	NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};
	
	lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
	if (lUserID < 0)
	{
		printf("Login failed, error code: %d\n", NET_DVR_GetLastError());
		NET_DVR_Cleanup();
		return;
	}	

	//---------------------------------------
	//Set door status schedule, template 1 linked to door 1
	NET_DVR_DOOR_STATUS_PLAN struDoorStatusPlan = {0};
	struDoorStatusPlan.dwSize = sizeof(struDoorStatusPlan);
	struDoorStatusPlan.dwTemplateNo = 1;//Schedule template 1

	BOOL bRet1 = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_DOOR_STATUS_PLAN, 1, \
		&struDoorStatusPlan, sizeof(struDoorStatusPlan));
	if (!bRet1)
	{
		printf("Setting door status schedule failed, error:%d.\n", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return;
	}

	//Set door status schedule template 1, template 1 links to week schedule 1 and holiday group 1
	CString	m_csTemplateName = "door status schedule template 1";
	NET_DVR_PLAN_TEMPLATE struPlanTem = {0};
	struPlanTem.dwSize = sizeof(struPlanTem);
	struPlanTem.byEnable = 1;//Enable or not: 0-No, 1-Yes
	strncpy((char *)struPlanTem.byTemplateName, (LPCTSTR)m_csTemplateName, TEMPLATE_NAME_LEN);
	struPlanTem.dwWeekPlanNo = 1;//Week schedule No.1
	struPlanTem.dwHolidayGroupNo[0] = 1;//Holiday group No.1, up to 16 holiday groups can be linked to each schedule
	//struPlanTem.dwHolidayGroupNo[1] = 2;//Holiday group No.2

	BOOL bRet2 = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_DOOR_STATUS_PLAN_TEMPLATE, 1, \
		&struPlanTem, sizeof(struPlanTem));
	if (!bRet2)
	{
		printf("Setting door status schedule template failed, error:%d.\n", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return;
	}

	//Set week schedule 1 for door status
	NET_DVR_WEEK_PLAN_CFG struWeekPlan = {0};
	struWeekPlan.dwSize = sizeof(struWeekPlan);
	struWeekPlan.byEnable = 1;//Enable week scheudle
	
	NET_DVR_SINGLE_PLAN_SEGMENT struSinglePlanSegment = {0};
	LPNET_DVR_SINGLE_PLAN_SEGMENT lpPlanSegment = &struSinglePlanSegment;
	struSinglePlanSegment.byEnable = 1;
	struSinglePlanSegment.byDoorStatus = 3;//Door status: 0-invalid, 1-sleepy, 2-remain open, 3-remain closed.
	struSinglePlanSegment.struTimeSegment.struBeginTime.byHour = 0;//Start time
	struSinglePlanSegment.struTimeSegment.struBeginTime.byMinute = 0;
	struSinglePlanSegment.struTimeSegment.struBeginTime.bySecond = 0;

	struSinglePlanSegment.struTimeSegment.struEndTime.byHour = 23;//End time
	struSinglePlanSegment.struTimeSegment.struEndTime.byMinute = 59;
	struSinglePlanSegment.struTimeSegment.struEndTime.bySecond = 59;

	/*Up to 8 time periods can be set for each day, and you can set different statuses for each time period
	Here only takes setting one period for each day*/
	
	for (int iDate = 0; iDate<MAX_DAYS; iDate++)
	{
		memcpy(&struWeekPlan.struPlanCfg[iDate][0], lpPlanSegment, sizeof(struSinglePlanSegment));
	}

	BOOL bRet3 = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_WEEK_PLAN_CFG, 1, \
		&struWeekPlan, sizeof(struWeekPlan));
	if (!bRet3)
	{
		printf("Setting week schedule for door status failed, error:%d.\n", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return;
	}

	//Set holiday group for door status
	CString	m_csGroupName = "door status holiday group 1";
	NET_DVR_HOLIDAY_GROUP_CFG struHolidayGroup1 = {0};
	struHolidayGroup1.dwSize = sizeof(struHolidayGroup1);
	struHolidayGroup1.byEnable = 1;
	strncpy((char *)struHolidayGroup1.byGroupName, (LPCTSTR)m_csGroupName, HOLIDAY_GROUP_NAME_LEN);
	struHolidayGroup1.dwHolidayPlanNo[0] = 1;//Holiday group 1 links to holiday schedule 1, 
                                                 //up to 16 holiday schedules can be linked to one holiday group

	BOOL bRet4 = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_DOOR_STATUS_HOLIDAY_GROUP, 1, \
		&struHolidayGroup1, sizeof(struHolidayGroup1));
	if (!bRet4)
	{
		printf("Setting holiday group for door status failed, error:%d.\n", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return;
	}

	//Set holiday schedule for door status
	NET_DVR_HOLIDAY_PLAN_CFG struHolidayPlan = {0};
	struHolidayPlan.dwSize = sizeof(struHolidayPlan);
	struHolidayPlan.byEnable = 1;
	struHolidayPlan.struBeginDate.wYear = 2017;//Holiday start date
	struHolidayPlan.struBeginDate.byMonth = 10;
	struHolidayPlan.struBeginDate.byDay = 1;
	struHolidayPlan.struEndDate.wYear = 2017;//Holiday end date
	struHolidayPlan.struEndDate.byMonth = 10;
	struHolidayPlan.struEndDate.byDay = 7;
	//Copy the week schedule parameters to holiday schedule of door status
	memcpy(struHolidayPlan.struPlanCfg, struWeekPlan.struPlanCfg, sizeof(NET_DVR_SINGLE_PLAN_SEGMENT)*MAX_DAYS*MAX_TIMESEGMENT_V30);
	
	BOOL bRet5 = NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_DOOR_STATUS_HOLIDAY_PLAN, 1, \
		&struHolidayPlan, sizeof(struHolidayPlan));
	if (!bRet5)
	{
		printf("Setting holiday schedule for door status failed, error:%d.\n", NET_DVR_GetLastError());
		NET_DVR_Logout(lUserID);
		NET_DVR_Cleanup();
		return;
	}	
	//---------------------------------------
	//Exit
	Sleep(5000);

	//Log out
	NET_DVR_Logout(lUserID);
	//Release SDK resource
	NET_DVR_Cleanup();
	return;
}

Call NET_DVR_Logout and NET_DVR_Cleanup to log out and release the resource.