在对接打印机硬件设备的时候如果给出的开发包是sdk, 并且工具文件是dll, 就可以参考以下流程去使用:
需要使用到nodejs插件ffi-napi、ref-napi、ffi、ref等,这些都属于nodejs插件,作用都是调用C++的, 不支持在浏览器端直接使用,所以需要在nodejs环境下集成API供浏览器使用,安装node插件需要的环境有很多,比如python, VS
一、 环境安装
安装最高版本的visual studio的c++环境, 安装python3及以上版本。要记得配置环境变量
全局安装node-gyp
npm install node-gyp -g
如果有遇到淘宝镜像过期的情况,,切换npm源
淘宝镜像过期是指淘宝的NPM镜像(即淘宝的NPM包管理工具)的证书已经过期。这通常发生在2024年1月22日,这是淘宝原镜像域名(registry.npm.taobao.org)的HTTPS证书到期的时间。由于该证书的过期,使用旧的淘宝NPM镜像可能会导致编译失败或超时,影响前端工程的正常迭代和上线。
为了避免这种情况,淘宝已经在2021年发文称,NPM淘宝镜像已经从registry.npm.taobao.org切换到了registry.npmmirror.com。因此,为了保持前端工程的正常运行,开发者需要将NPM的镜像源切换到新的淘宝NPM镜像地址。
切换镜像源的具体步骤如下:
清空NPM缓存:在命令行中运行npm cache clean --force命令。
切换NPM镜像源:在命令行中运行npm config set registry https://registry.npmmirror.com命令。
安装淘宝的NPM命令工具cnpm(可选):在命令行中运行npm install -g cnpm --registry=https://registry.npmmirror.com命令。
检查NPM镜像源是否配置成功:在命令行中运行npm config get registry命令,查看当前NPM镜像源是否为https://registry.npmmirror.com。
请注意,由于淘宝镜像的HTTPS证书已经过期,因此使用旧的淘宝NPM镜像可能会导致编译失败或超时。
二、搭建nodejs项目:
- 首先在要创建项目的文件夹下执行npm init 初始化package.json,然后执行npm install安装依赖,安装express
npm init
npm install
npm install express
npm install ffi-napi
2. 创建项目文件,比如你的项目入口文件叫server.js
const express = require("express");
const ffi = require("ffi-napi");
const app = express();
app.use(express.json()); // 支持 JSON 请求体
// 加载 .dll 文件
const dll = ffi.Library("./printer.sdk.dll", {
InitPrinter: ["void*", ["string"]], // 根据你的函数签名来配置,第一个参数是返回值类型,第二个数组是参数类型
OpenPort: ["int", ["void*", "string"]],
ClosePort: ["int", ["void*"]],
});
// 暴露 API 接口
app.post("/call-dll-function", (req, res) => {
const input = req.body.input; // 假设你通过 POST 请求的 JSON 主体传递输入参数
const result = dll.InitPrinter(input[0]);
res.send(result); // 返回响应
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
3. 执行 node server.js 打印出`Server is running on port 3000`, 就表示node服务已经创建成功了
三、vue中调用
- 配置代理服务器,在vite.config.ts中server配置项添加以下代码
proxy: {
//配置自定义代理规则
"/dll": {
target: 'http://localhost:3000', // Node 服务地址
ws: true, // 是否启用 web sockets
changeOrigin: true, // 开启代理,在本地创建一个虚拟服务器,然后发送请求的数据,会同时会收到请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
rewrite: (path) => path.replace(/^\/dll/, ""),
},
},
2. 在vue中调用nodejs暴露出来的api,传递符合条件的参数类型。
const getData = () => {
fetch("/dll/call-dll-function", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ input: ['XP-D362B'] }), // 传递输入参数到 .dll 函数
})
.then((response) => response.text())
.then((data) => console.log(data)) // 打印服务器响应
.catch((error) => {
console.error("Error:", error);
});
};
这就是整体的流程啦,如有错误,感谢指点~~~