~~NOTOC~~ [[user_management_api]] > [[BS2_EnrolUser]] ---- ===== BS2_EnrolUser ===== 새로운 사용자를 등록합니다. **도움말**\\ FaceStation F2로 사용자 전송을 위해서는 [[BS2_EnrollUserFaceEx]]를 사용해 주십시오. \\ ==== 함수 ==== #include "BS_API.h" int BS2_EnrolUser(void* context, uint32_t deviceId, BS2UserBlob* userBlob, uint32_t userCount, uint8_t overwrite); [[user management api#BS2UserBlob|BS2UserBlob 구조체 보기]] ==== 파라미터 ==== * [In] ''//context//'' : Context * [In] ''//deviceId//'' : 장치 식별자 * [In] ''//userBlob//'' : 등록하고자 하는 사용자 정보 * [In] ''//userCount//'' : 사용자 개수 * [In] ''//overwrite//'' : 중복된 사용자 덮어쓰기 여부 ==== 반환값 ==== 성공적으로 수행될 경우 ''BS_SDK_SUCCESS''를 반환하고, 에러가 발생할 경우 상응하는 에러 코드를 반환합니다. \\ ==== 샘플 코드 ==== C++ int enrollUser(BS2_DEVICE_ID id) { BS2SimpleDeviceInfo deviceInfo = { 0, }; BS2SimpleDeviceInfoEx deviceInfoEx = { 0, }; int sdkResult = BS2_GetDeviceInfoEx(context_, id, &deviceInfo, &deviceInfoEx); if (BS_SDK_SUCCESS != sdkResult) { TRACE("BS2_GetDeviceInfoEx call failed: %d", sdkResult); return sdkResult; } bool fingerScanSupported = (deviceInfoEx.supported & BS2SimpleDeviceInfoEx::BS2_SUPPORT_FINGER_SCAN) == BS2SimpleDeviceInfoEx::BS2_SUPPORT_FINGER_SCAN; bool faceScanSupported = (deviceInfoEx.supported & BS2SimpleDeviceInfoEx::BS2_SUPPORT_FACE_SCAN) == BS2SimpleDeviceInfoEx::BS2_SUPPORT_FACE_SCAN; bool qrSupported = (deviceInfoEx.supported & BS2SimpleDeviceInfoEx::BS2_SUPPORT_QR) == BS2SimpleDeviceInfoEx::BS2_SUPPORT_QR; BS2UserBlob userBlob = { 0, }; BS2User& user = userBlob.user; BS2UserSetting& setting = userBlob.setting; BS2UserPhoto& photo = userBlob.user_photo; stringstream msg; string uid = Utility::getInput("Please enter a user ID:"); if (BS2_USER_ID_SIZE < uid.size()) { TRACE("User ID is too big."); return BS_SDK_ERROR_INVALID_PARAM; } strcpy(user.userID, uid.c_str()); if (deviceInfo.userNameSupported) { string name = Utility::getInput("Enter your name:"); if (BS2_USER_NAME_SIZE < name.size()) { TRACE("User name is too long."); return BS_SDK_ERROR_INVALID_PARAM; } strcpy(reinterpret_cast(userBlob.user_name), name.c_str()); } { string inputTime = Utility::getLine("Please enter start time [YYYY-MM-DD HH:MM:SS] ?"); BS2_TIMESTAMP startTime = Utility::convertTimeString2UTC(inputTime); setting.startTime = startTime; inputTime = Utility::getLine("Please enter end time [YYYY-MM-DD HH:MM:SS] ?"); BS2_TIMESTAMP endTime = Utility::convertTimeString2UTC(inputTime); setting.endTime = endTime; } if (deviceInfo.pinSupported) { string pinString = Utility::getInput("Enter the PIN code:"); if (BS2_USER_PIN_SIZE < pinString.size()) { TRACE("PIN code is too long"); return BS_SDK_ERROR_INVALID_PARAM; } sdkResult = BS2_MakePinCode(context_, const_cast(pinString.c_str()), userBlob.pin); if (BS_SDK_SUCCESS != sdkResult) { TRACE("BS2_MakePinCode call failed: %d", sdkResult); return sdkResult; } } setting.fingerAuthMode = BS2_AUTH_MODE_BIOMETRIC_ONLY; setting.cardAuthMode = BS2_AUTH_MODE_CARD_ONLY; setting.idAuthMode = BS2_AUTH_MODE_ID_PIN; setting.securityLevel = BS2_USER_SECURITY_LEVEL_DEFAULT; if (deviceInfo.userPhotoSupported) { if (Utility::isYes("Do you want to register a profile image?")) { string imagePath = Utility::getInput("Enter the profile image path and name:"); uint32_t size = Utility::getResourceSize(imagePath); shared_ptr buffer(new uint8_t[size], ArrayDeleter()); while (BS2_USER_PHOTO_SIZE < size) { msg.str(""); msg << "Image is to big.\n"; msg << "Re-enter an image smaller than 16384 byte:"; imagePath = Utility::getInput(msg.str()); size = Utility::getResourceSize(imagePath); } if (Utility::getResourceFromFile(imagePath, buffer, size)) { photo.size = size; memcpy(photo.data, buffer.get(), size); } } } user.flag = BS2_USER_FLAG_CREATED | BS2_USER_FLAG_UPDATED; user.numFingers = 0; user.numCards = 0; user.numFaces = 0; if (deviceInfo.cardSupported) { if (Utility::isYes("Do you want to scan card?")) { uint32_t numCard = Utility::getInput("How many cards would you like to register?"); BS2CSNCard* ptrCard = new BS2CSNCard[numCard]; if (ptrCard) { userBlob.cardObjs = ptrCard; for (uint32_t index = 0; index < numCard;) { BS2Card card = { 0, }; sdkResult = BS2_ScanCard(context_, id, &card, onReadyToScanCard); if (BS_SDK_SUCCESS != sdkResult) TRACE("BS2_ScanCard call failed: %d", sdkResult); else { if (card.isSmartCard) { TRACE("CSN card only supported."); continue; } memcpy(&ptrCard[index], &card.card, sizeof(BS2CSNCard)); user.numCards++; index++; } } } } } // +V2.8 XS2 QR support if (qrSupported) { if (Utility::isYes("Would you like to register the QR code string to be used for authentication?")) { msg.str(""); msg << "Enter the ASCII QR code." << endl; msg << " [ASCII code consisting of values between 32 and 126]."; string qrCode = Utility::getInput(msg.str()); BS2CSNCard qrCard = { 0, }; sdkResult = BS2_WriteQRCode(qrCode.c_str(), &qrCard); if (BS_SDK_SUCCESS != sdkResult) { TRACE("BS2_WriteQRCode call failed: %d", sdkResult); } else { size_t numOfRealloc = user.numCards + 1; BS2CSNCard* ptrNewCard = new BS2CSNCard[numOfRealloc]; memset(ptrNewCard, 0x0, sizeof(BS2CSNCard) * numOfRealloc); if (0 < user.numCards && userBlob.cardObjs) { memcpy(ptrNewCard, userBlob.cardObjs, sizeof(BS2CSNCard) * user.numCards); delete[] userBlob.cardObjs; userBlob.cardObjs = NULL; } memcpy(ptrNewCard + user.numCards, &qrCard, sizeof(BS2CSNCard)); userBlob.cardObjs = ptrNewCard; user.numCards++; } } } // +V2.8 XS2 QR support if (fingerScanSupported) { if (Utility::isYes("Do you want to scan fingerprint?")) { uint32_t numFinger = Utility::getInput("How many fingers would you like to register?"); BS2Fingerprint* ptrFinger = new BS2Fingerprint[numFinger]; if (ptrFinger) { userBlob.fingerObjs = ptrFinger; for (uint32_t index = 0; index < numFinger; index++) { for (uint32_t templateIndex = 0; templateIndex < BS2_TEMPLATE_PER_FINGER;) { sdkResult = BS2_ScanFingerprint(context_, id, &ptrFinger[index], templateIndex, BS2_FINGER_TEMPLATE_QUALITY_HIGHEST, BS2_FINGER_TEMPLATE_FORMAT_SUPREMA, onReadyToScanFinger); if (BS_SDK_SUCCESS != sdkResult) TRACE("BS2_ScanFingerprint call failed: %d", sdkResult); else templateIndex++; } user.numFingers++; } } } } if (faceScanSupported) { if (Utility::isYes("Do you want to scan face?")) { uint32_t numFace = Utility::getInput("How many face would you like to register?"); BS2Face* ptrFace = new BS2Face[numFace]; if (ptrFace) { userBlob.faceObjs = ptrFace; for (uint32_t index = 0; index < numFace;) { sdkResult = BS2_ScanFace(context_, id, &ptrFace[index], BS2_FACE_ENROLL_THRESHOLD_DEFAULT, onReadyToScanFace); if (BS_SDK_SUCCESS != sdkResult) TRACE("BS2_ScanFace call failed: %d", sdkResult); else { user.numFaces++; index++; } } } } } sdkResult = BS2_EnrolUser(context_, id, &userBlob, 1, 1); if (BS_SDK_SUCCESS != sdkResult) TRACE("BS2_EnrolUser call failed: %d", sdkResult); if (userBlob.cardObjs) delete[] userBlob.cardObjs; if (userBlob.fingerObjs) delete[] userBlob.fingerObjs; if (userBlob.faceObjs) delete[] userBlob.faceObjs; return sdkResult; } C# public void insertUserIntoDevice(IntPtr sdkContext, UInt32 deviceID, bool isMasterDevice) { List userList = new List(); if (dbHandler.GetUserList(ref deviceInfo, ref userList)) { if (userList.Count > 0) { for (int idx = 0; idx < userList.Count; ++idx) { Console.Write("[{0:000}] ==> ", idx); print(userList[idx]); } Int32 selection = Util.GetInput(); if (selection >= 0) { if (selection < userList.Count) { BS2User user = userList[selection]; BS2UserSmallBlob[] userBlob = Util.AllocateStructureArray(1); if (dbHandler.GetUserBlob(ref deviceInfo, ref user, ref userBlob[0])) { Console.WriteLine("Trying to enroll user."); //BS2ErrorCode result = (BS2ErrorCode)API.BS2_EnrolUser(sdkContext, deviceID, userBlob, 1, 1); BS2ErrorCode result = (BS2ErrorCode)API.BS2_EnrollUserSmall(sdkContext, deviceID, userBlob, 1, 1); if (result != BS2ErrorCode.BS_SDK_SUCCESS) { Console.WriteLine("Got error({0}).", result); } if (userBlob[0].cardObjs != IntPtr.Zero) { Marshal.FreeHGlobal(userBlob[0].cardObjs); } if (userBlob[0].fingerObjs != IntPtr.Zero) { Marshal.FreeHGlobal(userBlob[0].fingerObjs); } if (userBlob[0].faceObjs != IntPtr.Zero) { Marshal.FreeHGlobal(userBlob[0].faceObjs); } if (userBlob[0].user_photo_obj != IntPtr.Zero) { Marshal.FreeHGlobal(userBlob[0].user_photo_obj); } } } else { Console.WriteLine("Invalid selection[{0}]", selection); } } else { Console.WriteLine("Invalid user index"); } } else { Console.WriteLine("There is no user."); } } else { Console.WriteLine("An error occurred while attempting to retrieve user list."); } } ==== 함께 보기 ==== [[BS2_GetUserList]]\\ [[BS2_RemoveUser]]\\ [[BS2_RemoveAllUser]]\\ [[BS2_GetUserInfos]]\\ [[BS2_GetUserInfosEx]]\\ [[BS2_EnrolUser]]\\ [[BS2_EnrolUserEx]]\\ [[BS2_GetUserDatas]]\\ [[BS2_GetUserDatasEx]]