Page tree

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Current »

Полный список примеров, который есть в комплекте SDK (/fssm/samples): 

Вспомогательный файл

Файл win2nix.h. Переопределение функций Windows для *nix-платформ
#pragma once

#include <stddef.h>

#ifdef _WIN32
    #include <windows.h>
    #define FSSM_LIB "fssm.dll"
#endif

#if defined(__unix__) || defined(__APPLE__)

    #include <dlfcn.h>
    #define FSSM_LIB "libfssm.so"

typedef void* HMODULE;
typedef int BOOL;

static HMODULE LoadLibrary(const char* path) {
    return dlopen(path, RTLD_NOW);
}

static BOOL FreeLibrary(HMODULE module) {
    // Возвращаемое значение инвертируется, чтобы соответствовать поведению Windows
    return !dlclose(module);
}

static ptrdiff_t GetProcAddress(HMODULE module, const char* proc_name) {
    return (ptrdiff_t)(dlsym(module, proc_name));
}

#endif // __unix__ || __APPLE__

Получение списка установленных адаптеров

Файл GetAdaptersList.c
#include <stdbool.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

#include <string.h>

#include "FSSMLibrary.h"
#include "win2nix.h"

int main() {
    void* fssmLibHandle = NULL;
    int (*listAdaptersFunc)(bool, const char**, size_t*);
    char** fullAdaptersNames = NULL;
    size_t fullAdaptersCount = 0;
    char** loadedAdaptersNames = NULL;
    size_t loadedAdaptersCount = 0;
    size_t i = 0;
    int rv = 1;

    // Загрузка библиотеки FSSM
    printf("Loading FSSM library \n");
    fssmLibHandle = LoadLibrary(FSSM_LIB);

    if (!fssmLibHandle) {
        printf("Library load error!\n");

        return rv;
    }

    printf("OK!\n");

    // Загрузка необходимых методов
    printf("Loading FSSM functions \n");
    listAdaptersFunc = (int (*)(bool, const char**,
size_t*))GetProcAddress(fssmLibHandle, "listAdapters");

    if (!listAdaptersFunc) {
        printf("listAdapters finction not found!\n");

        goto releaseLibrary;
    }

    printf("OK!\n");

    // Получение списков адаптеров

    // Запрос количества всех адаптеров
    rv = listAdaptersFunc(true, NULL, &fullAdaptersCount);

    if (rv != 0) {
        printf("Error finding full adapters:%d!\n", rv);

        goto releaseLibrary;
    }

    // Запрос количества загруженных адаптеров
    rv = listAdaptersFunc(false, NULL, &loadedAdaptersCount);

    if (rv != 0) {
        printf("Error finding loaded adapters:%d!\n", rv);

        goto releaseLibrary;
    }

    // Выделение памяти
    fullAdaptersNames = (char**)malloc(fullAdaptersCount * sizeof(char*));

    for (i = 0; i < fullAdaptersCount; i++) {
        fullAdaptersNames[i] = NULL;
    }

    loadedAdaptersNames = (char**)malloc(loadedAdaptersCount * sizeof(char*));

    for (i = 0; i < loadedAdaptersCount; i++) {
        loadedAdaptersNames[i] = NULL;
    }

    // Формирование полного списка адаптеров
    printf("Found %zu valid Adapters!\n", fullAdaptersCount);
    rv = listAdaptersFunc(true, (const char**)fullAdaptersNames, &fullAdaptersCount);

    if (rv != 0) {
        printf("Error getting full adapters list:%d!\n", rv);

        goto freeMemory;
    }
    printf("Valid adapters list:\n");

    for (i = 0; i < fullAdaptersCount; i++) {
        printf("%3zu. %-10s\n", i + 1, fullAdaptersNames[i]);
    }

    // Формирование списка загруженных адаптеров
    printf("Found %zu loaded Adapters!\n", loadedAdaptersCount);
    rv = listAdaptersFunc(false, (const char**)loadedAdaptersNames, &loadedAdaptersCount);

    if (rv != 0) {
        printf("Error getting loaded adapters list:%d!\n", rv);

        goto freeMemory;
    }
    printf("Loaded adapters list:\n");

    for (i = 0; i < loadedAdaptersCount; i++) {
        printf("%3zu. %-10s\n", i + 1, loadedAdaptersNames[i]);
    }

    // Освобождение ресурсов
    freeMemory:
        free(fullAdaptersNames);
        free(loadedAdaptersNames);

    releaseLibrary:
        FreeLibrary(fssmLibHandle);
        return rv;
}

Получение списка сканеров

Файл GetDeviceList.c
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

#include "FSSMLibrary.h"
#include "win2nix.h"

int main() {
    void* fssmLibHandle = NULL;
    int (*listScannersFunc)(FSSMScanner*, size_t*);
    FSSMScanner* scannersList = NULL;
    size_t scannersCount = 0;
    int rv = 1;

    // Загрузка библиотеки fssm
    printf("Loading FSSM library \n");
    fssmLibHandle = LoadLibrary(FSSM_LIB);

    if (!fssmLibHandle) {
        printf("Library load error!\n");

        return rv;
    }

    printf("OK!\n");

    // Загрузка необходимых методов
    printf("Loading FSSM functions \n");
    listScannersFunc = (int (*)(FSSMScanner*,
size_t*))GetProcAddress(fssmLibHandle, "listScanners");

    if (!listScannersFunc) {
        printf("listScanners finction not found!\n");

        goto releaseLibrary;
    }

    printf("OK!\n");

    // Получение списка сканеров

    // Запрос количества сканеров
    rv = listScannersFunc(NULL, &scannersCount);


    if (rv != 0) {
        printf("Function listScanners finished with error:%d!\n", rv);

        goto releaseLibrary;
    }

    printf("Found %zu scanners!\n", scannersCount);

    if (scannersCount == 0) {
        goto releaseLibrary;
    }

    // Выделение буфера нужного размера, загрузка сведений о сканерах в буфер
    scannersList = (FSSMScanner*)malloc(scannersCount * sizeof(FSSMScanner));
    rv = listScannersFunc(scannersList, &scannersCount);

    if (rv != 0) {
        printf("Function listScanners finished with error:%d!\n", rv);

        goto freeMemory;
    }

    for (int i = 0; i < (int)scannersCount; i++) {
        printf("%d. %s, id: %d \n", (i + 1), scannersList[i].type, scannersList[i].ID);
    }

    // Освобождение ресурсов
    freeMemory:
        free(scannersList);

    releaseLibrary:
        FreeLibrary(fssmLibHandle);
        return rv;
}

Запуск сканирования с любого сканера

Сканирование запускается со сканера, к которому приложен палец.

Файл GetScanFromAny.c
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>

#include "FSSMLibrary.h"
#include "win2nix.h"

int main() {
    void* fssmLibHandle = NULL;
    int (*getFirstFingerprintFunc)(unsigned char*, size_t*, size_t*, unsigned int);
    int rv = 1;

    // Загрузка библиотеки FSSM
    printf("Loading FSSM library \n");
    fssmLibHandle = LoadLibrary(FSSM_LIB);

    if (!fssmLibHandle) {
        printf("Library load error!\n");

        return rv;
    }

    printf("OK!\n");

    // Загрузка необходимых методов
    printf("Loading FSSM functions \n");
    getFirstFingerprintFunc =
        (int (*)(unsigned char*, size_t*,
size_t*, unsigned int))GetProcAddress(fssmLibHandle, "getFirstFingerprint");

    if (!getFirstFingerprintFunc) {
        printf("getFirstFingerprint finction not found!\n");

        goto releaseLibrary;
    }

    printf("OK!\n");





    // Получение отпечатка

    // Запрос размера отпечатка со сканера
    size_t fingerprintSizeWidth = 0, fingerprintSizeHeight = 0;
    rv = getFirstFingerprintFunc(NULL, &fingerprintSizeWidth, &fingerprintSizeHeight, 10000);

    if (rv != 0) {
        printf("Function getFirstFingerprint finished with error:%d!\n", rv);

        goto releaseLibrary;
    }

    // Выделение памяти, считывание отпечатка
    unsigned char* fpImage = (unsigned char*)malloc(fingerprintSizeWidth * fingerprintSizeHeight);
    printf("Place your finger on any scanner within 10 seconds.\n");
    rv = getFirstFingerprintFunc(fpImage, &fingerprintSizeWidth, &fingerprintSizeHeight, 10000);

    if (rv == 2) {
        printf("Timeout expired!\n");

        goto freeFingerprintMemory;
    } else if (rv != 0) {
        printf("Function getFirstFingerprint finished with error:%d!\n", rv);

        goto freeFingerprintMemory;
    }

    printf("Got fingerprint, %d bytes\n", (int)(fingerprintSizeWidth * fingerprintSizeHeight));

    // Освобождение ресурсов
    freeFingerprintMemory:
        free(fpImage);

    releaseLibrary:
        FreeLibrary(fssmLibHandle);
        return rv;
}

Запуск сканирования с выбранного сканера

Файл GetScanFromSelected.c
#include <stdio.h>
#include <stdlib.h>

#include "FSSMLibrary.h"
#include "win2nix.h"

int main() {
    void* fssmLibHandle = NULL;
    int (*listScannersFunc)(FSSMScanner*, size_t*);
    int (*getFingerprintFunc)(FSSMScanner, unsigned char*, size_t*, size_t*, unsigned int);
    size_t fingerprintSizeWidth = 0, fingerprintSizeHeight = 0;
    FSSMScanner* scannersList = NULL;
    size_t scannersCount = 0;
    int scannerNumber = 0;
    int rv = 1;

    // Загрузка библиотеки FSSM
    printf("Loading FSSM library \n");
    fssmLibHandle = LoadLibrary(FSSM_LIB);

    if (!fssmLibHandle) {
        printf("Library load error!\n");

        return rv;
    }

    printf("OK!\n");

    // Загрузка необходимых методов
    printf("Loading FSSM functions \n");
    listScannersFunc = (int (*)(FSSMScanner*, size_t*))GetProcAddress(fssmLibHandle, "listScanners");

    if (!listScannersFunc) {
        printf("listScanners finction not found!\n");
        goto releaseLibrary;
    }

    getFingerprintFunc = (int (*)(FSSMScanner, unsigned char*, size_t*, size_t*,
unsigned int))GetProcAddress(fssmLibHandle, "getFingerprint");

    if (!getFingerprintFunc) {
        printf("getFingerprint finction not found!\n");

        goto releaseLibrary;
    }

    // Получение списка сканеров
    rv = listScannersFunc(NULL, &scannersCount);

    if (rv != 0) {
        printf("Function listScanners finished with error:%d!\n", rv);

        goto releaseLibrary;
    }

    printf("OK!\n");
    printf("Found %3zu scanners!\n", scannersCount);

    if (scannersCount == 0) {
        goto releaseLibrary;
    }

    scannersList = (FSSMScanner*)malloc(scannersCount * sizeof(FSSMScanner));
    rv = listScannersFunc(scannersList, &scannersCount);

    if (rv != 0) {
        printf("Function listScanners finished with error:%d!\n", rv);

        goto freeScannersMemory;
    }

    for (int i = 0; i < (int)scannersCount; i++) {
        printf("%d. %s, id: %d \n", (i + 1), scannersList[i].type, scannersList[i].ID);
    }

    // Выбор сканера
    printf("Enter scanner number: ");
    scanf("%d", &scannerNumber);
    scannerNumber--;

    if (scannerNumber < 0 || scannerNumber >= (int)(scannersCount)) {
        printf("Invalid scanner number!\n");

        goto freeScannersMemory;
    }

    // Получение отпечатка
    // Запрос размера отпечатка со сканера
    rv = getFingerprintFunc(scannersList[scannerNumber], NULL,
&fingerprintSizeWidth, &fingerprintSizeHeight, 10000);

    if (rv != 0) {
        printf("Function getFingerprint (get size) finished with error:%d!\n", rv);

        goto freeScannersMemory;
    }

    // Выделение памяти, считывание отпечатка
    unsigned char* fpImage = (unsigned char*)malloc(fingerprintSizeWidth * fingerprintSizeHeight);
    printf("Place your finger on the selected scanner within 10 seconds.\n");
    rv = getFingerprintFunc(scannersList[scannerNumber], fpImage,
&fingerprintSizeWidth, &fingerprintSizeHeight, 10000);

    if (rv == 2) {
        printf("Timeout expired!\n");

        goto freeFingerprintMemory;
    } else if (rv != 0) {
        printf("Function getFingerprint finished with error:%d!\n", rv);

        goto freeFingerprintMemory;
    }

    printf("Got fingerprint, %d bytes\n", (int)(fingerprintSizeWidth * fingerprintSizeHeight));

    // Освобождение ресурсов
    freeFingerprintMemory:
        free(fpImage);

    freeScannersMemory:
        free(scannersList);

    releaseLibrary:
        FreeLibrary(fssmLibHandle);
        return rv;
}

Реализация своего адаптера

Файл FSSMAdapterSample.c
#include <string.h>
#include "FSSMAdapter.h"

FSSM_API enum FSSMResult scan(int scannerID, unsigned char* scan, size_t* scanWidth, size_t* scanHeight) {
    if (!scan || !scanWidth || !scanHeight) {
        return InvalidArgsError;
    }

    // STUB: Демо-данные для примера
    // Замените на вызов API вашего сканера для захвата отпечатка
    static unsigned char demoScan[320 * 480] = { 0 };
    memcpy(scan, demoScan, sizeof(demoScan));
    *scanWidth = 320;
    *scanHeight = 480;

    return Ok;
}

FSSM_API enum FSSMResult stopScan(int scannerID) {
    (void)scannerID;
    // TODO: Реализуйте остановку сканирования отпечатка

    return Ok;
}

FSSM_API enum FSSMResult getDeviceCount(size_t* count) {
    if (!count) {
        return InvalidArgsError;
    }
    // STUB: Демо-данные для примера
    // Замените на вызов API вашего сканера для получения количества устройств
    *count = 1;

    return Ok;
}

FSSM_API enum FSSMResult getMaxImageSize(int scannerID, size_t* scanWidth, size_t* scanHeight) {
    (void)scannerID;
    if (!scanWidth || !scanHeight) {
        return InvalidArgsError;
    }


    // STUB: Демо-данные для примера
    // Замените на вызов API вашего сканера для получения
    // максимального размера изображения отпечатка
    *scanWidth = 320;
    *scanHeight = 480;

    return Ok;
}

FSSM_API enum FSSMResult getName(const char** name) {
    if (!name) {
        return InvalidArgsError;
    }

    // STUB: Демо-данные для примера
    // Замените "SampleAdapter" на реальное имя вашего биометрического устройства
    static const char ADAPTER_NAME[] = "SampleAdapter";
    *name = ADAPTER_NAME;

    return Ok;
}

FSSM_API enum FSSMResult isReady() {
    // TODO: Реализуйте функцию готовности загрузки драйвера устройства
    // NOTE: Если драйвер устройства успешно загружен - Ok,
    //       в остальных случаях AdapterNotReady

    return Ok;
}
  • No labels