LINUX.ORG.RU

Посылка сообщения LPD серверу принтера


0

1

Есть принтер Epson Stylus Pro 4450, нужно написать для него драйвер для печати по сети из-под своей ОС. Принтер поддерживает LPD и RAW, командный язык ESC/P. Т.к. наша ОС не поддерживает RAW-сокеты, остаётся использовать его встроенный LPD сервер. Спецификация на LPD тут

Есть ли у кого-нибудь пример работы с LPD сервером на прямую без команды lpr?

Я правильно понимаю, вначале нужно дать команду Receive a printer job, затем Receive control file, потом передать управляющий файл, затем дать команду Receive data file, далее передать файл с данными и после команды Print any waiting jobs принтер должен начать печатать? И ещё, управляющий символ ESC/P можно передать, если указать в конфигурационном файле команду l?

Фрагмент кода, что-то не работает.

char outbuf[1024];
char inbuf[1024];
//команда Receive a printer job
outbuf[0]=2;
strcpy(outbuf+1,"PASSTHRU");
outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf1=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);


//команда Receive control file
outbuf[0]=2;
outbuf[1]=11;
outbuf[2]=' ';
strcpy(outbuf+3,"cfA00190.0.0.23");//IP клиента 90.0.0.23
outbuf[18]=0x0a;
send(sockClient, outbuf, 19, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf2=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);



//формируем и передаём управляющий файл
outbuf[0]='H';
strcpy(outbuf+1,"90.0.0.23");
outbuf[10]=0x0a;

outbuf[11]='P';
strcpy(outbuf+12,"root");
outbuf[16]=0x0a;

outbuf[17]='f';
strcpy(outbuf+18,"cfA00190.0.0.23");
outbuf[33]=0x0a;
outbuf[34]=0;
send(sockClient, outbuf, 35, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf3=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);


//команда Receive data file
outbuf[0]=3;
outbuf[1]=11;
outbuf[2]=' ';
strcpy(outbuf+3,"dfA00190.0.0.23");
outbuf[18]=0x0a;
send(sockClient, outbuf, 19, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf4=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);


//формируем и передаём файл с данными
strcpy(outbuf,"proverka");
//outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);
n = recv(sockClient, inbuf, 1, 0);//подтверждение от принтера
printf("n=%i, inbuf5=%i\n", n, inbuf[0]);
memset(outbuf, 0, 1024);


//команда Print any waiting jobs
outbuf[0]=1;
strcpy(outbuf+1,"PASSTHRU");
outbuf[9]=0x0a;
send(sockClient, outbuf, 10, 0);

Фрагмент кода, что-то не работает.

Это _один_ цельный фрагмент кода?

Deleted
()
Ответ на: комментарий от Deleted

Я выкинул инициализацию сокета и установку соединения с принтером и в конце закрытие сокета. Код корявый, т.к. писал пока только для себя :)

IOne
() автор топика

Для 02 - Receive control file
и 03 - Receive data file
Поле Count - количество байт в файле, кодировать текстом,
а у тебя число 11.
Типа того:
«\x0234 cfA00190.0.0.23\n» - затем 34 байта файл, затем '\0'
«\x038 dfA00190.0.0.23\n» - затем 8 байт - файл
И посмотри снифером `echo «proverka»|lpr` и увидишь, как тебе надо делать.

fopen ★★
()

Почти разобрался, осталось разобраться в формате изображения (принтер работает в графическом режиме).

Драйвер посылает изображение ESC/P 2 командой
ESC i COLOR1 COMPRESS1 BITS1 BYTES2 LINES2 data... (описана тут)

Вопрос: для чего нужно задавать COLOR1(разве цвет не определяется изображением?) и в каком формате передавать данные, если к примеру COMPRESS1=0(без компрессии)? .bmp?

IOne
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.