Попытка отправить данные через Socket на терминал ZVT

Как я могу отправить данные на терминал прослушивания?!?! (см. задание)

Сценарий это:

У меня есть терминал, который прослушивает 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++

3 ответа

Ваша команда авторизации (06 01): 0x06 0x01 0x07 0x04 0x00 0x00 0x00 0x00 0x00 0x69

абсолютно правильно, ваше сообщение имеет длину 7 байтов (0x07), а его объем (поле блока данных: 0x04) составляет 6 байтов, упакованных в BCD в евроцентах с ведущими нулями (0x00 0x00 0x00 0x00 0x00 0x69). Один байт представлен двумя шестнадцатеричными символами, поэтому передаваемое количество составляет: 69 центов. Все, что связано с форматом отображения суммы, является проблемой конфигурации самого терминала.

Смотрите здесь бесплатную версию протокола zvt

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

Вы можете использовать множество языков программирования для создания сокетного соединения с терминалом, но существует не так много "полных" реализаций протокола ZVT... которые вам понадобятся для завершения связи. Я рекомендую C#, Java или Node.js. Также разумно вызывать команду регистрации (06 00), когда вы начинаете общение, это включает в себя байт конфигурации!

Немного поздно, но, может быть, это кому-нибудь поможет

Вы можете использовать hex2bin:

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

Как уже упоминалось в ответе выше, вам может понадобиться сначала отправить команду REGISTRATION (0600) (один раз).

Может быть, вы должны отправить команду 06 00 сначала, до 06 01?

В моем случае это работало хорошо со следующим:$data = "\x06\x01\x0f\x04\x00\x00\x00\x00\x00\x69\x19\x40\x06\x04\x40\x02\xff\x00";

Другие вопросы по тегам