Как заставить принтер Zebra возвращать символ новой строки при использовании getvar? - PullRequest
0 голосов
/ 03 июля 2018

Я написал простую программу Go для подключения к принтеру, запустил команду get

! U1 getvar "zpl.system_status"\r\n

Я тогда пытался прочитать ответ, но мой слушатель чтения продолжал время ожидания. Я ожидал \ n в конце данных, поступающих с принтера, но не получал их. Есть ли способ сказать принтеру, чтобы он ответил и завершил строку \ n?

Если нет, то как лучше всего выслушать ответ. В итоге я прочитал поток и затем установил тайм-аут, чтобы дождаться новых данных, но это выглядит как хакерство.

Есть ли какой-нибудь определенный символ, который я могу ждать, чтобы указать, что принтер завершил отправку ответа?

Я также вошел в систему с помощью клиента telnet и увидел то же поведение.

Вот код, который я собрал. На данный момент это грубо, просто пытаюсь заставить вещи работать, прежде чем я уберу это. Он получает ответ с этим кодом и закомментированным кодом, но я чувствую, что должен получать терминатор строки с сервера, а я нет.

package main

import (
    "bufio"
    "net"
    "os"
    "time"
)

func main() {
    dialer := net.Dialer{Timeout: 1 * time.Second}
    conn, err := dialer.Dial("tcp", "127.0.0.1:9100")
    if err != nil {
        println("Dial failed: ", err.Error())
        os.Exit(1)
    }
    defer conn.Close()

    rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))

    println("Sending string request")
    n, err := rw.WriteString("! U1 getvar \"interface.network.active.mac_addr\"\r\n")
    if err != nil {
        println("Error getting status.", err)
    }
    println("Characters sent: ", n)

    err = rw.Flush()
    if err != nil {
        println("Error on flush", err)
    }

    err = conn.SetReadDeadline(time.Now().Add(1 * time.Second))
    if err != nil {
        println("Set Deadline failed: ", err)
    }

    // buffer := make([]byte, 0, 1024)
    // tmp := make([]byte, 128)
    // for {
    //  n, err := conn.Read(tmp[:])
    //  if err != nil {
    //      println(err)
    //      break
    //  }
    //  println(n)
    //  buffer = append(buffer, tmp[:n]...)
    // }
    // println(string(buffer))

    response, err := rw.ReadString('\n')
    if err != nil {
        println("Read error: ", err.Error())
    }
    println("Response: ", response)
}

Ответ - Я изменил MAC-адрес ниже, но это в основном то, что я получаю.

Sending string request
Characters sent:  49
Read error:  read tcp i/o timeout
Response:  "07:4d:07:79:47:ef"

1 Ответ

0 голосов
/ 03 июля 2018

Используйте JSON-упаковку SGD:

send {} {"zpl.system_status": null}

Ответ вернется в JSON, чтобы вы могли искать закрытие}

...