Попытка отправить данные через 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-битном формате и в шестнадцатеричном формате.
РЕДАКТИРОВАТЬ
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";