需要の源
Electron を使用すると開発デスクトップを使用し、ハードウェア デバイスを接続する必要があるため、js メソッドを使用するだけでは完了できず、Node を介して dll ダイナミック ライブラリを呼び出すことで完了する必要があります。
リリースノート:
- ノード v12.18.3 (32 ビット)
- npm 6.14.6
- Python 2.7.15 (3.x バージョンはサポートしていません)
予防
- DLL ダイナミック ライブラリは Windows システムでのみ使用できます。
- DLL ダイナミック ライブラリとノードは同時に 32 ビットまたは 64 ビットですが、一般的には 64 ビット システムと互換性を持たせるために 32 ビットが使用されます。
- ノード バージョン <10 && Electron < 6 の場合は、node-ffi を使用します。ノード バージョン >=10 && Electron >=6 の場合、nodt-ffi-napi を使用します。
依存関係をインストールする
ffi 依存関係をインストールするには、次の環境が必要です。
- python2.x (python3.x バージョンはサポートしていません)、インストール完了後に環境変数を設定します
- .netフレームワーク4.5.1
- ビジュアル C++ ビルド ツール
-- 以管理员身份运行:
npm install -global --production windows-build-tools
npm install -global node-gyp
cd でプロジェクト ディレクトリに移動し、ffi をインストールします
npm install ffi-napi --save
ffiコール
- app.js ファイルを作成する
- 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)
- 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 を参照 |
- 戻り値
- 0x90 機械可読テキスト情報と写真情報を正常に読み取ります。
- 他の機械可読テキスト メッセージや写真メッセージを読み取ることができませんでした
// 调用 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)
}
- IDカード情報を読み取った後、バッファタイプを中国語に変換する必要があります
- 依存ライブラリをインストールする
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