【问题标题】:Trying to send data via Socket to a ZVT Terminal尝试通过 Socket 向 ZVT 终端发送数据
【发布时间】:2014-09-29 05:23:49
【问题描述】:

如何将数据发送到监听终端?!?! (见任务)

情景是:

我有一个正在监听 IP:PORT 的终端,例如192.168.1.100:12345

我创建一个套接字并像这样连接

$socket = socket_create(AF_INET, SOCK_STREAM, 0);
$result = socket_connect($socket, $host, $port);

现在我想将数据写入套接字。我的数据看起来像:

0x06 0x01 0x07 0x04 0x00 0x00 0x00 0x00 0x00 0x69

实际上终端应该在显示屏上显示0.69 cent。但我也需要在0x69 前面发送数据。

我正在发送类似的数据

socket_write($socket, $data, strlen($data));

我已经阅读了一些关于 php pack() 函数的信息并尝试了这个...

$data = pack( "C", "\x06\x01\x07\x04\x00\x00\x00\x00\x00\x69" );

我也尝试过的是

$data = pack("c","\x06\x01\x07\x04\x00\x00\x00\x00\x00\x69");//nothing happens
$data = "0x06 0x01 0x07 0x04 0x00 0x00 0x00 0x00 0x00 0x69";//nothing happens

但这不起作用。

我的朋友用 c++ 编写了一个程序,它很容易运行。

任务

任务是以8位格式和十六进制发送数据。

编辑

C++ Code

【问题讨论】:

  • 我会试试pack("c");(小写)
  • 我见过期望数据以十六进制字符串而不是二进制形式发送的应用程序。意思是你发送字符串(!)"0x06 0x01 0x07 0x04 0x00 0x00 0x00 0x00 0x00 0x69"..你试过这个吗?
  • @hek2mgl 是的,这是我的第一次尝试,但终端什么也没做 :) 我应该为您提供 c++ 代码吗?
  • 可以调试另一端吗?意思是目标计算机?你能展示一下你朋友的 C++ 程序吗?
  • @hek2mgl 我在帖子底部添加了 c++ 代码

标签: php sockets hex 8-bit


【解决方案1】:

您的授权命令(06 01):0x06 0x01 0x07 0x04 0x00 0x00 0x00 0x00 0x00 0x69

完全正确,您的消息长度为 7 个字节(0x07),数量(数据块字段:0x04)是 6 个字节的 BCD,以欧分形式打包,带有前导零(0x00 0x00 0x00 0x00 0x00 0x69)。一个字节用两个 HEX 字符表示,因此传输的金额为:69 Cent。与金额显示格式有关的一切都是终端本身的配置问题。

zvt 协议的免费版本请参见此处

https://www.terminalhersteller.de/pdf/PA00P015_13.08_en.pdf

您可以使用多种编程语言来创建与终端的套接字连接,但 ZVT 协议的“完整”实现并不多……您需要这些实现来完成通信。我推荐 C#、Java 或 Node.js。在开始通信时调用注册命令(06 00)也是常识,这包括配置字节!

【讨论】:

  • 有点晚了,我不再在那里工作了 :D 但谢谢你的回答...也许有一天会需要它。可能会编写一个新界面......永远不知道:D
【解决方案2】:

有点晚了,但也许对某人有帮助:

你可以使用hex2bin:

$data = "06010704000000000069";
socket_write($socket, hex2bin($data));

如上面的答案所述,您可能需要先(一次)发送 REGISTRATION 命令(0600)。

【讨论】:

  • 2 年后,还在同一家公司工作,仍然遇到同样的问题。所以实际上,如果没有解决方案,任何时候都不晚。 :) 我必须重建这个 Szenario,并会尝试这个...谢谢:D
  • 这个还没试过。 Atm 我工作很忙,一些项目的优先级更高,所以这必须等待 :) 但可以肯定的是,如果它经过测试并且可以正常工作,当然不接受这个答案:D
【解决方案3】:

也许您应该先发送命令 06 00,然后再发送 06 01?

【讨论】:

  • 这是一个答案还是一个问题?
  • 这是建议。 ZVT 命令序列应以 06 00 开头
【解决方案4】:

就我而言,它适用于以下情况: $data = "\x06\x01\x0f\x04\x00\x00\x00\x00\x00\x69\x19\x40\x06\x04\x40\x02\xff\x00";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2022-06-14
    • 1970-01-01
    相关资源
    最近更新 更多