Oracle Apex集成Futronic指纹识别:PL/SQL调用C++ SDK需求
解决Oracle Apex集成Futronic指纹设备的匹配与PL/SQL调用问题
一、先解决指纹采集数据不一致的核心问题
- 指纹原始二进制数组每次采集不同是正常现象,按压角度、力度、环境湿度都会影响原始图像数据,绝对不能直接对比原始二进制数组。必须通过Futronic SDK提取指纹特征模板(Feature Template),存储特征模板而非原始图像数据,特征模板是标准化的固定长度数据,可用于可靠匹配。
- 调用Futronic C++ SDK中的特征提取接口处理原始采集数据,生成特征模板后存入Oracle数据库,后续匹配时用新采集指纹提取的特征模板和数据库中存储的模板对比。
二、实现PL/SQL调用C++ SDK的具体方案
1. 封装Futronic SDK为可被Oracle调用的DLL
将Futronic SDK的核心功能(特征提取、特征匹配)封装成标准C导出函数,编译为动态链接库:
#include "FutronicSdk.h" // 引入Futronic官方SDK头文件 // 导出函数:从原始指纹数据提取特征模板 extern "C" __declspec(dllexport) int ExtractFingerFeature(unsigned char* rawData, int rawSize, unsigned char* featureBuf, int* featureSize) { // 调用Futronic SDK的特征提取API(示例函数名,以官方文档为准) return FutronicExtractFeature(rawData, rawSize, featureBuf, featureSize); } // 导出函数:对比两个指纹特征模板,返回匹配分数 extern "C" __declspec(dllexport) int MatchFingerFeature(unsigned char* feature1, int size1, unsigned char* feature2, int size2, int* matchScore) { // 调用Futronic SDK的特征匹配API(示例函数名,以官方文档为准) return FutronicMatchFeature(feature1, size1, feature2, size2, matchScore); }
编译时注意选择与Oracle服务器一致的位数(32位/64位),确保DLL能被Oracle加载。
2. 在Oracle中配置外部过程并创建PL/SQL包装
- 配置Oracle
extproc代理:修改listener.ora和tnsnames.ora,添加外部过程监听配置,确保Oracle有权限加载外部DLL。 - 创建库对象指向编译好的DLL:
CREATE OR REPLACE LIBRARY futronic_finger_lib AS 'D:\deploy\FutronicFinger.dll'; -- 替换为实际DLL路径 /
- 创建PL/SQL包装函数,映射到DLL的导出函数:
CREATE OR REPLACE FUNCTION extract_finger_feature( p_raw_data IN RAW, p_feature_size OUT NUMBER ) RETURN RAW AS EXTERNAL NAME "ExtractFingerFeature" LIBRARY futronic_finger_lib LANGUAGE C PARAMETERS ( p_raw_data BY REFERENCE, p_raw_data LENGTH, RETURN BY REFERENCE, p_feature_size BY REFERENCE ); / CREATE OR REPLACE FUNCTION match_finger_feature( p_feature1 IN RAW, p_feature2 IN RAW, p_match_score OUT NUMBER ) RETURN NUMBER AS EXTERNAL NAME "MatchFingerFeature" LIBRARY futronic_finger_lib LANGUAGE C PARAMETERS ( p_feature1 BY REFERENCE, p_feature1 LENGTH, p_feature2 BY REFERENCE, p_feature2 LENGTH, p_match_score BY REFERENCE, RETURN ); /
3. 在Apex中调用PL/SQL函数完成业务逻辑
- 存储指纹特征:采集原始数据后提取特征,替换数据库中的原始数据存储:
DECLARE l_raw_data RAW(4000); l_feature RAW(2000); l_feature_size NUMBER; BEGIN l_raw_data := :P1_RAW_FINGERPRINT; -- Apex页面项获取的原始采集数据 l_feature := extract_finger_feature(l_raw_data, l_feature_size); INSERT INTO emp_fingerprint(emp_id, fingerprint_feature) VALUES(:P1_EMP_ID, l_feature); COMMIT; END; /
- 指纹匹配:提取新采集指纹的特征,与数据库中存储的特征对比:
DECLARE l_new_raw RAW(4000); l_new_feature RAW(2000); l_new_size NUMBER; l_db_feature RAW(2000); l_match_score NUMBER; l_result NUMBER; BEGIN l_new_raw := :P2_NEW_FINGERPRINT; l_new_feature := extract_finger_feature(l_new_raw, l_new_size); SELECT fingerprint_feature INTO l_db_feature FROM emp_fingerprint WHERE emp_id = :P2_EMP_ID; l_result := match_finger_feature(l_new_feature, l_db_feature, l_match_score); -- 根据SDK返回码和匹配分数判断结果(示例:返回0为成功,分数≥80判定匹配) IF l_result = 0 AND l_match_score >= 80 THEN :P2_MATCH_STATUS := '匹配成功'; ELSE :P2_MATCH_STATUS := '匹配失败'; END IF; END; /
三、关键注意事项
- 确保Oracle服务器操作系统与DLL编译平台位数一致,否则无法加载DLL。
- 给Oracle运行进程赋予DLL文件及Futronic SDK依赖库的读取权限。
- 严格对照Futronic SDK官方文档,确认特征提取、匹配函数的参数类型、返回值定义,避免参数不匹配导致调用失败。
内容的提问来源于stack exchange,提问作者nasim
相关产品推荐
相关产品推荐

