Node.js llama a la biblioteca dinámica dll Tome el lector de tarjetas de identificación de Huaxu como ejemplo

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:

  1. nodo v12.18.3 (32 bits)
  2. npm 6.14.6
  3. python 2.7.15 (la versión 3.x no es compatible)

Precauciones

  1. La biblioteca dinámica dll solo se puede usar en el sistema de Windows
  2. 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.
  3. 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:
  1. python2.x (la versión de python3.x no es compatible), configure la variable de entorno después de completar la instalación
  2. marco .net 4.5.1
  3. 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

  1. Crear un archivo app.js
  2. 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)

  1. 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
  1. 0x90 Leer información de texto legible por máquina e información de fotos con éxito;
  2. 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)
}
  1. Después de leer la información de la tarjeta de identificación, debe convertir el tipo de búfer a chino
  2. 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

descargar demostración

Supongo que te gusta

Origin blog.csdn.net/qq_18944765/article/details/107913125
Recomendado
Clasificación