小程序
小游戏
企业微信
微信支付
扫描小程序码分享
微信小程序,如何直接触发局域网内的热敏不干胶打印机(支持标准的ESC/POS协议命令)直接打印小票?有没有标准的代码写法可参考?
3 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
现在的问题是,小程序这边的写法是
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)
if (!isResolved) {
isResolved = true
reject(new Error(`发送数据失败: ${err.errMsg || '未知错误'}`))
}
complete: (res) => {
console.log('[Printer] write complete:', res)
if (!writeCompleted) {
// success/fail 都没触发,但 complete 触发了,视为成功
}, 1000)
tcpSocket.onMessage((res) => {
console.log('[Printer] 收到响应:', res)
if (closeTimer) {
clearTimeout(closeTimer)
closeTimer = null
tcpSocket.onError((err) => {
console.error('[Printer] TCP错误:', err)
reject(new Error(`连接失败: ${err.errMsg || '无法连接打印机'}`))
tcpSocket.onClose(() => {
console.log('[Printer] TCP连接已关闭')
this.connected = false
resolve(true)
const portNum = Number(port)
console.log(`[Printer] 正在连接: ${address}:${portNum}`)
tcpSocket.connect({
address: address,
port: portNum
但后台服务收到请求后,读不到任何数据,最终超时报错
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
通过Socket连接/蓝牙与打印机建立连接,然后按照ESC/POS指令标准写入即可。
本回答由AI生成,可能已过期、失效或不适用于当前情形,请谨慎参考
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
现在的问题是,小程序这边的写法是
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
})
})
}
但后台服务收到请求后,读不到任何数据,最终超时报错
通过Socket连接/蓝牙与打印机建立连接,然后按照ESC/POS指令标准写入即可。