前端想要读取到身份证的信息大致需要三步,1:安装ffi库; 2: 重新编译ffi模块;3: 对Buffer数据解码拿到真实数据;
一:Nodejs调用dll动态链接库
- 环境配置
- 系统版本
- 相关模块
环境配置解决:
- 安装VC++ Build Tools,下载完成后设置环境变量
*计算机-属性-高级系统环境-环境变量
*设置环境变量要看系统是64位还是32位如果是64位,具体要看安装的路径。
*64位操作系统:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64;
*32位操作系统:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
- 下载Python2.7.X版本,因为node-gyp不支持Python3
- 如果环境干净,可以使用下边命令进行全局安装
*cnpm install --global --production windows-build-tools
*windows-build-tools下载:https://msdn.microsoft.com/en-us/library/ms235639.aspx?__hstc=268264337.9321b9803d33050e091ca8e53849b297.1521437931527.1521437931527.1521511183075.2&__hssc=268264337.1.1521511183075&__hsfp=2211679638
系统版本
- 电脑是64位的只能用64位的dll动态库文件,32位的用32位的dll文件。
*windows调用不了.so,同理linux也调用不了.dll。
*附上查看dll文件位数的命令 命令行运行:dumpbin /headers path/dirname.dll。
*警告:项目开发之前一定要查看dll文件是否全部是64位或者32位的,这样能少踩坑。
- vs2010或者2015都可以,亲测正确
-
相关模块
npm install -g node-gyp
npm install --save ffi
相关命令(编译ffi模块和ref模块--重新编译ffi模块,以便electron使用)
cd node_modules\ffi
node-gyp rebuild --target=1.8.2 --arch=ia32 --dist-url=https://atom.io/download/electron
cd node_modules\ref
node-gyp rebuild --target=1.8.2 --arch=ia32 --dist-url=https://atom.io/download/electron
简单解释:
- target指明electron版本,arch表明想要重新编译成多少位的
- ia32位x86平台,x64位64位平台,DLL位数,模块位数,Node.js位数应保持一致,否则会报错
- dist-url指定了去哪里下载electron的头文件,可能这里你下载的很缓慢,去前边看看手动下载electron头文件的方法
解决:安装node—gyp 全局安装 如果不成功 先移除再次安装 接着安装electron-rebuild 、electron 然后 重编译原生Node模块 执行 来编译ffi和ref模块 这样就可以引入ffi模块了
安装node-gyp之前要安装VS2015,并且环境要配置好,还要安装Python2.7.X版本
此处需要重新编译的有ffi和ref两个模块,命令如下(ref模块不需要手动安装,在安装ffi模块的时候就会自动安装ref)
- 编译方案一:普通的electron html页面 用这个就可以编译
.\node_modules\.bin\electron-rebuild.cmd
- 编译方案二:electron-vue搭建的项目需要到当前的目录去编译
cd node_modules\ffi
node-gyp rebuild --target=1.8.2 --arch=ia32 --dist-url=https://atom.io/download/electron
cd node_modules\ref
node-gyp rebuild --target=1.8.2 --arch=ia32 --dist-url=https://atom.io/download/electron
简单解释: target指明electron版本,arch表明想要重新编译成多少位的,ia32位x86平台,x64位64位平台,DLL位数,模块位数,Node.js位数应保持一致,否则会报错,dist-url指定了去哪里下载electron的头文件,可能这里你下载的很缓慢,去前边看看手动下载electron头文件的方法
二:调身份证安全模块API问题解决
汉字乱码问题 内存溢出 数据类型转换问题
汉字乱码问题 获取到的身份证图片base编码 需要重新解码才能正常显示, //保存base64图片POST方法
//保存base64图片POST方法
app.post('/upload', function(req, res){
//接收前台POST过来的base64
var imgData = req.body.imgData;
//过滤data:URL
var base64Data = imgData.replace(/^data:image\/\w+;base64,/, "");
var dataBuffer = new Buffer(base64Data, 'base64');//这一步就是图片解码必需的,否则生成的图片会出错
fs.writeFile("out.png", dataBuffer, function(err) {
if(err){
res.send(err);
}else{
res.send("保存成功!");
}
});
});
解决方法: node 字符编码
- ascii ASCLL字符串
- utf8 UTF-8字符串
- utf16le UTF-16LE字符串
- ucs2 UCS2字符串
- base64 经过BASE64编码后的字符串
- binary 二进制数据(不推荐使用)
- hex 使用16进制数值表示的字符串 eg:这里列举汉字转码方式,其它字符转码详见代码。。。 const msgInfo= msg.toString('utf16le',0,256);
> 数据类型转换问题
> 数据类型转换问题
## 三:打印机二维码设备API文件解决
本地生成二维码:
用到生成二维码插件----canvas2image.js
用到的技术点:
1. 1、canvas绘制的图片转成base64编码
1. 2、通过fs模块将生成的base64图片编码进行转码(new Buffer)然后保存到本地
1. 3、下载二维码
---
function downloadFile(uri,filename,callback){
var stream = fs.createWriteStream(filename);
request(uri).pipe(stream).on('close', callback);
}
downloadFile(fileUrl,filename,function(){
//do something
})
## 四:双目摄像头问题解决
## 五:electron-vue打包问题解决
npm run build:win32 // x86 打包
// test.js
var ffi = require('ffi')
const newPort = ffi.Library('./YkPosdll',{
'YkOpenDevice': [ 'int', ['int', 'int' ] ], //打开端口
})
报错信息如下:
- Error: Dynamic Linking Error: Win32 error 193
*解决方法:
193这个编号的意思是不是有效的win32程序。检查发现这里出错原因是Node.js是64位而dll是32位的,将dll编译成64位后正常输出。
- Error: Dynamic Linking Error: Win32 error 126
*解决方法:
错误码为找不到指定的模块,改成传入完整路径即可,如下修改:
var iopath = path.join(__dirname, '/IOC.dll');
var io = ffi.Library(iopath ,{
'IOC_Init':['int32',[]],
});
-Uncaught Error:Dynamic Symbol Retrieval Error:Win32 error 127 at DynamicLibrary.get
*解决方法
:dll不是C风格的模块,可以在要导出的方法前加上 extern “C”(注意,这是修改dll源码并重新编译生成dll)
**用到的知识点 fs模块: 1、本地读写文件(fs.writefile) 2、判断本地是否存在该文件夹/文件(fs.stat)
打包的时候dll文件不会被打包? 解决方法一:手动把dll文件放到打包后的根目录 解决方法二:
参考文章:https://blog.yasking.org/a/electron-build-env.html
三:声网 Agora SDK视频通话
> electron引用jq报错问题--一行搞定electron和jquery冲突,electron和jquery最简单和完美的兼容方法
electron和jquery的常见报错:
Uncaught ReferenceError: $ is not defined
解决方法:在jquery最末端加上这样一行判断即可.
<script src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
<script>if (typeof module === 'object') {window.jQuery = window.$ = module.exports;};</script>
这样就回归到熟悉常用的js方式上了
该方法即解决了web端正常浏览,也保证了应用端的正常.一举两得.
0. ------检查浏览器兼容性(checkSystemRequirements)
1. ------枚举系统设备 (getDevices)
2. ------创建音视频对象 (createClient)
3. ------初始化客户端对象 (init)
4. ------加入 AgoraRTC 频道 (join)
5. ------创建音视频流对象 (createStream)
6. ------设置本地流 Profile(localStream.setVideoProfile("480p_4");)
7. ------初始化本地流(localStream.init)
8. ------发布本地流(client.publish)
9. ------播放本地/远端流(localStream.play("agora-remote");)
笔者在调试设备过程中遇到了很多问题,文章没有一一列出,如果你也正好在调试硬件设备,遇到问题的话就留言,我可以帮你提供思路。