2017-04-25 10 views
1

프린터 상태 변경 (예 : 용지 걸림, 일시 중지됨)을 수신하려고합니다. 다음 코드는 "잘못된 notify-recipient-uri"응답을 제공 한 다음 ippReadFile을 잠그고 프린터가 일시 중지/일시 중지 해제되었습니다. 프린터를 통해 선별 한 후CUPS 상태 변경 등록

int main() 
{ 
    http_t *http = httpConnectEncrypt(cupsServer(), ippPort(), 
    cupsEncryption()); 

    ipp_t *request = ippNewRequest(IPP_CREATE_PRINTER_SUBSCRIPTION); 

    ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", 
     NULL, "ipp://localhost:631/printers/Generic-text-only"); 
    ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_URI, "notify-recipient-uri", 
     NULL, "cups_test://"); 
    ippAddString(request, IPP_TAG_SUBSCRIPTION, IPP_TAG_KEYWORD, "notify-events", 
     NULL, "printer-state-changed"); 

    ipp_t *response = cupsDoRequest(http, request, "/"); 

    while (1) 
    { 
     ipp_state_t state;  
     ipp_t *event = ippNew(); 

     while ((state = ippReadFile(0, event)) != IPP_DATA) 
     { 
      printf("%s\n","Got Data"); 
     } 

     printf("%s\n","Repeating"); 
     ippDelete(event); 
    } 
} 

내가 "DBUS"로 설정 notify-schemes-supported 속성을 발견 속성. IPP_SET_PRINTER_ATTRIBUTES으로 속성을 변경할 수 없습니다. 이 방법을 사용하는 방법에 대한 아이디어가 있습니까?

+0

나는 cups에 익숙하지 않지만 'ippReadFile (int fd, ipp_t * ipp)'의 첫 번째 인수로 파일 설명자 0을 전달하는 것으로 나타났습니다. 파일 설명자 0은 표준 입력입니다. 프로그램의 표준 입력에 아무 것도 나타나지 않을 이유가 있습니까? 그렇지 않으면 당신이 묘사 한 것처럼 놀랄 일이 아닙니다. 'ippRead (http, event)'를 사용하면 어떨까요? – MassPikeMike

+0

'ippRead (http, event)'는 잠기지 않으므로 무한 루프 만합니다. 이 코드가 https://github.com/apple/cups/blob/master/notifier/testnotify.c 및 https://github.com/apple/cups/blob/master/test/create- printer-subscription.test. 그것이 사실이라고 생각하지는 않지만 전 완전히 잘못 될 가능성이 있습니다. –

+0

컵에있는 책에 따르면, CUPS : Michael Sweet의 Common UNIX Printing System "Notifier는 CUPS가 사용자, 프로그램에게 서버, 프린터 또는 작업의 상태 변화를 알리는 방법을 제공합니다 .Ippget 알림 스키마 다른 모든 CUPS 알림 기는 표준 입력 파일에서 이벤트를 수신하는 외부 프로그램 인 반면 CUPS 서버에서 내부적으로 구현됩니다. " –

답변

0

C 코드가 필요없는 매우 기본적인 예는 create-printer-subscription 매크로에 대해 ipptool을 사용하여 rss URI를 이벤트에 구독하는 것입니다. 이는 pyipptool으로 표시된 접근 방식입니다.

ipptool은 보통 CUPS와 함께 제공되지만 최신 우분투 버전에서는 cups-ipp-utils을 설치해야 할 수 있습니다.

첫째, 이벤트를 수신 할 수있는 HTTP 소켓 리스너 ...

python -m SimpleHTTPServer 9876 

둘째를 만들 소켓 리스너에 이벤트를 보냅니다.

ipptool -d recipient=rss://localhost:9876 ipp://localhost:631/printers /usr/share/cups/ipptool/create-printer-subscription.test 

마지막으로 프린터 사용 중지와 같은 이벤트를 트리거하십시오.

cupsdisable PDFWriter # or some valid printer name 
cupsenable PDFWriter 

rss:// URI 방식은 HTTP 소켓 서버에 대해 PUT 명령을 사용합니다. SimpleHTTPServer에는 PUT 명령에 대한 기본 제공 지원이 없으므로 501 오류가 발생합니다. 이 명령을 처리하기 위해 HTTP 리스너를 사용자 정의해야하지만 이벤트가 시작되는 것을 볼 수 있습니다.

참고 기본 create-printer-subscription 매크로 매크로의 사본을 제작하고 편집하여 조정할 수 있습니다 printer-config-changedprinter-state-changed하지만 not printer-queue-order-changed에 대한 이벤트를 보내도록 구성되어있다.

또한 기본 임대 기간 (86400 in the source으로 정의 됨)으로 구독을 활성 상태로 유지합니다 (하루 여야 함). 추가 매개 변수 notify-lease-duration은 무기한 구독에 대해 지정할 수 있습니다.