需求来源

由于使用Electron使用开发桌面端,同时也需要连接硬件设备,单纯使用js方法无法完成,需要通过Node调用dll动态库方式完成。

版本说明:

  1. node v12.18.3 (32位)
  2. npm 6.14.6
  3. python 2.7.15 (3.x版本不支持)

注意事项

  1. dll动态库在windows系统下才能使用
  2. dll动态库和node同时都是32位,或者都是64位,一般情况下会使用32位,这样能兼容到64位系统。
  3. node 版本<10 && Electron < 6时,使用node-ffi;node版本>=10 && Electron >=6时,使用nodt-ffi-napi

安装依赖

安装ffi依赖时需要以下环境:
  1. python2.x (python3.x版本不支持),安装完成后设置环境变量
  2. .net framework 4.5.1
  3. visual C++ Build Tools
-- 以管理员身份运行:
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拷贝到项目目录中,这里以华旭身份证阅读器为例
--- 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 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
  • 返回值
  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. 读取身份证信息后需要把buffer类型转为中文
  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

下载demo

Node.js 调用 dll动态库 以华旭身份证阅读器为例相关推荐

  1. JNA框架调用dll动态库(给你整得明明白白)

    java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的.网上文章一大堆,我就不废话了. 使用JNA框架调用DLL动态库,步骤如下: 一.环境准备 1 ...

  2. python能调用身份证读卡器吗_最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册...

    最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册 1.定义 应用函数开发包含下列文件: termb.dll      API函数的动态联接库 sdtapi.dll     内部动态库 ...

  3. JNA二次开发华视身份证阅读器

    JNA二次开发华视身份证阅读器 前言 添加依赖 SDK资料 编写代码 遇到的问题(坑) 前言 这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative,其中JNA调用 ...

  4. 华视身份证阅读器SDK使用手册

    华视身份证阅读器SDK使用手册 V1.33 华视电子读写设备有限公司  2008年07月11日 概述 本手册是操作身份证阅读器动态库应用函数的定义格式.调用方法和返回值的说明.在使用前,请确认授权文件 ...

  5. 最近的项目中用到读卡器,用的华视身份证阅读器,附上SDK使用手册

    <script type="text/javascript">// </script> <script type="text/javascr ...

  6. VUE实现华视身份证阅读器读取身份证信息

    VUE实现华视身份证阅读器读取身份证信息 话不多上直接上代码,写的不怎么规范多多包涵,我是在模态框实现的,在这里就只提供模态框代码. 最后附上华视身份证阅读器安装文件和浏览器插件链接: [https: ...

  7. VUE实现华视身份证阅读器读取身份证信息(本文分两种情况,第一中是点击按钮读取信息,一种是自动读取信息)

    本文是用了vue+element来实现华视身份证读卡器读取身份信息的,当然在开发之前要做好前提准备,就是厂家提供对应设备的api和安装对应的驱动.本文通过两种方法来实现读取信息,第一种是点击按钮读取信 ...

  8. Windows系统下通过JNI调用dll动态库的实现

    目的:java代码使用jni获取数据 工具: eclipse + Microsoft visual studio (c++) 业务代码: Java代码业务实现: package com.weip.jn ...

  9. Js调用C++动态库(v8)

    目录 一.node-ffi模块 二.C++拓展插件 1.hello world入门 2.开发延伸 JS调用C++的两种方式:node-ffi.C++拓展插件. 一.node-ffi模块 node-ff ...

最新文章

  1. Velocity Toolbox
  2. 限制input输入小数只能到3位或者只能输入正整数(兼容ios)
  3. php中@作用,@字符在PHP中有什么作用?
  4. python操作文件的库_Python使用pyshp库读取shapefile信息的方法
  5. Python 实现图片轮播及音乐循环播放
  6. promise存在的意义分析resolve reject catch
  7. android怎么ota升级,Android OTA升级过程
  8. ajax如何处理程序设计,Struts与Ajax高级程序设计
  9. 求数组三项之和最接近某个目标数字
  10. 在GridView控件FooterTemplate内添加记录 Ver2
  11. java多线程编程(三)- 线程的创建
  12. 利用bloom filter算法处理大规模数据过滤
  13. 第二季-专题5-核心初始化
  14. 曲折中前行的汉语编程
  15. visual studio 2013 编译 filezilla和filezilla server
  16. php 公众号多图文消息,微信公众号怎样群发多图文消息?
  17. 根据广播星历计算GNSS卫星在瞬时地球坐标系中的坐标
  18. 淘宝客CMS,微信公众号,微信淘客机器人
  19. 为什么有时优盘是只读模式_如何设置U盘为只读模式
  20. 图像直方图均衡化和空间滤波

热门文章

  1. MySQL8.0.19 双主热备
  2. Allegro·芯片GND引脚铺铜问题及解决方案)
  3. Qt实现软件任务栏托盘功能
  4. 为什么现在这么多人离婚呢?
  5. 开机显示:你可能是软件盗版的受害者...解决办法
  6. 定义求x的n次幂的函数,并返回计算结果
  7. #Labview <史上最全VISA驱动下载链接>
  8. typescript-函数的类型
  9. Java编写的公交查询系统 功能非常齐全 完整源码
  10. Flink应用——公交疫情实时流监控