PowerBuilder:汉王人脸通SDK使用说明

针对使用C/C++版本的FaceId.dll
前提条件:

外部函数声明

FUNCTION ULong FaceId_Start(ref String Address, UInt Port, Int AddressFamily) LIBRARY "FaceId.dll"
FUNCTION Long FaceId_SetSecretKey(ULong SocketHandle, String SecretKey) LIBRARY "FaceId.dll"
FUNCTION ULong FaceId_GetSecretKey(ULong SocketHandle) LIBRARY "FaceId.dll"
FUNCTION Long FaceId_Execute(ULong SocketHandle, String InBuffer, ref ULong hOutBuffer, ULong CodePage) LIBRARY "FaceId.dll"
SUBROUTINE FaceId_Close(ULong SocketHandle) LIBRARY "FaceId.dll"

获取密码说明:
ULong SecretKeyAddress=FaceId_GetSecretKey(SocketHandle)
String SecretKey=String(SecretKeyAddress, "Address")

获取命令结果说明:
由于PowerBuilder函数String(data, {format})只能处理32767个字符,要获取完整命令结果,需要多次调用此函数。
假设ReceivedChars为FaceId_Execute的返回结果,且大于0,请通过如下方式获取完整命令结果
String Answer, DealedChars
ULong hOutBuffer, Base
Long ReceivedChars, Index

IF SocketHandle = 0 THEN
	MessageBox('警告', '尚未连接设备!', StopSign!, OK!)
	RETURN	
END IF

// 清空原有文本
mle_Answer.Text = ''
ReceivedChars = FaceId_Execute(SocketHandle, sle_command.Text, ref hOutBuffer, 936)
IF ReceivedChars > 0 THEN
	Index = 0
	Base = hOutBuffer
	DO WHILE Index < ReceivedChars
		DealedChars = String(Base, "Address")
		Answer = Answer + DealedChars
		Index = Index + Len(DealedChars)
		Base = Base + Len(DealedChars)*2		
	LOOP
	mle_Answer.Text = Answer
ELSE
	MessageBox('警告', '执行命令失败!', Exclamation!, OK!)
END IF


C/C++头文件 FaceIdApi.h

#pragma once

#include <Windows.h>

#ifdef __cplusplus
extern "C"
{
#endif
	/*
	功能:开始与设备的通信
	参数说明:
		Address:要连接的服务器IP地址
		Port:要连接的服务器端口号
		AddressFamily:地址族,支持AF_INET、AF_INET6、AF_UNSPEC,默认为AF_INET(IPv4)
	返回值:
		通信句柄,如果为NULL,则建立通信失败
	说明:
		AF_INET = 2
		AF_INET6 = 23
		AF_UNSPEC = 0
	*/
	HANDLE WINAPI FaceId_Start(const TCHAR* Address, UINT16 Port = 9922, INT AddressFamily = AF_INET);

	/*
	功能:设置加密密钥
	参数说明:
		SocketHandle:通信句柄
		SecretKey:加密密钥。如果密钥为空,则密钥被清除
	返回值:
		错误代码
	*/
	HRESULT WINAPI FaceId_SetSecretKey(HANDLE SocketHandle, const TCHAR* SecretKey = NULL);

	/*
	功能:获取加密密钥
	参数说明:
		SocketHandle:通信句柄
	返回值:
		如果密钥被清除,则返回值为NULL
		如果密钥已激活,则返回密钥字符串指针
	*/
	const TCHAR* WINAPI FaceId_GetSecretKey(HANDLE SocketHandle);

	/*
	功能:向人脸通发送命令并获取返回的数据
	参数说明:
		SocketHandle:通信句柄
		InBuffer:要写入的命令字符串
		hOutBuffer:接收字符串缓冲区句柄
		CodePage:按指定的代码页进行宽字符和多字节之间的编码转换
	返回值:
		>0:操作成功。读取到的字符数
		=0:套接字已断开
		SOCKET_ERROR:套接字错误。调用WSAGetLastError函数获取具体的错误信息
		E_FAIL:设备返回失败
		E_ACCESSDENIED:设备返回忙
		E_ABORT:获取增强的网络数据通信流失败
		E_UNEXPECTED:设备返回结果无法处理
		其它:HRESULT类型错误
	注意:如果该套接字再次执行读操作,原先返回的指针将会被污染(本身失效或者指向的内容失效)
	*/
	INT WINAPI FaceId_Execute(HANDLE SocketHandle, const TCHAR* InBuffer, OUT const TCHAR** hOutBuffer, UINT CodePage = 936);

	/*
	功能:断开套接字连接
	参数说明:
		SocketHandle:通信句柄
	返回值:
		Windows Sockets Error Codes
	*/
	VOID WINAPI FaceId_Close(HANDLE SocketHandle);

	/*
	功能:静态成员函数,将二进制数据转换为Base64编码字符串
	参数说明:
		InBuffer:要编码的二进制数据
		Count:要编码的字节数
		OutBuffer:存储转换后的Base64编码字符串。如果为NULL,则函数返回转换后的有效字符个数
	返回值:
		-1:参数错误
		>=0:有效字符个数,不包括字符串结束符
	注意:
		结束数据时,OutBuffer的最小长度为(有效字符个数+1)
	调用说明:
		1.第一次调用设置OutBuffer为NULL,获取转换后的字符个数
		2.申请指定长度(字符个数+1)的缓冲区接收数据
		3.第二次调用设置OutBuffer为已申请好的缓冲区,接收数据
	*/
	INT WINAPI Base64_Encode(const BYTE* InBuffer, INT Count, OUT OPTIONAL TCHAR* OutBuffer = NULL);

	/*
	功能:将Base64编码字符串转换为二进制数据
	参数说明:
		InBuffer:要解码的Base64编码字符串
		Count:要解码的字符个数,应该为4的倍数。如果为-1,则自动计算字符串的长度
		OutBuffer:输出缓冲区,用于存储转换后的二进制数据
	返回值:
		-1:参数错误
		-2:数据错误
		>=0:转换后的字节数
	调用说明:
		1.第一次调用设置OutBuffer为NULL,获取转换后的字节长度
		2.申请指定长度的缓冲区接收数据
		3.第二次调用设置OutBuffer为已申请好的缓冲区,接收数据
	*/
	INT WINAPI Base64_Decode(const TCHAR* InBuffer, INT Count, OUT OPTIONAL BYTE* OutBuffer = NULL);

#ifdef __cplusplus
}
#endif

Comments are closed.