Epson js SDK не может использовать несколько принтеров - PullRequest
0 голосов
/ 06 июня 2019

Intro
Мы разрабатываем это веб-приложение на основе javascript, которое должно печатать квитанции с использованием epson javascript sdk .

Прямо сейчас мы 'у нас есть этот документ, в котором можно добавить несколько принтеров в приложение и где квитанции могут быть распечатаны для каждого отдельного принтера.

Проблема состоит в том, что квитанция будет ТОЛЬКО принтером от последнего добавленного принтера.

Дальнейшие исследования говорят нам, что SDK просто использует последний добавленный (подключенный) принтер.Это можно увидеть на следующих изображениях.

  1. На первом изображении установлены 2 принтера.Обратите внимание на разные IP-адреса.
  2. Во втором изображении мы записываем, какой экземпляр EpsonPrinter используется во время печати.Обратите внимание, что IP-адрес явно является первым принтером.
  3. На третьем изображении мы прослеживаем сеть.Обратите внимание на IP-адрес, который фактически используется (игнорируйте ошибку).

enter image description here

enter image description here

enter image description here

Мы создали собственный класс EpsonPrinter, который можно найти здесь или здесь ниже.

EpsonPrinter

export default class EpsonPrinter {
  name = null
  ipAddress = null
  port = null
  deviceId = null
  crypto = false
  buffer = false
  eposdev = null
  printer = null
  intervalID = null
  restry = 0

  constructor (props) {
    const {
      name = 'Epson printer',
      ipAddress,
      port = 8008,
      deviceId = 'local_printer',
      crypto = false,
      buffer = false
    } = props
    this.name = name
    this.ipAddress = ipAddress
    this.port = port
    this.deviceId = deviceId
    this.crypto = crypto
    this.buffer = buffer

    this.eposdev = new window.epson.ePOSDevice()
    this.eposdev.onreconnecting = this.onReconnecting
    this.eposdev.onreconnect = this.onReconnect
    this.eposdev.ondisconnect = this.onDisconnect

    this.connect()
  }

  onReconnecting = () => {
    this.consoleLog('reconnecting')
  }
  onReconnect = () => {
    this.consoleLog('reconnect')
  }

  onDisconnect = () => {
    this.consoleLog('disconnect')

    if (this.intervalID === null ){
      this.intervalID = setInterval(() => this.reconnect(), 5000)
    }
  }

  connect = () => {
    this.consoleLog('connect')

    this.eposdev.ondisconnect = null
    this.eposdev.disconnect()

    this.eposdev.connect(this.ipAddress, this.port, this.connectCallback)
  }

  reconnect = () => {
    this.consoleLog('(Re)connect')

    this.eposdev.connect(this.ipAddress, this.port, this.connectCallback)
  }

  connectCallback = (data) => {
    clearInterval(this.intervalID)
    this.intervalID = null
    this.eposdev.ondisconnect = this.onDisconnect

    if (data === 'OK' || data === 'SSL_CONNECT_OK') {
      this.createDevice()
    } else {
      setTimeout(() => this.reconnect(), 5000)
    }
  }

  createDevice = () => {
    console.log('create device, try: ' + this.restry)

    const options = {
      crypto: this.crypto,
      buffer: this.buffer
    }

    this.eposdev.createDevice(this.deviceId, this.eposdev.DEVICE_TYPE_PRINTER, options, this.createDeviceCallback)
  }

  createDeviceCallback = (deviceObj, code) => {
    this.restry++

    if (code === 'OK') {
      this.printer = deviceObj
      this.printer.onreceive = this.onReceive
    } else if (code === 'DEVICE_IN_USE') {
      if (this.restry < 5) {
        setTimeout(() => this.createDevice(), 3000)
      }
    }
  }

  onReceive = (response) => {
    this.consoleLog('on receive: ', response)
    let message = `Print ${this.name} ${response.success ? 'success' : 'failute'}\n`
    message += `Code: ${response.code}\n`
    message += `Status: \n`

    if (response.status === this.printer.ASB_NO_RESPONSE) { message += ' No printer response\n' }
    if (response.status === this.printer.ASB_PRINT_SUCCESS) { message += ' Print complete\n' }
    if (response.status === this.printer.ASB_DRAWER_KICK) { message += ' Status of the drawer kick number 3 connector pin = "H"\n' }
    if (response.status === this.printer.ASB_OFF_LINE)  {   message += ' Offline status\n' }
    if (response.status === this.printer.ASB_COVER_OPEN)    {   message += ' Cover is open\n' }
    if (response.status === this.printer.ASB_PAPER_FEED) {  message += ' Paper feed switch is feeding paper\n' }
    if (response.status === this.printer.ASB_WAIT_ON_LINE) {    message += '  Waiting for online recovery\n' }
    if (response.status === this.printer.ASB_PANEL_SWITCH) {    message += ' Panel switch is ON\n' }
    if (response.status === this.printer.ASB_MECHANICAL_ERR) {  message += ' Mechanical error generated\n' }
    if (response.status === this.printer.ASB_AUTOCUTTER_ERR) {  message += ' Auto cutter error generated\n' }
    if (response.status === this.printer.ASB_UNRECOVER_ERR) {   message += ' Unrecoverable error generated\n' }
    if (response.status === this.printer.ASB_AUTORECOVER_ERR) { message += ' Auto recovery error generated\n' }
    if (response.status === this.printer.ASB_RECEIPT_NEAR_END) {    message += ' No paper in the roll paper near end detector\n' }
    if (response.status === this.printer.ASB_RECEIPT_END) { message += ' No paper in the roll paper end detector\n' }
    if (response.status === this.printer.ASB_SPOOLER_IS_STOPPED) {  message += ' Stop the spooler\n' }

    if (!response.success) {
      alert(message)
      // TODO: error message?
    } else {
      // TODO: success -> remove from queue
    }
  }

  printReceipt = () => {
    this.consoleLog(`Print receipt, `, this)
    try {
      if (!this.printer) {
        throw `No printer created for ${this.name}`
      }

      this.printer.addPulse(this.printer.DRAWER_1, this.printer.PULSE_100)

      this.printer.addText(`Printed from: ${this.name}\n`)

      this.printer.send()
    } catch (err) {
      let message = `Print ${this.name} failure\n`
      message += `Error: ${err}`

      alert(message)
    }
  }

  consoleLog = (...rest) => {
    console.log(`${this.name}: `, ...rest)
  }
}

Poc Полный рабочий документ можно найти здесь .

Epson javascript sdk
2.9.0

Кто-нибудь имеет опыт работы с epsonSDK?Это должно быть в состоянии поддерживать несколько соединений одновременно?Пожалуйста, дайте знать об этом.

...