【问题标题】:Retrieving the printer status from the Brother TD-4100N printer in a network environment在网络环境中从 Brother TD-4100N 打印机检索打印机状态
【发布时间】:2019-01-17 12:50:25
【问题描述】:

我们正在切换到一个系统,在该系统中,我们的托运人需要在他们今后发送的产品上放置带有我们商品 ID 的条形码。我们的管理层愿意借给他们 Brother TD-4100N 标签打印机,条件是他们不会将其用于打印我们的条形码以外的其他目的,现在我的任务是编写一个允许他们打印我们的条形码的接口。

然而,他们的核心竞争力在于运输管理,而不是 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 支持,但我已经打开了 另一个 工单,因为他们的 另一个 打印机似乎在将状态报告发送回给杯子。

我尝试在我的有效负载末尾添加一个 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”)。

【问题讨论】:

  • 好吧,尽管判断更好,但我一直在给 Brother 支持部门发送电子邮件。他们告诉我,他们真的不知道该怎么办,但一直在将我的邮件转发到日本,在那里它可能会因为语言障碍而被误解(我一直在用我的母语邮寄,这不是' t 很容易翻译成日文),被忽略,然后在很长一段时间后拿起。他们可能会默默地解决问题,然后默默地发布固件更新,我将忽略它,因为它太长了,我会一直告诉人们这是一个硬件问题。

标签: c sockets printing cross-platform


【解决方案1】:

好的,所以我实际上得到了日本兄弟支持的回复。而且这个回复有很多错误,我现在可能会显得有点漫无边际。

兄弟坚持

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电脑上的安装说明,就这些了。

他们的常见问题解答没有提及任何内容 (https://www.brother.co.jp/eng/dev/command/faq/index.aspx),除了使用 SNMP(在此打印机上不起作用,因为端口 161/162 甚至没有打开),并且他们的网络引用同样静音 (@987654322 @ - 没有提到 ESC/P)。我真的很想知道我是否太愚蠢而无法找到这个,或者他们是否将那个从他们的ar**s中拉出来只是为了不必处理这个。

别告诉我他们不会这样做。这台打印机还在端口 80 上运行一个网络服务器,该服务器具有已确认的 secvuln (https://threatpost.com/tag/debut-embedded-web-server/)。

但是他们实际上在这里找到了问题的核心:

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

这里的英文这小部分可能应该是指:

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

,这解释为什么打印机保持沉默。但是我不相信这是他们规范的一部分,我什至找不到;我相信他们又一次被抓到脱裤子而拒绝承认。只要传输层正常工作,您连接到机器的方式(以太网、串行或 USB)应该没有任何区别,因为我可以向打印机发送其他命令,所以显然是这种情况。但是,这应该在同一网络上的不同机器上使用。 如果固件无法发送状态报告,为什么他们甚至还有一个以太网端口?这个想法是谁想出来的?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 2011-04-13
    • 2021-06-14
    • 1970-01-01
    • 2014-03-01
    • 2019-08-26
    • 1970-01-01
    相关资源
    最近更新 更多