需求:
以下文章针对打印一讲解,打印二的代码放在最后。
打印一
打印二
参考文章:
微信小程序实现蓝牙打印
打印机CPCL编程参考手册(CPCL 语言)
蓝牙打印机CPCL编程手册~汉印HM-A300
无用小知识:
- A300系列:先将打印机关机然后装好纸,同时按住屏幕左右两边的按键不放,待打印机开机后再松手,会有一张自检页打印出来,麻烦您把自检页拍照这边看下,我需要帮您查看下打印机的自检信息。视频教程:https://cloud.video.taobao.com//play/u/2772044718/p/1/e/6/t/1/295661325166.mp4
- A300S切换快递类型:同时按下电源键和走纸键,进入功能界面,然后按电源(左键)点击到(快递),然后按一下走纸键 切换成对应的快递。视频教程:https://cloud.video.taobao.com//play/u/2772044718/p/1/e/6/t/1/267725843372.mp4
过程:
- 出现打印字体变大,不符合常规的大小
- 走纸出现偏移,每次都会多走或少走,导致越偏越多
- 通过设置
SETFF 5 0
FORM
可以解决走纸偏移问题 - 当删掉
SETFF 5 0
FORM
,将y值设为纸张本身高度时,纸张出纸不全->纸张出纸过多->越来越多 - 当设置
SETFF 5 0
FORM
,y值设为高度53mm-3mm=49mm,纸张出纸打印正确->出纸位置正确->出纸及位置正确。 - 当设置
SETFF 50 2
FORM
,y值设为高度53mm-3mm=49mm,纸张打印一张并出一张白纸->出纸一张位置正确->出纸及位置正确,因为除去上下间隔标签纸本身是50mm。即使再重启机器也没有多出一张白纸。打印内容相较于SETFF 5 0
FORM
往下偏移2mm,但出纸位置正确。(这里为什么不是每次打印一张出一张白纸?) cpclHeader
为打印内容对象- 设置条形码时,将单位设置成点
IN-DOTS
,1mm = 8dots - 设置文字时,单位设置为了毫米
IN-MILLIMETERS
,在需要打印内容的上方设置,下面的内容即为该单位。 cpclHeader
为打印内容对象PAGE - WIDTH 74
为打印纸张宽度为74毫米LEFT
打印内容居左展示,RIGHT
打印内容居右展示T 4 2 2 4 ${data.goodsNo}
T为文本,4字体名称/编号,2字体大小标识,2横向起始位置,4纵向起始位置,{data}要打印的文本BARCODE 128 2 2 80 280 8 ${data.goodsNo}
BARCODE横向条形码打印,128条形码符号类型,条形码都有宽窄不一的竖条组成,2窄条的单位宽度,2宽条与窄条的比率(2 = 2.5 :1),80条码的单位高度(10毫米高80点/8=10),280横向起始位置,8纵向起始位置,{data} 条码数据cpclHeader =
! 0 200 200 ${y} 1\n+ cpclHeader + 'PRINT\n'
!起始符,{offset}整个标签的横向偏置,<200>横向分辨率 (以点/英寸为单位),<200> 纵向分辨率 (以点/英寸为单位),{y}标签的最大高度,{qty}要打印的标签数量(这里是1张),cpclHeader打印的内容,PRINT\n打印并换行
代码
<text class="printLabel" catchtap="startPrintBtn" data-goodsNo="{
{item.goodsNo}}">打印商品标签</text>
<bluetooth-print wx:if="{
{cpclExp}}" id="bprint" cpclExp="{
{cpclExp}}"></bluetooth-print>
startPrintBtn(e) {
HttpPost({
showLoading: true,
url: url.goodsPrint,
contentType: 'application/json',
data: {
dcNo: wx.getStorageSync('loginInfo').StoreNo,
paperNo: this.data.paperNo,
goodsNo: e.currentTarget.dataset.goodsno
},
success: res => {
if (res.code === 0) {
this.setData({
printInfo: res.data,
printFlag: '3'
})
this.startPrint(this.data.printInfo)
}
}
})
},
startPrint (data) {
let cpclExp = ''
if (this.data.printFlag == '3') {
cpclExp = this.combineCpclDirect1(data)
} else {
cpclExp = this.combineCpclDirect(data, this.data.printFlag)
}
this.setData({
cpclExp
})
console.log(cpclExp)
setTimeout(() => {
let dom = this.selectComponent('#bprint')
dom.print()
}, 500)
},
combineCpclDirect1 (data) {
console.log('data----', data)
let isTempGoods = data.isTempGoods ? 'T 4 0 400 8 【临】' : 'BARCODE 128 2 2 80 280 8 ${data.goodsNo}'
let goodsShortName = data.goodsShortName.length > 20 ? data.goodsShortName.substring(0, 20) : data.goodsShortName
let createTime = timeFilter(data.createTime)
// BARCODE 128 2 2 80 280 8 ${data.goodsNo}
// T 4 0 400 8 ${isTempGoods}
// y 当前打印行的Y坐标
// 78*52 mm // 52 - 3(左右纸间距) 78 - 4(上下纸间距) 1mm = 8dots
// 下方代码是HM-A300L型号
// 若使用HM-A300S型号,需要y=53 WIDTH 75即可正常出纸
let y = 49
let cpclHeader = `
IN-MILLIMETERS
PAGE - WIDTH 74
LEFT
T 4 2 2 4 ${
data.goodsNo}
IN-DOTS
${
isTempGoods}
IN-MILLIMETERS
LEFT
T 4 5 2 15 ${
goodsShortName}
T 28 2 2 27 规格:${
data.spec}
RIGHT
T 28 2 0 32 ${
data.vendorName}
T 28 2 0 38 ${
createTime}
SETFF 5 0
FORM
`
cpclHeader = `! 0 200 200 ${
y} 1\n` + cpclHeader + 'PRINT\n'
return cpclHeader
},
/components/bluetooth-print/bluetooth-print
<view>
<view class="device-container" wx:if="{
{deviceListDialogShow}}">
<view class="taggle">
<view class="cancel" bindtap="deviceDialogClose">
<image src="https://retail.benlai.com/fortune/images/bmw/icon/close.png"></image>
</view>
<view class="confirm" bindtap="refreshDeviceList">
<image src="https://retail.benlai.com/fortune/images/bmw/refresh.png"></image>
<label>刷新</label>
</view>
</view>
<scroll-view class="device-wrapper" scroll-y scroll-top="{
{topNum}}">
<view class="device-item" wx:for="{
{deviceList}}" wx:for-index="index" wx:key="index"
wx:for-item="item">
<image class="bluetooth" src="https://retail.benlai.com/fortune/images/bmw/bluetooth.png"></image>
<text class="device-local-txt" wx:if="{
{item.localName}}">{
{item.localName}}</text>
<text class="device-txt">{
{item.deviceId}}</text>
<image class="signal" src="https://retail.benlai.com/fortune/images/bmw/signal.png"></image>
<text class="device-signal-txt">{
{item.signalTxt}}</text>
<button class="print-btn" data-index="{
{index}}" catchtap="bindDeviceClick">{
{storage ? '绑定': '打印'}}</button>
</view>
</scroll-view>
</view>
</view>
// pages/search/index.js
const services_uuid1 = "0000EEE0-0000-1000-8000-00805F9B34FB";
const services_uuid2 = "0000FF00-0000-1000-8000-00805F9B34FB";
const services_uuid3 = "49535343-FE7D-4AE5-8FA9-9FAFD205E455";
const services_uuid4 = "E7810A71-73AE-499D-8C15-FAA9AEF0C3F2";
const ToBase64 = require('../../util/base64gb2312.js');
Component({
/**
* 组件的属性列表
*/
properties: {
cpclExp: {
type: String,
value: ''
},
// 是否是用于存储默认打印机(非打印)
storage: {
type: Boolean,
value: false
}
},
observers: {
'cpclExp': function (cpclExp) {
// 在 numberA 或者 , numberB 被设置时,执行这个函数
}
},
/**
* 组件的初始数据
*/
data: {
deviceListDialogShow: false,
deviceList: [],
connected: false,
deviceIndex: '',
deviceId: '',
sendData64: '',
topNum: 0
},
ready() {
// this.cutCommand()
// this.start();
},
/**
* 组件的方法列表
*/
methods: {
print() {
this.cutCommand()
this.start()
},
refreshDeviceList() {
wx.showLoading({
title: '蓝牙设备列表获取中',
mask: true
})
this.searchDevice(true)
},
deviceDialogClose() {
this.setData({
deviceListDialogShow: false
})
},
start() {
if (!wx.openBluetoothAdapter) {
this.showTip("当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。")
return;
}
let _this = this;
wx.openBluetoothAdapter({
complete: function (res) {
_this.getBluetoothAdapterState();
}
})
},
//打印 分包
cutCommand: function () {
let data = this.data.cpclExp
let sendData64 = [];
let packageLength = 10;
for (let i = 0; i < Math.ceil(data.length / packageLength); i++) {
sendData64[i] = wx.base64ToArrayBuffer(ToBase64.encode64gb2312(data.substr(i * packageLength, packageLength)));
}
this.setData({
sendData64: sendData64
})
},
getBluetoothAdapterState: function () {
let _this = this;
wx.getBluetoothAdapterState({
complete: function (res) {
if (!!res && res.available) {
_this.searchDevice();
} else {
_this.showTip("请开启手机蓝牙, 并连接打印机")
}
}
})
},
searchDevice(isRefresh = false) {
if(!isRefresh) {
wx.showLoading({
title: '连接打印机中...',
mask: true
})
}
let self = this
wx.startBluetoothDevicesDiscovery({
services: [],
refreshCache: false,
complete: function (res) {
setTimeout(function () {
wx.getBluetoothDevices({
success(res) {
self.setData({
topNum: 0})
let devices = res.devices.map(item=> {