﻿

{"id":16238,"date":"2023-10-11T16:04:04","date_gmt":"2023-10-11T07:04:04","guid":{"rendered":"https:\/\/www.bitstrong.com\/jp\/?p=16238"},"modified":"2023-12-21T10:56:26","modified_gmt":"2023-12-21T01:56:26","slug":"card-based-access-control-getting-and-applying-card-information","status":"publish","type":"post","link":"https:\/\/www.bitstrong.com\/jp\/card-based-access-control-getting-and-applying-card-information\/","title":{"rendered":"\u3010Card-Based Access Control\u3011Getting And Applying Card Information"},"content":{"rendered":"<p><strong><span style=\"font-size: 18pt;\">\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0<\/span><\/strong><\/p>\n<div>\/\/<\/div>\n<div>\/\/ Device Network SDK (Card-Based Access Control)<\/div>\n<div>\/\/ Typical Applications<\/div>\n<div>\/\/ Manage Card Information<\/div>\n<div>\/\/ Sample Code for Getting and Applying Card Information<\/div>\n<div>\/\/<\/div>\n<div>#include &lt;stdio.h&gt;<\/div>\n<div>#include &lt;iostream&gt;<\/div>\n<div>#include &lt;afx.h&gt;<\/div>\n<div>#include &#8220;Windows.h&#8221;<\/div>\n<div>#include &#8220;HCNetSDK.h&#8221;<\/div>\n<p>using namespace std;<\/p>\n<div>LONG m_lSetCardCfgHandle;<\/div>\n<div>LONG m_lGetCardCfgHandle;<\/div>\n<div>CString m_csCardNo;<\/div>\n<div>CString m_csCardPassword;<\/div>\n<div>BOOL bGetCardCfgFinish = FALSE;<\/div>\n<p>BOOL bSetCardCfgFinish = FALSE;<\/p>\n<div>void CALLBACK g_fGetGatewayCardCallback(DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData)<\/div>\n<div>{<\/div>\n<div>\/\/As the operations with long time comsumption are not allowed in the callback function,<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \/\/do not call the API of HCNetSDK.DLL in the callback function.<\/div>\n<div>\/\/The following code is for reference only, actually, processing data in the callback function is not suggested.<\/div>\n<p>\/\/for example, process in the message response function as PostMessage<\/p>\n<div>if (dwType == NET_SDK_CALLBACK_TYPE_DATA)\/\/Data information<\/div>\n<div>{<\/div>\n<div>LPNET_DVR_CARD_CFG_V50 lpCardCfg = new NET_DVR_CARD_CFG_V50;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 memcpy(lpCardCfg, lpBuffer, sizeof(*lpCardCfg)); \/\/Copy the card information of callback function<\/div>\n<p>\/\/PostMessage(WM_MSG_ADD_CARDCFG_TOLIST, (WPARAM)lpCardCfg,0);<\/p>\n<div>char *pCardNo;<\/div>\n<div>BYTE byCardType;<\/div>\n<div>pCardNo = (char *)lpCardCfg-&gt;byCardNo;<\/div>\n<div>byCardType = lpCardCfg-&gt;byCardType;<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>}<\/div>\n<div>else if (dwType == NET_SDK_CALLBACK_TYPE_STATUS)\/\/Status value<\/div>\n<div>{<\/div>\n<div>DWORD dwStatus = *(DWORD*)lpBuffer;<\/div>\n<div>if (dwStatus == NET_SDK_CALLBACK_STATUS_SUCCESS)<\/div>\n<div>{<\/div>\n<div>bGetCardCfgFinish = TRUE;\/\/Getting card information complated.<\/div>\n<div>\/\/PostMessage(WM_MSG_GETCARD_FINISH,0,0);<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>}<\/div>\n<div>else if ( dwStatus == NET_SDK_CALLBACK_STATUS_FAILED )<\/div>\n<div>{<\/div>\n<div>char szCardNumber[ACS_CARD_NO_LEN + 1] = &#8220;\\0&#8221;;<\/div>\n<div>DWORD dwErrCode = *(DWORD*)((char *)lpBuffer + 4); \/\/Error code<\/div>\n<div>strncpy(szCardNumber,(char*)(lpBuffer) + 8,ACS_CARD_NO_LEN);\/\/Card No.<\/div>\n<div>printf(&#8220;GetCard STATUS_FAILED, Error code %d, Card Number %s\\n&#8221;, dwErrCode,\u00a0 szCardNumber);<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>}<\/div>\n<div>}<\/div>\n<p>}<\/p>\n<div>void CALLBACK g_fSetGatewayCardCallback(DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData)<\/div>\n<div>{<\/div>\n<div>if (dwType != NET_SDK_CALLBACK_TYPE_STATUS)\/\/Only status will be returned when applying card<\/div>\n<div>{<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>DWORD dwStatus = *(DWORD*)lpBuffer;\/\/The first 4-byte is status value<\/div>\n<div>if (dwStatus == NET_SDK_CALLBACK_STATUS_PROCESSING)\/\/Sending<\/div>\n<div>{<\/div>\n<div>char szCardNumber[ACS_CARD_NO_LEN + 1] = &#8220;\\0&#8221;;<\/div>\n<div>strncpy(szCardNumber,(char*)(lpBuffer) + 4,ACS_CARD_NO_LEN);<\/div>\n<div>printf(&#8220;SetCard PROCESSING,CardNo: %s\\n&#8221;, szCardNumber);<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>}<\/div>\n<div>else if (dwStatus == NET_SDK_CALLBACK_STATUS_FAILED)\/\/Sending failed.<\/div>\n<div>{<\/div>\n<div>char szCardNumber[ACS_CARD_NO_LEN + 1] = &#8220;\\0&#8221;;<\/div>\n<div>DWORD dwErrCode = *((DWORD*)lpBuffer + 1);\/\/Error code<\/div>\n<div>strncpy(szCardNumber,(char*)(lpBuffer) + 8,ACS_CARD_NO_LEN);\/\/Card No.<\/div>\n<div>printf(&#8220;SetCard Err:%d,CardNo:%s\\n&#8221;, dwErrCode, szCardNumber);<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>}<\/div>\n<div>\/\/The following contents should perfrom stopping remote configuration for twice.<\/div>\n<div>else if (dwStatus == NET_SDK_CALLBACK_STATUS_SUCCESS)\/\/Sent<\/div>\n<div>{<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 printf(&#8220;SetCard SUCCESS!&#8221;);<\/div>\n<div>bSetCardCfgFinish = TRUE;<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>\/\/PostMessage(WM_MSG_SETCARD_FINISH,0,0);<\/div>\n<div>}<\/div>\n<div>else if (dwStatus == NET_SDK_CALLBACK_STATUS_EXCEPTION)\/\/Exception<\/div>\n<div>{<\/div>\n<div>bSetCardCfgFinish = TRUE;<\/div>\n<div>\/\/Other processes&#8230;<\/div>\n<div>\/\/PostMessage(WM_MSG_SETCARD_FINISH,0,0);<\/div>\n<div>}<\/div>\n<p>}<\/p>\n<div>void main()<\/div>\n<div>{<\/div>\n<div>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\/\/Initialize<\/div>\n<p>NET_DVR_Init();<\/p>\n<div>\/\/Set connection timeout and reconnection function<\/div>\n<div>NET_DVR_SetConnectTime(2000, 1);<\/div>\n<p>NET_DVR_SetReconnect(10000, true);<\/p>\n<div>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\/\/Log in to device<\/div>\n<div>LONG lUserID;<\/div>\n<div>NET_DVR_DEVICEINFO_V30 struDeviceInfo;<\/div>\n<div>lUserID = NET_DVR_Login_V30(&#8220;192.0.0.64&#8221;, 8000, &#8220;admin&#8221;, &#8220;12345&#8221;, &amp;struDeviceInfo);<\/div>\n<div>if (lUserID &lt; 0)<\/div>\n<div>{<\/div>\n<div>printf(&#8220;Login error, %d\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>\/\/Get card information&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>NET_DVR_CARD_CFG_COND struCond = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond.dwSize\u00a0 = sizeof(struCond);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond.dwCardNum = 1;\/\/Get the number of cards<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond.byCheckCardNo = 1;<\/div>\n<div>NET_DVR_CARD_CFG_SEND_DATA struSendData = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struSendData.dwSize = sizeof(struSendData);<\/div>\n<div>m_csCardNo = &#8220;12&#8221;;\/\/Card No.<\/div>\n<p>strncpy((char *)struSendData.byCardNo, (LPCTSTR)m_csCardNo, ACS_CARD_NO_LEN);<\/p>\n<div>\/\/Start remote configuration<\/div>\n<div>m_lGetCardCfgHandle = NET_DVR_StartRemoteConfig(lUserID,NET_DVR_GET_CARD_CFG_V50,&amp;struCond,\\<\/div>\n<div>sizeof(struCond),g_fGetGatewayCardCallback,NULL);<\/div>\n<div>if (m_lGetCardCfgHandle==-1)<\/div>\n<div>{<\/div>\n<div>printf(&#8220;NET_DVR_StartRemoteConfig fail, error:%d.\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>NET_DVR_Logout(lUserID);<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>\/\/Send search conditions remotely<\/div>\n<div>if (! NET_DVR_SendRemoteConfig(m_lGetCardCfgHandle, ENUM_ACS_SEND_DATA, (char *)(&amp;struSendData), sizeof(struSendData)) )<\/div>\n<div>{<\/div>\n<div>printf(&#8220;NET_DVR_SendRemoteConfig fail, error:%d.\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>NET_DVR_StopRemoteConfig(m_lGetCardCfgHandle);<\/div>\n<div>NET_DVR_Logout(lUserID);<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>\/\/Stop remote configuration<\/div>\n<div>Sleep(1000);<\/div>\n<div>if (bGetCardCfgFinish)\/\/Stop remote connection if getting card information completed.<\/div>\n<div>{<\/div>\n<div>NET_DVR_StopRemoteConfig(m_lGetCardCfgHandle);<\/div>\n<p>}<\/p>\n<div>\/\/Apply card information&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>NET_DVR_CARD_CFG_COND struCond_set = {0};<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond_set.dwSize\u00a0 = sizeof(struCond_set);<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond_set.dwCardNum = 1;\/\/Number of card to apply<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond_set.byCheckCardNo = 1;<\/div>\n<div>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 struCond_set.wLocalControllerID = 0;\/\/Apply offline card information to distributed access controller No.<\/div>\n<p>\/\/0-access controller<\/p>\n<div>\/\/Start remote configuration<\/div>\n<div>m_lSetCardCfgHandle = NET_DVR_StartRemoteConfig(lUserID,NET_DVR_SET_CARD_CFG_V50,&amp;struCond_set,\\<\/div>\n<div>sizeof(struCond_set),g_fSetGatewayCardCallback,NULL);<\/div>\n<div>if (m_lSetCardCfgHandle==-1)<\/div>\n<div>{<\/div>\n<div>printf(&#8220;NET_DVR_StartRemoteConfig fail, error:%d.\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>NET_DVR_Logout(lUserID);<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>\/\/Set card information<\/div>\n<div>LPNET_DVR_CARD_CFG_V50 lpCardCfg =\u00a0 new NET_DVR_CARD_CFG_V50;<\/div>\n<div>lpCardCfg-&gt;dwSize = sizeof(NET_DVR_CARD_CFG_V50);<\/div>\n<div>lpCardCfg-&gt;dwModifyParamType = 0x000003FF;\/\/Card information to be edited, represented by bit,<\/div>\n<p>\/\/each bit refers to one kind of parameter, 0-Not Edit, 1-Edit<\/p>\n<div>m_csCardNo = &#8220;12&#8221;;\/\/Card No.<\/div>\n<div>strncpy((char *)lpCardCfg-&gt;byCardNo, (LPCTSTR)m_csCardNo, ACS_CARD_NO_LEN);<\/div>\n<div>lpCardCfg-&gt;byCardValid = 1;\/\/Card is valid or not: 0-invalid card, 1-valid card<\/div>\n<div>lpCardCfg-&gt;byCardType = 1;\/\/Card type: 1-Normal card (default)<\/div>\n<div>lpCardCfg-&gt;byLeaderCard = 0;\/\/First card or not: 1-Yes, 0-No<\/div>\n<div>lpCardCfg-&gt;byDoorRight[0] = 1;\/\/byDoorRight[0] to byDoorRight[255]: door 1 to door 256, 1-with permission, 0-no permission<\/div>\n<div>lpCardCfg-&gt;byDoorRight[1] = 1;\/\/Door 1 and door 2 are with permission.<\/div>\n<div>lpCardCfg-&gt;byBelongGroup[0] = 1;\/\/byBelongGroup[0] to byBelongGroup[127]: array 1 to array 128, 1-in range, 0-not in range<\/div>\n<div>m_csCardPassword = &#8220;12345678&#8221;;\/\/Card password<\/div>\n<div>strncpy((char *)lpCardCfg-&gt;byCardPassword, (LPCTSTR)m_csCardPassword, CARD_PASSWORD_LEN);<\/div>\n<div>\/\/Configure the access permission schedule template first.<\/div>\n<div>lpCardCfg-&gt;wCardRightPlan[0][0]=1;\/\/This card is configured with access permission schedule template 1 and 2 for door 1<\/div>\n<div>lpCardCfg-&gt;wCardRightPlan[0][1]=2;<\/div>\n<div>lpCardCfg-&gt;wCardRightPlan[1][0]=3;\/\/This card is configured with access permission schedule template 3 and 4 for door 2<\/div>\n<div>lpCardCfg-&gt;wCardRightPlan[1][1]=4;<\/div>\n<div>lpCardCfg-&gt;dwMaxSwipeTime = 0;\/\/Maximum card swiping times, 0-no limit<\/div>\n<div>lpCardCfg-&gt;dwSwipeTime = 0;\/\/Swiped times<\/div>\n<div>lpCardCfg-&gt;struValid.byEnable = 1;\/\/Validity duration<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.wYear=2017;\/\/Start time: 2017-01-01 00:00:00<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.byMonth=1;<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.byDay=1;<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.byHour=0;<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.byMinute=0;<\/div>\n<div>lpCardCfg-&gt;struValid.struBeginTime.bySecond=0;<\/div>\n<div>lpCardCfg-&gt;struValid.struEndTime.wYear=2018;\/\/End time: 2018-01-01 00:00:00<\/div>\n<div>lpCardCfg-&gt;struValid.struEndTime.byMonth=1;<\/div>\n<div>lpCardCfg-&gt;struValid.struEndTime.byDay=1;<\/div>\n<div>lpCardCfg-&gt;struValid.struEndTime.byHour=0;<\/div>\n<div>lpCardCfg-&gt;struValid.struEndTime.byMinute=0;<\/div>\n<p>lpCardCfg-&gt;struValid.struEndTime.bySecond=0;<\/p>\n<div>\/\/Send card information remotely<\/div>\n<div>if (!NET_DVR_SendRemoteConfig(m_lSetCardCfgHandle,ENUM_ACS_SEND_DATA, (char *)lpCardCfg ,sizeof(*lpCardCfg)))<\/div>\n<div>\u00a0 \u00a0 {<\/div>\n<div>printf(&#8220;NET_DVR_SendRemoteConfig fail, error:%d.\\n&#8221;, NET_DVR_GetLastError());<\/div>\n<div>NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle);<\/div>\n<div>NET_DVR_Logout(lUserID);<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<p>}<\/p>\n<div>\/\/Stop remote configuration<\/div>\n<div>Sleep(1000);<\/div>\n<div>if (bSetCardCfgFinish)\/\/Stop remote configuration when applied or callback exception.<\/div>\n<div>{<\/div>\n<div>NET_DVR_StopRemoteConfig(m_lSetCardCfgHandle);<\/div>\n<p>}<\/p>\n<div>\/\/&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<\/div>\n<div>\/\/Exit<\/div>\n<p>Sleep(5000);<\/p>\n<div>\/\/Log out<\/div>\n<div>NET_DVR_Logout(lUserID);<\/div>\n<div>\/\/Release SDK resources<\/div>\n<div>NET_DVR_Cleanup();<\/div>\n<div>return;<\/div>\n<div>}<\/div>\n","protected":false},"excerpt":{"rendered":"\u30b5\u30f3\u30d7\u30eb\u30d7\u30ed\u30b0\u30e9\u30e0 \/\/ \/\/ Device Network SDK (Card-Based Access Control) \/\/ Typical Applications \/\/ Manage Card Information \/\/ Sample Code for Getting and Applying ...","protected":false},"author":4,"featured_media":15936,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[107],"tags":[],"class_list":["post-16238","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-camera-connection"],"_links":{"self":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/16238","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/comments?post=16238"}],"version-history":[{"count":1,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/16238\/revisions"}],"predecessor-version":[{"id":16239,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/posts\/16238\/revisions\/16239"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media\/15936"}],"wp:attachment":[{"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/media?parent=16238"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/categories?post=16238"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bitstrong.com\/jp\/wp-json\/wp\/v2\/tags?post=16238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}