我编写了一个简单的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"
答案 0 :(得分:0)
使用SGD的JSON包装:
发送{} {“ zpl.system_status”:null}
响应将以JSON格式返回,您可以查找结束符}