更新记录
1.1.9(2022-11-22)
修复 408 扫码丢字符问题
身份证模块 增加了对 5502 的兼容
1.1.8(2022-09-05)
5501P 兼容优化
1.1.7(2022-06-09)
查看更多增加了 sendRaw 功能 用来直接发送指令
平台兼容性
Android | Android CPU类型 | iOS |
---|---|---|
适用版本区间:5.0 - 10.0 | armeabi-v7a:支持,arm64-v8a:支持,x86:未测试 | × |
原生插件通用使用流程:
- 购买插件,选择该插件绑定的项目。
- 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
- 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
- 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
- 开发完毕后正式云打包
付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios
注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择
常见问题以及解决方法【必看】
由于问题解答要是写在最后的话很多人都不看的所以先写问题
问题 1:
你添加了插件打包了基座 运行的时候还是提示缺少 QS-PDA5501 或者 连接时提示错误 UnsatisfiedLinkError
答:
manifest.json -> App常用设置 -> 支持CPU类型 "armeabi-v7a", "arm64-v8a"
你要是不确定可以
adb shell getprop ro.product.cpu.abi
问题 2:
Error: [JS Framework] Failed to receiveTasks, instance (1) is not available.
答:
原因
开发模式下,当你页面改了代码,你点保存以后页面的内容会重新刷新反复执行初始化。
解决
在 main.js 里全局定义一下
// 常规的 打印 扫描
uni['pda5501'] = uni.requireNativePlugin("QS-PDA5501")
// 扩展的画布类
uni['canvas'] = uni.requireNativePlugin("QS-PDA5501-Canvas")
// 阅证功能
uni['idcard'] = uni.requireNativePlugin("QS-PDA5501-IDCard")
在 App.vue 的 onLaunch 方法里写初始化连接代码
// 连接打印机
uni.pda5501.connect({
checkBlack : true
}, res => {
});
// 初始化阅证器
uni.idcard.init(res=>{
})
然后重启 App 在页面里 uni.pda5501.xxx 就可以了 //这里的 xxx 是具体的方法看函数说明
问题 3:
在 App.vue 里进行的 connect 那怎么在其他页面获取扫码等回调信息呢
答:
uni.pda5501.info(res=>{
// 这边的回调信息 和 connect 里的 res 内容相同
})
这个方法要写在每个需要用到的页面的 onLoad 里,当后一个 info 执行以后 前一个 info 就会失效 如果你打算全局使用 那就用 connect 或者全局只保留一个 info
问题 4:
扫码声音问题
答:
1. sdk 扫码默认是没声音的 你可以自己添加声音 代码在下面
震动并发生代码 ( 在 connect 的回调里 type=scancode 的时候执行就行了)
uni.vibrateLong();
var music = uni.createInnerAudioContext(); //创建播放器对象
music.src = "../../static/di.mp3"; //选择播放的音频
music.play(); //执行播放
- 你没有添加声音 但是扫码有声音 而且时有时无的
把pda自带的几个测试app删掉就行了
一、打印红外扫码相关
1.连接 断开 外设
const pda5501 = uni.requireNativePlugin("QS-PDA5501")
pda5501.connect({
checkBlack : true //checkBlack 是黑标检测 默认是开启 间隙纸需要true 非间隙纸 false
}, res => { //初始化成功 打印成功 和 缺纸 还有扫码结果 都在这里回调
var {type, result,msg } = res;
switch(type) {
case "message":
if(msg==0){
/* 0 是打印成功 1 是缺纸 注意这里文字打印成功的时候不回调*/
}
break;
case "scancode":
/*
msg 是扫码的内容
*/
break;
case "connect":
/*
msg=complete 连接外设成功
*/
break;
default:
}
uni.showToast({
icon: "none",
title: JSON.stringify(res)
})
});
/*
* 关闭
*/
pda5501.close();
2.打印
特殊功能 1.1.7 版本支持
/**
* sendRaw
* @param array
* 16进制数组 比如 [0x20,0x0A] 是打印一个回车
* 设置黑标高度 [ 0x1D, 0x28, 0x46, 0x04, 0x00, 0x01, 0x00, 0x30, 0x00 ] 这个0x30是黑标高度
*/
pda5501.sendRaw([0x20,0x0A],result => {
uni.showToast({
title: JSON.stringify(result)
})
});
注意printHis 这个函数只是拿来测试的 然后这里的纸要 57x50x30 的纸 高度小于50mm 开启黑标检测的话中间会跳过一张
/*
* 这里是打印医疗废物标签
*/
pda5501.printHis({
hospital_name: '医院名称',
ks: '科室',
name: '名字',
kg: '重量',
category_name: '分类',
date: '日期',
url: 'http://www.baidu.com'
}, result => {
uni.showToast({
title: JSON.stringify(result)
})
});
/**
* 打印文字
* @param size 默认 1
* 文字大小,其中1为正常字体,2为双倍宽高字体,暂不支持其他字体大小
* @param align 默认 1
* 对齐方式,其中0为居左,1为居中,2为居右
* @param text 必填 为了方便混合打印 这边也可以用 data data 和 text 同时存在是 使用 text
* 要打印的文字
* @param isLabel 默认 false
* 是否进行标签走纸(开启的话打印好了以后会走纸到间隙处),设为true时候,只有开启标签/黑标功能时有效
*
*/
pda5501.printText({
text: "打印文字呗"
}, result => {
uni.showToast({
title: JSON.stringify(result)
})
});
/**
* 打印二维码
* @param align 对齐方式,0 左对齐,1 居中,2右对齐 默认 1
* @param width 二维码宽度 默认 280
* @param height 二维码高度 默认 280
* @param data 二维码内容 必填
* @param isShowQRStr 是否显示二维码内容 默认 false
* @param size 二维码内容大小 默认 25
* @param isLabel 默认 false
* 是否进行标签走纸(开启的话打印好了以后会走纸到间隙处),设为true时候,只有开启标签/黑标功能时有效
*/
pda5501.printQRCode({
data: "http://www.baidu.com"
}, result => {
uni.showToast({
title: JSON.stringify(result)
})
});
/**
* 打印一维码也就是条码
* @param align 对齐方式,0 左对齐,1 居中,2右对齐 默认 1
* @param width 一维码宽度 默认 384
* @param height 一维码高度 默认 100
* @param data 一维码内容 必填
* @param isShowBarStr 是否显示一维码内容 默认 false
* @param size 一维码内容大小 默认 25
* @param isLabel 默认 false
* 是否进行标签走纸(开启的话打印好了以后会走纸到间隙处),设为true时候,只有开启标签/黑标功能时有效
*/
pda5501.printBarCode({
data: "http://www.baidu.com"
}, result => {
uni.showToast({
title: JSON.stringify(result)
})
});
/**
* 打印图片
* @param align
* 对齐方式,其中0为居左,1为居中,2为居右 默认 1
* @param bitmap
* 要打印的图片的 base64 图片的最大宽度 (pda5501 是 384 pda408 是 570)
* @param isLabel 默认 false
* 是否进行标签走纸(开启的话打印好了以后会走纸到间隙处),设为true时候,只有开启标签/黑标功能时有效
*/
pda5501.printBitmap({
bitmap: "这里是要打印图片的 base64 " //为了兼容 也可以用 base64Image
}, result => {
uni.showToast({
title: JSON.stringify(result)
})
});
/**
* 混合打印
*/
pda5501.sendCmdArray([{
printText:{
text: "打印文字呗"
}
},{
printQRCode:{
data: "http://www.baidu.com"
}
}], result => {
uni.showToast({
title: JSON.stringify(result)
})
});
3.扫描
/*
* 这里是开启扫描 这个时候扫描的灯会闪
*/
pda5501.scanCode(); /* 一般用不到 因为侧边有个 按键开启扫描的 扫描结果在 connect 的那个 回调方法里返回的 */
注意 声音 和 震动 sdk 是不带的 可以参考下面代码自行实现
uni.vibrateLong();
var music = uni.createInnerAudioContext(); //创建播放器对象
music.src = "../../static/di.mp3"; //选择播放的音频
music.play(); //执行播放
另外有些用户需要扫描以后自动填写内容到 [ 光标处 ] 获取扫码内容后用下面的方法
pda5501.inputData("要填的内容"); /* 插件版本 1.1.2 及以上的版本才支持 */
4.黑标检测开关
/*
* true 是开 false 是关闭
*
*/
pda5501.checkBlack(true)
二、画图相关
1.画布的创建 和 属性方法
const ctx = uni.requireNativePlugin("QS-PDA5501-Canvas")
/**
* 创建画布
* @param width
* 画布宽度 默认 384 ( 5501 宽度是 384 408 宽度是 570 )
* @param height
* 画布高度 默认 330 (标签纸高度对照: 50mm 高对应 330 , 40mm 高对应 250 , 30mm 高度对应 210)
* @param backgroundColor
* 画布背景颜色 默认白色 (如果你要用来pda打印的话必须 白色 )
* @param color
* 画笔颜色 默认黑色 (如果你要用来pda打印的话建议 黑色 )
* @param textSize
* fontSize 文字的尺寸 默认 20
*/
ctx.createCanvasContext({
width: 384,
height: 330,
backgroundColor: "#FFFFFF",
color: "#000000",
textSize: 20
})
/*
* 画布的宽度和高度 都是 int 类型
*/
ctx.getWidth()
ctx.getHeight()
/*
* 导出base64
* @return base64 string 字符串 是 png 格式的
*/
ctx.toDataURL()
2.文字的绘制 和 对齐方式 样式
/*
* 文字的对齐方式
* @param align int or string
* 左对齐 0 或者 "left"
* 居中 1 或者 "center"
* 左对齐 2 或者 "right"
*/
/*
注意:setTextAlign 的对齐方式 要配合 drawText x 使用
左对齐 x = 0
居中 x = ctx.getWidth() / 2
右对齐 x = ctx.getWidth()
*/
ctx.setTextAlign("left")
/*
* 设置文字的size
* @param size
*
*/
ctx.setTextSize(int size)
/*
* 文字的绘制
* @param text
* 要绘制的文字
* @param x
* x坐标
* @param y
* y坐标 注意他这里y坐标是按照文字底部算的
*/
ctx.drawText(string text,int x,int y)
3.线条图案 以及 二维码
/*
* 设置线条样式 1.0.8 版本支持
* @param style string
* 线条的样式 dotted 虚线 solid 实线
*/
ctx.setLineSytle(string style)
/*
* 设置线条的宽度
* @param width float
* 线条的宽度
*/
ctx.setStrokeWidth(float width)
/*
* 线条的绘制
* @param startX float
* 起始x坐标
* @param startY float
* 起始y坐标
* @param stopX float
* 终点x坐标
* @param stopY float
* 终点y坐标
*/
ctx.drawLine(float startX, float startY, float stopX, float stopY)
/*
* 矩形的绘制 1.0.8 版本支持
* @param x float
* 矩形路径左上角的x坐标
* @param y float
* 矩形路径左上角的y坐标
* @param width float
* 矩形宽
* @param height float
* 矩形高
*/
ctx.drawRect(float x, float y, float width, float height)
/*
* 图片的绘制
* @param base64 String
* 图片的内容base64
* @param x float
* 要画在画布的x坐标
* @param y float
* 要画在画布的y坐标
*/
ctx.drawImage(String base64, float x, float y)
/*
* 二维码的绘制
* @param data String
* 二维码的内容
* @param width float
* 二维码的宽度
* @param height float
* 二维码的高度
* @param x float
* 要画在画布的x坐标
* @param y float
* 要画在画布的y坐标
*/
ctx.drawQrcode(String data, int width, int height, float x, float y)
4.案例
const ctx = uni.requireNativePlugin("QS-PDA5501-Canvas")
ctx.track(res => {
console.log("track", res)
})
ctx.createCanvasContext({
width: 384,
height: 330,
backgroundColor: "#FFFFFF",
color: "#000000",
textSize: 20
})
var title = "上海华美医院"
ctx.setColor("#000000")
ctx.setTextSize(25)
ctx.setTextAlign("center")
ctx.drawText(title, ctx.getWidth() / 2, 40)
ctx.setTextSize(21)
ctx.setTextAlign("left")
var label = {
"科室": "美容科",
"医废类型": "感染性",
"医废重量": "12 kg",
"收集人": "郑小明",
"时间": "2010-05-11 12:12:44",
}
var x = 180
var y = 100
Object.keys(label).forEach(res => {
ctx.setTextSize(21)
ctx.drawText(res + ": ", x, y)
var pos = ctx.measureText(res + ": ")
ctx.setTextSize(16)
ctx.drawText(label[res], x + pos, y - 2)
y = y + 28
})
ctx.drawQrcode("我是二维码喽", 140, 140, 25, 80)
/*
* 这里获取图片的 base64 直接赋值给 图片的 src 完事了
* 当然你要打印的话 直接用 pda5501.printBitmap({bitmap:base64},res=>{});
*/
this.src = ctx.toDataURL()
pda5501.printBitmap({bitmap:this.src},res=>{
});
三、阅证相关 【插件 1.0.9 版本及以上支持】
1. 使用说明
在 main.js 里全局定义一下
// 阅证功能
uni['idcard'] = uni.requireNativePlugin("QS-PDA5501-IDCard")
在 App.vue 的 onLaunch 方法里写初始化连接代码
// 初始化阅证器
uni.idcard.init(res=>{
var {result,msg} = res;
// result = ok 或者 fail
// msg 是提示内容
})
然后轮询读取
// 开启轮询 结果在下面 info 获取
uni.idcard.start(res=>{
})
// 因为是轮询的所以这边的收消息逻辑为
// 第一次读卡,卡拿走再放,换了一张卡 这三中情况下读取到了会受到消息
uni.idcard.info(res=>{
var {result,msg,data} = res;
// result = ok 或者 fail
// msg 是提示内容
// data 为轮询到的证件内容
if(data){
var {
name,
sex,
img, // 这里是头像图片的base64
folk, // 民族
birthday,
id, // 18 位 证件号码
begin,
end,
address,
issue // 签发机关
} = data;
}
})
// 关闭轮询
uni.idcard.stop()
其他 辅助函数
// 跳转到本 app 设置界面 插件版本 >= 1.1.3 版本才支持
uni.pda5501.goToAppSettings()
番外篇 蓝牙秤[这个蓝牙秤不是 pda 的功能 请另外购买]
// 开发测试中
uni['scale'] = uni.requireNativePlugin("QS-PDA5501-ScaleWatcher")
uni.scale.start(res => {
console.error(res)
})
uni.scale.stop()
uni.scale.turnOffBluetooth();