Node.js 调用 dll动态库 以华旭身份证阅读器为例
需求来源
由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成。
版本说明:
- node v12.18.3 (32位)
- npm 6.14.6
- python 2.7.15 (3.x版本不支持)
注意事项
- dll动态库在windows系统下才能使用
- dll动态库和node同时都是32位,或者都是64位,一般情况下会使用32位,这样能兼容到64位系统。
- node 版本<10 && Electron < 6时,使用node-ffi;node版本>=10 && Electron >=6时,使用nodt-ffi-napi
安装依赖
安装ffi依赖时需要以下环境:
- python2.x (python3.x版本不支持),安装完成后设置环境变量
- .net framework 4.5.1
- visual C++ Build Tools
-- 以管理员身份运行:
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拷贝到项目目录中,这里以华旭身份证阅读器为例
--- 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 | iPort | 输入参数,整数,表示端口号 |
2 | pucCHMsg | 输出参数,无符号字符型指针,指向读到的文字信息,其长度由puiCHMsgLen参数输出。该指针指向的存储空间由调用者分配,不得小于256字节。 |
3 | puiCHMsgLen | 输出参数,无符号整型数指针,指向读到的文字信息长度,最长256字节。 |
4 | pucPHMsg | 输出参数,无符号字符型指针,指向读到的相片信息,其长度由puiPHMsgLen参数输出。该指针指向的存储空间由调用者分配,不得小于1024字节。 |
5 | puiPHMsgLen | 输出参数,无符号整型数指针,指向读到的相片信息长度,最长1024字节。 |
6 | pucFPMsg | 输出参数,无符号字符型指针,指向读到的指纹信息,其长度由puiFPMsgLen参数输出。该指针指向的存储空间由调用者分配,不得小于1024字节。 |
7 | puiFMsgLen | 输出参数,无符号整型数指针,指向读到的指纹信息长度,最长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)
}
- 读取身份证信息后需要把buffer类型转为中文
- 安装依赖库
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
下载demo
Node.js 调用 dll动态库 以华旭身份证阅读器为例相关推荐
- JNA框架调用dll动态库(给你整得明明白白)
java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的.网上文章一大堆,我就不废话了. 使用JNA框架调用DLL动态库,步骤如下: 一.环境准备 1 ...
- python能调用身份证读卡器吗_最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册...
最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册 1.定义 应用函数开发包含下列文件: termb.dll API函数的动态联接库 sdtapi.dll 内部动态库 ...
- JNA二次开发华视身份证阅读器
JNA二次开发华视身份证阅读器 前言 添加依赖 SDK资料 编写代码 遇到的问题(坑) 前言 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative,其中JNA调用 ...
- 华视身份证阅读器SDK使用手册
华视身份证阅读器SDK使用手册 V1.33 华视电子读写设备有限公司 2008年07月11日 概述 本手册是操作身份证阅读器动态库应用函数的定义格式.调用方法和返回值的说明.在使用前,请确认授权文件 ...
- 最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册
<script type="text/javascript">// </script> <script type="text/javascr ...
- VUE实现华视身份证阅读器读取身份证信息
VUE实现华视身份证阅读器读取身份证信息 话不多上直接上代码,写的不怎么规范多多包涵,我是在模态框实现的,在这里就只提供模态框代码. 最后附上华视身份证阅读器安装文件和浏览器插件链接: [https: ...
- VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)
本文是用了vue+element来实现华视身份证读卡器读取身份信息的,当然在开发之前要做好前提准备,就是厂家提供对应设备的api和安装对应的驱动.本文通过两种方法来实现读取信息,第一种是点击按钮读取信 ...
- Windows系统下通过JNI调用dll动态库的实现
目的:java代码使用jni获取数据 工具: eclipse + Microsoft visual studio (c++) 业务代码: Java代码业务实现: package com.weip.jn ...
- Js调用C++动态库(v8)
目录 一.node-ffi模块 二.C++拓展插件 1.hello world入门 2.开发延伸 JS调用C++的两种方式:node-ffi.C++拓展插件. 一.node-ffi模块 node-ff ...
最新文章
- Velocity Toolbox
- 限制input输入小数只能到3位或者只能输入正整数(兼容ios)
- php中@作用,@字符在PHP中有什么作用?
- python操作文件的库_Python使用pyshp库读取shapefile信息的方法
- Python 实现图片轮播及音乐循环播放
- promise存在的意义分析resolve reject catch
- android怎么ota升级,Android OTA升级过程
- ajax如何处理程序设计,Struts与Ajax高级程序设计
- 求数组三项之和最接近某个目标数字
- 在GridView控件FooterTemplate内添加记录 Ver2
- java多线程编程(三)- 线程的创建
- 利用bloom filter算法处理大规模数据过滤
- 第二季-专题5-核心初始化
- 曲折中前行的汉语编程
- visual studio 2013 编译 filezilla和filezilla server
- php 公众号多图文消息,微信公众号怎样群发多图文消息?
- 根据广播星历计算GNSS卫星在瞬时地球坐标系中的坐标
- 淘宝客CMS,微信公众号,微信淘客机器人
- 为什么有时优盘是只读模式_如何设置U盘为只读模式
- 图像直方图均衡化和空间滤波