收藏
回答

微信小程序,如何直接触发局域网内的热敏不干胶打印机(支持标准的ESC/POS协议命令)直接打印小票?

微信小程序,如何直接触发局域网内的热敏不干胶打印机(支持标准的ESC/POS协议命令)直接打印小票?有没有标准的代码写法可参考?

回答关注问题邀请回答
收藏

3 个回答

  • 温瑞老陈
    温瑞老陈
    04-30

    现在的问题是,小程序这边的写法是  

    print({ address, port, data, waitTime = 5000 }) {

        return new Promise((resolve, reject) => {

          const tcpSocket = wx.createTCPSocket()


          let isResolved = false

          let closeTimer = null

          let writeCompleted = false


          tcpSocket.onConnect(() => {

            console.log(`[Printer] TCP已连接: ${address}:${port}`)

            this.connected = true


            // 将 ArrayBuffer 转为 Base64

            const dataBuffer = data instanceof ArrayBuffer ? data : new TextEncoder().encode(data)

            const base64Data = uni.arrayBufferToBase64(dataBuffer)


            const message = JSON.stringify({

              type: 'raw_escpos',

              data: base64Data

            })


            console.log(`[Printer] 准备发送 JSON,Base64 长度: ${base64Data.length}`)


            // 关键:部分设备 onConnect 后立即 write 会失败,延迟 1 秒

            setTimeout(() => {

              console.log('[Printer] 调用 write...')

              tcpSocket.write({

                data: message,

                success: () => {

                  console.log('[Printer] write success')

                  writeCompleted = true

                  closeTimer = setTimeout(() => {

                    console.log(`[Printer] 等待${waitTime}ms完成,关闭连接`)

                    tcpSocket.close()

                  }, waitTime)

                },

                fail: (err) => {

                  console.error('[Printer] write fail:', err)

                  writeCompleted = true

                  if (!isResolved) {

                    isResolved = true

                    reject(new Error(`发送数据失败: ${err.errMsg || '未知错误'}`))

                  }

                  tcpSocket.close()

                },

                complete: (res) => {

                  console.log('[Printer] write complete:', res)

                  if (!writeCompleted) {

                    // success/fail 都没触发,但 complete 触发了,视为成功

                    writeCompleted = true

                    closeTimer = setTimeout(() => {

                      tcpSocket.close()

                    }, waitTime)

                  }

                }

              })

            }, 1000)

          })


          tcpSocket.onMessage((res) => {

            console.log('[Printer] 收到响应:', res)

            if (closeTimer) {

              clearTimeout(closeTimer)

              closeTimer = null

            }

            tcpSocket.close()

          })


          tcpSocket.onError((err) => {

            console.error('[Printer] TCP错误:', err)

            if (!isResolved) {

              isResolved = true

              reject(new Error(`连接失败: ${err.errMsg || '无法连接打印机'}`))

            }

          })


          tcpSocket.onClose(() => {

            console.log('[Printer] TCP连接已关闭')

            this.connected = false

            if (!isResolved) {

              isResolved = true

              resolve(true)

            }

          })


          const portNum = Number(port)

          console.log(`[Printer] 正在连接: ${address}:${portNum}`)

          tcpSocket.connect({

            address: address,

            port: portNum

          })

        })

      }

    但后台服务收到请求后,读不到任何数据,最终超时报错

    04-30
    有用
    回复
  • 神经蛙
    神经蛙
    04-29

    通过Socket连接/蓝牙与打印机建立连接,然后按照ESC/POS指令标准写入即可。

    04-29
    有用
    回复
  • 智能回答 智能回答 本次回答由AI生成
    04-29
    有用
    回复
登录 后发表内容