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

问题描述 投票:0回答:4

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

塞纳里奥是:

我有一个正在侦听 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++代码

php sockets hex 8-bit
4个回答
2
投票

您的授权命令(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 协议的“完整”实现并不多……您需要它们来完成通信。当你开始通信时调用注册命令(06 00)也是常识,这包括配置字节!


1
投票

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

您可以使用hex2bin

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

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


0
投票

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


0
投票

就我而言,它与以下内容配合得很好:

$data = "\x06\x01\x0f\x04\x00\x00\x00\x00\x00\x69\x19\x40\x06\x04\x40\x02\xff\x00";

© www.soinside.com 2019 - 2024. All rights reserved.