Node.js は DLL 動的ライブラリを呼び出します Huaxu ID カード リーダーを例に挙げます

需要の源

Electron を使用すると開発デスクトップを使用し、ハードウェア デバイスを接続する必要があるため、js メソッドを使用するだけでは完了できず、Node を介して dll ダイナミック ライブラリを呼び出すことで完了する必要があります。

リリースノート:

  1. ノード v12.18.3 (32 ビット)
  2. npm 6.14.6
  3. Python 2.7.15 (3.x バージョンはサポートしていません)

予防

  1. DLL ダイナミック ライブラリは Windows システムでのみ使用できます。
  2. DLL ダイナミック ライブラリとノードは同時に 32 ビットまたは 64 ビットですが、一般的には 64 ビット システムと互換性を持たせるために 32 ビットが使用されます。
  3. ノード バージョン <10 && Electron < 6 の場合は、node-ffi を使用します。ノード バージョン >=10 && Electron >=6 の場合、nodt-ffi-napi を使用します。

依存関係をインストールする

ffi 依存関係をインストールするには、次の環境が必要です。
  1. python2.x (python3.x バージョンはサポートしていません)、インストール完了後に環境変数を設定します
  2. .netフレームワーク4.5.1
  3. ビジュアル C++ ビルド ツール
-- 以管理员身份运行:
npm install -global --production windows-build-tools
npm install -global node-gyp
cd でプロジェクト ディレクトリに移動し、ffi をインストールします
npm install ffi-napi --save

ffiコール

  1. app.js ファイルを作成する
  2. HxgcDeviceApi_J10.dll をプロジェクト ディレクトリにコピーします。ここでは例として Huaxu ID カード リーダーを取り上げます。
--- 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 には「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 );
  • パラメータの説明
シリアルナンバー パラメータ名 説明する
1 ポート 入力パラメータは整数で、ポート番号を示します。
2 pucCHMsg 出力パラメータは、読み取られたテキスト情報を指す符号なし文字ポインタであり、その長さは puiCHMsgLen パラメータによって出力されます。ポインタが指す記憶域スペースは呼び出し元によって割り当てられ、256 バイト以上でなければなりません。
3 puiCHMsgLen 出力パラメータは、読み取られたテキスト情報の長さ (最大 256 バイト) を指す符号なし整数ポインタです。
4 pucPHMsg 出力パラメータは、読み取られた写真情報を指す符号なし文字ポインタであり、その長さは puiPHMsgLen パラメータによって出力されます。このポインタが指す記憶域スペースは呼び出し元によって割り当てられ、1024 バイト以上でなければなりません。
5 puiPHMsgLen 出力パラメータは、読み取られた写真情報の長さを指す符号なし整数ポインタで、最大長は 1024 バイトです。
6 pucFPMsg 出力パラメータは、読み取られた指紋情報を指す符号なし文字ポインタであり、その長さは puiFPMsgLen パラメータによって出力されます。このポインタが指す記憶域スペースは呼び出し元によって割り当てられ、1024 バイト以上でなければなりません。
7 ぷいFMsgLen 出力パラメータは、読み取られた指紋情報の長さ (最大 1024 バイト) を指す符号なし整数ポインタです。
8 iIfOpen 入力パラメータ、整数、SDT_ResetSAM を参照
  • 戻り値
  1. 0x90 機械可読テキスト情報と写真情報を正常に読み取ります。
  2. 他の機械可読テキスト メッセージや写真メッセージを読み取ることができませんでした
// 调用 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. IDカード情報を読み取った後、バッファタイプを中国語に変換する必要があります
  2. 依存ライブラリをインストールする
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'))

走る

node app.js

デモをダウンロードする

おすすめ

転載: blog.csdn.net/qq_18944765/article/details/107913125