更新记录

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:未测试 ×

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
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(); //执行播放
  1. 你没有添加声音 但是扫码有声音 而且时有时无的
把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();

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问