【问题标题】:CUPS State Change SubscriptionCUPS 状态变更订阅
【发布时间】:2017-04-25 21:31:31
【问题描述】:

我正在尝试监听打印机状态变化(例如卡纸、暂停...) 以下代码给出“Bad notify-recipient-uri”响应,然后锁定 ippReadFile 并且在打印机暂停时不释放/未暂停。

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);
    }
}

筛选完打印机属性后,我发现notify-schemes-supported 属性设置为“dbus”。我无法使用IPP_SET_PRINTER_ATTRIBUTES 更改属性。关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 我对杯子不太熟悉,但我注意到您将文件描述符 0 作为第一个参数传递给 ippReadFile(int fd, ipp_t *ipp)。文件描述符 0 是标准输入。是否有理由期望程序的标准输入中出现任何内容?否则,正如您所描述的,它会挂起也就不足为奇了。如果您使用ippRead(http, event) 会怎样?
  • ippRead(http, event) 没有锁定,所以它只是无限循环。如果这段代码来自 github.com/apple/cups/blob/master/notifier/testnotify.cgithub.com/apple/cups/blob/master/test/… ,我会得到一些。我完全有可能完全错了,尽管我不认为是这样。
  • 根据我的一本关于杯子的书,CUPS:Michael Sweet 的通用 UNIX 打印系统,“通知程序为 CUPS 提供了一种通知用户或程序有关服务器、打印机或一项工作。ippget 通知方案是在 CUPS 服务器内部实现的,而所有其他 CUPS 通知程序都是在其标准输入文件上接收事件的外部程序。"
  • “在他们的标准输入上接收事件”肯定会让你的程序听起来像是在标准输入上得到一些东西,所以也许你在正确的轨道上。祝你好运。
  • 我放弃了。我为此浪费了将近一个月的时间。令人惊讶的是,它只需要 3 行代码和一些谷歌搜索就可以弄清楚如何获取打印机状态,但上帝禁止你想锁定它。我将制作一个每 10 秒询问一次状态的程序,然后我会将其发布为答案。

标签: c printing cups intel-ipp


【解决方案1】:

一个不需要任何 C 代码的非常基本的示例是使用 ipptool 反对 create-printer-subscription 宏来订阅事件的 rss URI。这就是pyipptool 说明的方法。

ipptool 通常附带 CUPS,但对于现代 Ubuntu 版本,您可能需要安装 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

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 2022-10-05
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2020-03-31
    • 2019-10-22
    相关资源
    最近更新 更多