尝试通过Socket将数据发送到ZVT终端

时间:2014-08-06 10:08:29

标签: php sockets hex 8-bit

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

Szenario是:

我有一个正在收听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 ++编写了一个程序,它很容易。

TASK

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

修改

C++ Code

4 个答案:

答案 0 :(得分:1)

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

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

在这里查看zvt协议的免费版本

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

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

答案 1 :(得分:0)

也许你应该在06 01之前先发送命令06 00?

答案 2 :(得分:0)

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

您可以使用hex2bin

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

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

答案 3 :(得分:0)

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