微信小程序连接蓝牙汉印HM-A300L标签打印机

需求:
以下文章针对打印一讲解,打印二的代码放在最后。

打印一
在这里插入图片描述
打印二
在这里插入图片描述

参考文章:
微信小程序实现蓝牙打印
打印机CPCL编程参考手册(CPCL 语言)
蓝牙打印机CPCL编程手册~汉印HM-A300
无用小知识:

  1. A300系列:先将打印机关机然后装好纸,同时按住屏幕左右两边的按键不放,待打印机开机后再松手,会有一张自检页打印出来,麻烦您把自检页拍照这边看下,我需要帮您查看下打印机的自检信息。视频教程:https://cloud.video.taobao.com//play/u/2772044718/p/1/e/6/t/1/295661325166.mp4
  2. A300S切换快递类型:同时按下电源键和走纸键,进入功能界面,然后按电源(左键)点击到(快递),然后按一下走纸键 切换成对应的快递。视频教程:https://cloud.video.taobao.com//play/u/2772044718/p/1/e/6/t/1/267725843372.mp4

过程:
在这里插入图片描述
在这里插入图片描述

  1. 出现打印字体变大,不符合常规的大小
  2. 走纸出现偏移,每次都会多走或少走,导致越偏越多
  3. 通过设置SETFF 5 0 FORM可以解决走纸偏移问题
  4. 当删掉SETFF 5 0 FORM,将y值设为纸张本身高度时,纸张出纸不全->纸张出纸过多->越来越多
  5. 当设置SETFF 5 0 FORM,y值设为高度53mm-3mm=49mm,纸张出纸打印正确->出纸位置正确->出纸及位置正确。
  6. 当设置SETFF 50 2 FORM,y值设为高度53mm-3mm=49mm,纸张打印一张并出一张白纸->出纸一张位置正确->出纸及位置正确,因为除去上下间隔标签纸本身是50mm。即使再重启机器也没有多出一张白纸。打印内容相较于SETFF 5 0 FORM往下偏移2mm,但出纸位置正确。(这里为什么不是每次打印一张出一张白纸?)
  7. cpclHeader为打印内容对象
  8. 设置条形码时,将单位设置成点IN-DOTS,1mm = 8dots
  9. 设置文字时,单位设置为了毫米IN-MILLIMETERS,在需要打印内容的上方设置,下面的内容即为该单位。
  10. cpclHeader为打印内容对象
  11. PAGE - WIDTH 74 为打印纸张宽度为74毫米
  12. LEFT 打印内容居左展示,RIGHT打印内容居右展示
  13. T 4 2 2 4 ${data.goodsNo} T为文本,4字体名称/编号,2字体大小标识,2横向起始位置,4纵向起始位置,{data}要打印的文本
  14. 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} 条码数据
  15. 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({
   
  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值