在网络环境中从Brother TD-4100N打印机中获取打印机状态

时间:2019-01-17 12:50:25

标签: c sockets printing cross-platform

我们正在切换到一个系统,在此系统中,托运人需要在以后发送的商品上放置带有商品ID的条形码。我们的管理层愿意在不将其用于打印条形码以外的其他用途的情况下,将其借给Brother TD-4100N标签打印机,现在,我负责编写一个接口,使他们可以打印条形码。< / p>

但是,他们的核心竞争力在于运输管理,而不是IT管理,因此我必须使事情保持简单且与平台无关-或至少尽可能与平台无关。这里的想法是能够通过以太网插入这些打印机之一,而无需进行任何设置-尽可能简单。没有驱动程序,什么也没有,请保持简单,愚蠢。我只想使用以太网端口和套接字。有了这个具有以太网端口并接受ESC / P代码的特定型号,它应该不难,对吧?

在一个测试机上度过了一个星期之后,我对ESC / P代码和Brother的专有扩展(至少他们声称是这样)有了足够的了解,从而用C语言编写了一个小框架。以所需格式打印条形码( Code128)本身并不构成问题,但是围绕它的簿记确实存在问题;目前,我正在使用第三本手册,声称仅发送命令“ \ x1B \ x69 \ x53”(ESC i S)应该会使打印机向我发送32字节的当前状态记录,但是对于某些情况打印机根本不想向我发送邮件的原因:

char buffer_send[] = "x1B\x69\x53";
send(sock_jet,buffer_send,sizeof(buffer_send) - 1,0);

char buffer[32];
memset(buffer,0,sizeof(buffer));
recv(sock_jet,buffer,sizeof(buffer),0);

fprintf
(
    stderr,
    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
    buffer[0],buffer[1],buffer[2],buffer[3],buffer[4],buffer[5],buffer[6],buffer[7]
);
fprintf
(
    stderr, 
    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
    buffer[8],buffer[9],buffer[10],buffer[11],buffer[12],buffer[13],buffer[14],buffer[15]
);
fprintf
(
    stderr,
    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
    buffer[16],buffer[17],buffer[18],buffer[19],buffer[20],buffer[21],buffer[22],buffer[23]
);
fprintf
(
    stderr,
    "%02x%02x%02x%02x%02x%02x%02x%02x\n",
    buffer[24],buffer[25],buffer[26],buffer[27],buffer[28],buffer[29],buffer[30],buffer[31]
);

这段代码只是停顿了一段时间,直到超时或其他原因为止,recv并没有将任何数据写入我的缓冲区:

0000000000000000
0000000000000000
0000000000000000
0000000000000000

我显然不是唯一一个遇到这种问题的人。这个 Ruby Python程序包(https://pypi.org/project/brotherprint/#files)声称是专门为Brother打印机提供的,但是我从未见过它们接收到任何数据(至少在brotherprint/brotherprint.py中)。实际上,我什至看不到它们正确拼写为“ receive”。

在SO(operating printer with php socket programming)上,有人尝试在PHP中执行我试图在C中执行的相同操作-,但他们遇到了与我完全相同的问题,打印机拒绝执行给他们状态数据。解决方案似乎涉及从端口9100切换到端口515,并使用不同的协议,并且虽然我看到打印机上的端口515已打开,但我从未看到该打印机的任何输出,在纸上的上。此时,我会与Brother支持人员联系,但是我已经打开了另一个票证,因为他们的另一个打印机似乎在将状态报告发送回给他们时遇到了重大问题。 CUPS。

我已经尝试在有效负载的末尾添加NUL字节,以防打印机正在等待页面馈送,但这也没有解决问题。再说一次:将条形码打印到该死的东西上是可行的,所以IP,端口和连接至少在一定程度上可以工作-但是接收状态报告却不能。

我程序中的strace

connect(3, {sa_family=AF_INET, sin_port=htons(9100), sin_addr=inet_addr("192.168.XXX.XXX")}, 16) = 0
sendto(3, "\33iS", 3, 0, NULL, 0)       = 3
recvfrom(3, <blocks here for minutes> "", 32, 0, NULL, NULL)      = 0
write(2, "0000000000000000\n", 170000000000000000
)      = 17
write(2, "0000000000000000\n", 170000000000000000
)      = 17
write(2, "0000000000000000\n", 170000000000000000
)      = 17
write(2, "0000000000000000\n", 170000000000000000
)      = 17
close(3)

还有我正在使用的主要手册:https://download.brother.com/welcome/docp000579/cv_td4000_eng_escp_120.pdf(搜索“ ESC i S”)。

1 个答案:

答案 0 :(得分:0)

好的,所以我实际上得到了日本兄弟支持小组的回应。而且这种回应有很多错误,以至于我现在可能会有点杂乱无章。

兄弟坚持

  

不应将ESC / P用于双向通信。

,这是蒸蒸的BS的负担,它们将其实现视为兄弟 MADE 。那就是文档所说的!在他们提供的ESC / P文档中自行阅读。

  

请求打印机状态。   打印机状态包括32个字节。

所以我已经发现他们说谎或无能。

下一个谎言/不称职是:

  

也就是说,您所举报的信息符合我们的规范。

我很希望看到他们在这里引用的那些规格。到目前为止,我发现的唯一一件事是手册中的第5节“附加功能”,其中有一个段落称为“ ESC / P命令”,其中它们链接至上述ESC / P手册。该手册特别指出:

  

在用户完全了解所使用的操作系统以及在开发人员环境中基本掌握RS-232C,USB或以太网的情况下提供此信息。

在第8节“使用接口电缆”中,它们声明RS-232C(串行)和RJ-45(以太网)电缆不是标准附件,并且无法将RS-232C和USB电缆连接到同时使用同一台打印机。然后在MS Windows计算机上有一些安装说明,就是这样。

他们的常见问题解答除了使用SNMP(没有在打印机上工作,因为端口161/162甚至没有打开)外,均未提及(https://www.brother.co.jp/eng/dev/command/faq/index.aspx),并且它们的网络参考也一样( https://download.brother.com/welcome/docp000592/cv_td2130n_eng_net.c.pdf-没有提及ESC / P)。我很想知道我是否太愚蠢以至于找不到这个书,或者他们是否只是为了不必处理这个就把那个书从他们的遗嘱中拉了出来。

不要告诉我他们不会这样做。该打印机还在端口80上运行了具有确定的秒((https://threatpost.com/tag/debut-embedded-web-server/)的Web服务器。

但是实际上,他们在这里成为了问题的核心:

  

此外,即使没有发生错误,使用Netwrokd时,我们的规格也不会出错

这里Engrish的这一小部分可能应该表示:

  

即使发生错误,我们的硬件也不会通过以太网发送状态报告。

解释打印机为何保持静音状态。但是我不认为这是他们规范的一部分,我什至找不到。我相信他们又被裤子压倒了,拒绝承认。只要传输层正常工作,连接到机器(以太网,串行或USB)的方式都不会有任何区别,这很明显,因为我可以向打印机发送其他命令。但是,应该将其用于同一网络上的不同计算机上。 如果固件无法发送状态报告,为什么它们甚至还有以太网端口?谁想到了这个主意?

老实说,我只能劝阻人们不要使用Brother设备。这是我从该公司看到的第二台打印机,该打印机根本无法通过以太网工作,如果您无法查询其状态以确定是否要向其发送作业,该打印机有什么用?他们以600欧元的价格出售这些不可靠的机器。