由于项目需要,开发在Windows下与Linux下扫描功能,Linux主要是信创的两个系统(UOS、麒麟),研究了一下发现,Windows使用Twain协议与扫描仪通讯,Linux使用的是Sane协议与扫描仪通讯,找到Twain协议和Sane协议的标准文档,英文的,都有大几百页,项目一个月内要求上线,明显没时间慢慢研究,于是在网上找了一番,发现了赞采扫描服务这个第三方组件,这个组件可以支持通过标准扫描协议(Twain、Sane)连接各类扫描硬件,兼容Windows及Linux系统,适配不同CPU指令集(x86、Arm、Loongarch、Mips等),而且不同平台不需要重复适配,一次集成即可完成Twain、Sane协议及不同操作系统的适配。通过使用这个组件,一周内就完成了项目的扫描功能,简直不要太轻松!!那么话不多说,下面简单介绍一下赞采扫描服务组件如何使用。
1.组件安装
首先按需下载安装包:
-Windows\赞采扫描服务-x86-1.0.1.zip
下载链接: https://pan.baidu.com/s/1iBJzevyrWWVSc4NnLTYYyQ?pwd=p5j2
-Linux\赞采扫描服务-amd64-1.0.4.zip
下载链接: https://pan.baidu.com/s/1YQjRM71P4xYDQhqKKrYD_A?pwd=x7yb
-Linux\赞采扫描服务-arm64-1.0.4.zip
下载链接: https://pan.baidu.com/s/1A1wUp88dU_mNYDtuieGI5g?pwd=4jxv
-Linux\赞采扫描服务-loongarch64-1.0.4.zip
下载链接:https://pan.baidu.com/s/1Gpgl5f89BMBtQnOw6kRPXg?pwd=y9ze
-Linux\赞采扫描服务-mips64el-1.0.4.ip
下载链接:https://pan.baidu.com/s/1O0B7bBqiIKNBjAViF01MTQ?pwd=zc4n
官方网站:https://www.nikoyo.com.cn/column/goods?type=productDetails&id=105
1.1Windows平台
1)将zip压缩包解压到任意位置即可。这里以C://soft/ScanService目录为例
2)默认安装目录:C:\Users\%当前用户%\AppData\Local\Nikoyo\赞采扫描服务
3)配置
可以使用文本编辑工具,打开安装目录下的【NKO.Scan.Service.exe.config】配置文件,进行扫描服务的基础配置。
- SavePath:扫描文件默认保存路径,如果调用“001008”接口时,指定了扫描图片需要保存到本地,但未指定保存路径时,则会采用该默认的保存路径(接口详情,见开发手册)。
- Port:扫描服务Websocket使用的端口号。
- CertificatePath:.pfx证书文件路径,为空则以ws协议传输;填写正确的证书路径,则以wss协议传输。
- StartWithSystem:是否开机启动,true为开机启动(默认),false为关闭。
- BackgroundRun:是否后台运行,true为后台运行,任务栏与托盘都不会存在程序窗口,只能通过任务管理器或者附带脚本(shutdown.bat)关闭。False则会出现一个运行窗口,关闭该窗口时,退出扫描服务。
注:以上配置,重启扫描服务生效
1.2Linux平台
1)安装依赖项openjdk-8
Linux平台下的扫描服务,运行需要依赖于JDK,要求当前运行电脑已安装openjdk-8-jdk
2)检查当前电脑的系统架构,选择对应的deb安装包。
命令:uname -a
3)如上图,当前系统架构为arm64(等同arrch64),则选择安装包:赞采扫描服务-arm64-x.y.z.deb。双击开始安装。
4)如果出现以下依赖检查不通过的错误提示:
打开终端,执行以下命令(前提:可通外网,否则需自行前往官网下载对应的依赖并安装):
sudo apt-get update
执行完成后,重新双击进行安装。
5)点击安装。
6)如果弹出密码输入界面,则输入当前电脑的登录密码,点击确定。
7)等待安装完成。
8)安装成功,点击“完成”
9)默认安装目录:/opt/Nikoyo/nko-scan-service
2.组件整体介绍
1)调用方式
赞采扫描服务通过Socket的方式提供对接扫描仪的功能,如下图所示:
2)功能说明
功能码 | 功能 |
001001 | 获取连接到当前终端的所有扫描仪 |
001002 | 选中某一获取到的扫描仪并打开 |
001003 | 获取当前选中扫描仪可配置的项 |
001004 | 设置或修改当前选中扫描仪某一配置项的能力值 |
001007 | 常用参数的便捷配置能力(进纸模式、色彩、尺寸、DPI) |
001008 | 当前扫描仪启动扫描 |
001009 | 获取扫描已传输的文件数量 |
001010 | 获取扫描结果图片 |
001011 | 发送扫描结束通知 |
001012 | 关闭当前选择的扫描仪 |
001013 | 释放当前扫描资源 |
001014 | 获取扫描仪当前状态 |
001015 | 弹出Twain驱动程序参数配置界面 |
001017 | 根据扫描仪ID获取扫描仪序列号 |
3)功能码调用流程
3.快速测试
扫描服务安装完成,并成功激活启动之后,可参考一下步骤,进行扫描服务的快速测试体验。
1)打开安装目录下的web-demo文件夹,使用浏览器打开Demo.html
Windows平台:
Linux平台:
2)打开之后,会自动连接扫描服务,并获取连接到当前电脑的扫描仪列表
3)扫描源:选择要使用的扫描仪(如本教程使用的富士通扫描仪)
4)选择成功后,会自动读取当前扫描仪支持的扫描配置
- 设置想要的扫描参数之后,点击扫描,扫描请求提交成功,会有提示
- 扫描完成之后,会弹出提示“执行完成”
- 在扫描结果列表视图,可以查看到扫描结果图片(可点击放大查看)
4. JavaScript调用示例
下面示例代码可通过浏览器“开发人员工具”中的控制台进行调试:
1)创建1个WebSocket链接到本地的赞采扫描服务;
// 创建一个 WebSocket 对象
let socket = new WebSocket("ws://127.0.0.1:51818");
// 连接打开时触发的事件
socket.onopen = function(event) {
console.log("WebSocket is open now.");
// 连接打开后发送消息到服务器
socket.send("Hello Nikoyo WebSocket Capture Server!");
};
// 接收到消息时触发的事件
socket.onmessage = function(event) {
console.log("Message from server: ", event.data);
};
// 连接关闭时触发的事件
socket.onclose = function(event) {
console.log("WebSocket is closed now.");
};
// 发生错误时触发的事件
socket.onerror = function(error) {
console.log("WebSocket Error: ", error);
};
// 在某个时刻发送消息到服务器
function sendMessage(message) {
if (socket.readyState === WebSocket.OPEN) {
socket.send(message);
console.log("Message sent: ", message);
} else {
console.log("WebSocket is not open. Unable to send message.");
}
}
2)发送功能码(001001)指令获取当前已连接的扫描设备Id列表;
// 获取扫描设备列表
socket.send('{"function": "001001", "params": {}}');
3)根据指定Id发送功能码(001002)指令打开已连接的扫描设备;
// 连接扫描设备,下面已“Uniscan Qi5840”为例:
socket.send('{"function":"001002","params":{"scannerId":"Uniscan Qi5840"}}');
4)发送功能码(001007)指令设置扫描参数;
// 设置扫描参数:从ADF获取,双面,A4幅面,DPI为200.
socket.send('{"function":"001007","params":{"source":"Adf-duplex","model":"color","paper-size":"A4","resolution":200}}');
5)发送功能码(001008)指令启动扫描;
// 开发扫描,将图像保存到指定位置;
socket.send(' {"function":"001008","params":{"fileFormat":"","fileSavePath":"C://ScanResult","fileType":"LocalPath","fileNamePrefix":"合同","fileNameFormat":"datetime","fileMd5Enabled":false}}');
// 开发扫描,将文件以Base64返回;
socket.send(' {"function":"001008","params":{"fileFormat":"","fileSavePath":"D://ScanResult","fileType":"Base64","fileNamePrefix":"合同","fileNameFormat":"datetime","fileMd5Enabled":false}}');
中间数据省略……
6)接收扫描设备返回的图像数据(功能码:001010)及扫描结束通知(功能码:001011);
接收到功能码为001010的消息数据中包含返回的图像数据相关信息。
接收到功能码为001011的消息表示本次扫描全部的图像数据已全部返回。
7)扫描全部结束后发送功能码(001012)指令关闭扫描设备;
// 关闭扫描设备连接。
socket.send(' {"function": "001012","params": {}}');
8)扫描全部结束后发送功能码(001013)指令关闭扫描设备源管理器;
// 关闭扫描设备源管理器连接。
socket.send(' {"function": "001013","params": {}}');
9)扫描全部结束后关闭WebSocket连接。
// 获取扫描设备列表
socket.close;