Node.js appelle la bibliothèque dynamique dll Prenons l'exemple du lecteur de carte d'identité Huaxu

source de demande

Étant donné que l'utilisation d'Electron pour utiliser le bureau de développement et doit également connecter des périphériques matériels, elle ne peut pas être complétée en utilisant simplement la méthode js, et elle doit être complétée en appelant la bibliothèque dynamique dll via Node.

Notes de version:

  1. nœud v12.18.3 (32 bits)
  2. npm 6.14.6
  3. python 2.7.15 (la version 3.x ne prend pas en charge)

Précautions

  1. La bibliothèque dynamique dll ne peut être utilisée que sous le système Windows
  2. La bibliothèque dynamique dll et le nœud sont à la fois 32 bits ou 64 bits. Généralement, 32 bits sont utilisés, de sorte qu'ils peuvent être compatibles avec les systèmes 64 bits.
  3. Lorsque la version du nœud <10 && Electron < 6, utilisez node-ffi ; lorsque la version du nœud >=10 && Electron >=6, utilisez nodt-ffi-napi

installer les dépendances

L'environnement suivant est requis pour installer les dépendances ffi :
  1. python2.x (la version python3.x ne prend pas en charge), définissez la variable d'environnement une fois l'installation terminée
  2. Cadre .net 4.5.1
  3. Outils de construction visuels C++
-- 以管理员身份运行:
npm install -global --production windows-build-tools
npm install -global node-gyp
cd dans le répertoire du projet pour installer ffi
npm install ffi-napi --save

ffi appel

  1. Créer un fichier app.js
  2. Copiez HxgcDeviceApi_J10.dll dans le répertoire du projet, ici nous prenons le lecteur de carte d'identité Huaxu comme exemple
--- 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 a une méthode '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 );
  • Paramètre Description
numéro de série le nom du paramètre illustrer
1 Port Le paramètre d'entrée, un entier, indique le numéro de port
2 pucCHMsg Le paramètre de sortie est un pointeur de caractère non signé, pointant vers les informations de texte lues, et sa longueur est sortie par le paramètre puiCHMsgLen. L'espace de stockage pointé par le pointeur est alloué par l'appelant et ne doit pas être inférieur à 256 octets.
3 puiCHMsgLen Le paramètre de sortie est un pointeur entier non signé, pointant vers la longueur des informations textuelles lues, jusqu'à 256 octets.
4 pucPHMsg Le paramètre de sortie est un pointeur de caractère non signé, qui pointe vers les informations de photo lues, et sa longueur est sortie par le paramètre puiPHMsgLen. L'espace de stockage pointé par ce pointeur est alloué par l'appelant et ne doit pas être inférieur à 1024 octets.
5 puiPHMsgLen Le paramètre de sortie est un pointeur entier non signé, qui pointe vers la longueur des informations de photo lues, et la longueur maximale est de 1024 octets.
6 pucFPMsg Le paramètre de sortie est un pointeur de caractère non signé, qui pointe vers les informations d'empreinte digitale lues, et sa longueur est sortie par le paramètre puiFPMsgLen. L'espace de stockage pointé par ce pointeur est alloué par l'appelant et ne doit pas être inférieur à 1024 octets.
7 puiFMsgLen Le paramètre de sortie est un pointeur entier non signé, pointant vers la longueur des informations d'empreintes digitales lues, jusqu'à 1024 octets.
8 iSiOuvert Paramètre d'entrée, entier, voir SDT_ResetSAM
  • valeur de retour
  1. 0x90 Lire avec succès les informations textuelles lisibles par machine et les informations photo ;
  2. Impossible de lire d'autres SMS et messages photo lisibles par machine
// 调用 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. Après avoir lu les informations de la carte d'identité, vous devez convertir le type de tampon en chinois
  2. Installer les bibliothèques dépendantes
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'))

courir

node app.js

télécharger la démo

Guess you like

Origin blog.csdn.net/qq_18944765/article/details/107913125