fuente de demanda
Debido a que el uso de Electron para usar el escritorio de desarrollo y también la necesidad de conectar dispositivos de hardware, no se puede completar simplemente usando el método js, y debe completarse llamando a la biblioteca dinámica dll a través de Node.
Notas de lanzamiento:
- nodo v12.18.3 (32 bits)
- npm 6.14.6
- python 2.7.15 (la versión 3.x no es compatible)
Precauciones
- La biblioteca dinámica dll solo se puede usar en el sistema de Windows
- La biblioteca dinámica y el nodo dll son de 32 bits o de 64 bits al mismo tiempo. Generalmente, se usa 32 bits, para que pueda ser compatible con sistemas de 64 bits.
- Cuando la versión del nodo <10 && Electron <6, use node-ffi; cuando la versión del nodo sea >=10 && Electron >=6, use nodt-ffi-napi
instalar dependencias
Se requiere el siguiente entorno para instalar las dependencias ffi:
- python2.x (la versión de python3.x no es compatible), configure la variable de entorno después de completar la instalación
- marco .net 4.5.1
- Herramientas visuales de compilación de C++
-- 以管理员身份运行:
npm install -global --production windows-build-tools
npm install -global node-gyp
cd al directorio del proyecto para instalar ffi
npm install ffi-napi --save
por favor llame
- Crear un archivo app.js
- Copie HxgcDeviceApi_J10.dll en el directorio del proyecto, aquí tomamos el lector de tarjetas de identificación Huaxu como ejemplo
--- app.js
//引入ffi-napi
const ffi = require('ffi-napi')
//加载动态库
const hxgc = new ffi.Library('HxgcDeviceApi_J10',{
// CarderOpen为调用方法名,第一个int32为返回值类型,
// 第二、第三个int32为参数值类型
'CarderOpen':['int32',['int32','int32']],
'GetModuleVer':['int',['int','string']],
'SDT_OpenPort':['int32',['int32']],
'SDT_ResetSAM':['int32',['int32','int32']],
'SDT_ReadBaseMsg':['int32',['int32','string','int32','string','int32','int32']]
})
//调用方法
const result = hxgc.CarderOpen(1001,115200)
- HxgcDeviceApi_J10.dll tiene un método 'SDT_ReadBaseMsg'
int __stdcall SDT_ReadBaseFPMsg( int iPort ,
unsigned char* pucCHMsg ,
unsigned int* puiCHMsgLen ,
unsigned char* pucPHMsg ,
unsigned int* puiPHMsgLen,
unsigned char* pucFPMsg,
unsigned int* puiFMsgLen,
int iIfOpen );
- Descripción de parámetros
número de serie | nombre del parámetro | ilustrar |
---|---|---|
1 | Puerto | El parámetro de entrada, un número entero, indica el número de puerto |
2 | pucCHMsg | El parámetro de salida es un puntero de carácter sin signo, que apunta a la información de texto leído, y su longitud la emite el parámetro puiCHMsgLen. El espacio de almacenamiento al que apunta el puntero lo asigna la persona que llama y no debe ser inferior a 256 bytes. |
3 | puiCHMsgLen | El parámetro de salida es un puntero entero sin signo, que apunta a la longitud de la información de texto leída, hasta 256 bytes. |
4 | pucPHMsg | El parámetro de salida es un puntero de carácter sin signo, que apunta a la información de la foto leída, y el parámetro puiPHMsgLen emite su longitud. El espacio de almacenamiento al que apunta este puntero lo asigna la persona que llama y no debe ser inferior a 1024 bytes. |
5 | puiPHMsgLen | El parámetro de salida es un puntero entero sin signo, que apunta a la longitud de la información de la foto leída, y la longitud máxima es de 1024 bytes. |
6 | pucFPMsg | El parámetro de salida es un puntero de carácter sin signo, que apunta a la información de la huella dactilar leída, y su longitud se emite mediante el parámetro puiFPMsgLen. El espacio de almacenamiento al que apunta este puntero lo asigna la persona que llama y no debe ser inferior a 1024 bytes. |
7 | puiFMsgLen | El parámetro de salida es un puntero entero sin signo, que apunta a la longitud de la información de la huella dactilar leída, hasta 1024 bytes. |
8 | iIfOpen | Parámetro de entrada, entero, ver SDT_ResetSAM |
- valor devuelto
- 0x90 Leer información de texto legible por máquina e información de fotos con éxito;
- Error al leer otros mensajes de texto legibles por máquina y mensajes con fotos
// 调用 SDT_ReadBaseFPMsg 获取身份证基本信息
//个人基本信息
const byCHMsg = Buffer.alloc(256+1)
//照片信息
const byPHMsg = Buffer.alloc(1024+1)
const res = hxgc.SDT_ReadBaseMsg(1001,byCHMsg,0,byPHMsg,0,1)
//16进制0x90转换10进制为144
if (res == 144) {
//读取成功
console.log(byCHMsg)
}
- Después de leer la información de la tarjeta de identificación, debe convertir el tipo de búfer a chino
- Instalar bibliotecas dependientes
npm install iconv-lite --save
// 引入依赖库
const iconv = require('iconv-lite')
//定义个人基本信息属性
const name = Buffer.alloc(30)
const sex = Buffer.alloc(2)
const race = Buffer.alloc(4)
const birth = Buffer.alloc(16)
const address = Buffer.alloc(70)
const id = Buffer.alloc(36)
const company = Buffer.alloc(30)
const beginDate = Buffer.alloc(16)
const endDate = Buffer.alloc(16)
//把个人基本信息复制到各个属性中
byCHMsg.copy(name,0,0,30)
byCHMsg.copy(sex,0,30,32)
byCHMsg.copy(race,0,32,36)
byCHMsg.copy(birth,0,36,52)
byCHMsg.copy(address,0,52,122)
byCHMsg.copy(id,0,122,158)
byCHMsg.copy(company,0,158,188)
byCHMsg.copy(beginDate,0,188,204)
byCHMsg.copy(endDate,0,204,220)
//输出中文
console.log('name:'+iconv.decode(name,'utf16'))
console.log('sex:'+iconv.decode(sex,'utf16'))
console.log('race:'+iconv.decode(race,'utf16'))
console.log('birth:'+iconv.decode(birth,'utf16'))
console.log('address:'+iconv.decode(address,'utf16'))
console.log('id:'+iconv.decode(id,'utf16'))
console.log('company:'+iconv.decode(company,'utf16'))
console.log('beginDate:'+iconv.decode(beginDate,'utf16'))
console.log('endDate:'+iconv.decode(endDate,'utf16'))
correr
node app.js