跳转至内容

扫描仪按钮守护进程

来自 ArchWiki

大多数桌面扫描仪或多或少都是“被动”设备:它们可能与合适的应用程序配合使用,但无法仅通过按钮进行操作。

scanbd 试图通过管理此类扫描仪来解决此问题,以利用它们拥有的扫描仪按钮(*仅当按钮受 sane 支持时*)。

它是如何工作的?

scanbd(扫描仪按钮守护进程)打开并轮询扫描仪,因此会锁定设备。所以没有其他应用程序可以直接访问设备(打开 /dev/...,或通过 libusb 等)。

为了解决这个问题,使用了第二个守护进程(在 scanbd 的所谓“管理器模式”下):scanbm 被配置为访问扫描仪的“代理”,如果另一个应用程序尝试使用扫描仪,则会指示轮询守护进程在其他扫描应用程序需要使用扫描仪的时间内禁用轮询。

为了实现这一点,scanbm 的配置取代了 saned 作为网络扫描守护进程。如果扫描请求到达 sane 端口,scanbm 会通过向轮询的 scanbd-daemon 发送 dbus 信号来停止轮询。然后它会启动真正的 saned,进行扫描并将数据发送回请求的应用程序。之后,scanbd-manager scanbm 通过向 scanbd 发送另一个 dbus 信号来重新启动轮询。

因此,scanbd 的设置需要更改 SANE 的默认配置,并且还需要定义自己的操作脚本(定义按下扫描仪按钮时应执行的操作)。

还有 scanbd 的替代方案,例如 scanbuttond,但这些似乎已不再维护。

安装

安装 scanbd-gitAUR 包。

Sane 配置

由于 scanbdsaned 运行在扫描仪连接的同一台机器上,我们需要两套 saned 配置 - 一套在默认位置(/etc/sane.d/),它会将本地应用程序重定向到 systemd 正在监听的网络套接字,另一套(例如 /etc/scanbd/sane.d/),它将被 sane 后端实际用于访问连接的扫描仪。

首先,将 /etc/sane.d/ 中的所有配置文件复制到 /etc/scanbd/sane.d/(稍后将需要它们)。

# cp -r /etc/sane.d/* /etc/scanbd/sane.d/

修改 /etc/sane.d/dll.conf,使其*仅*包含 "net" 指令(删除其他指令(printers),或用 # 符号注释它们)。

/etc/sane.d/dll.conf
net

修改 net-backend 配置文件(更复杂的设置请参阅 scanbd 的 README.txt)。

/etc/sane.d/net.conf
connect_timeout = 3
localhost # scanbm is listening on localhost

现在,桌面应用程序(使用 libsane)被(通过上面的 dll.conf)强制只能使用 net-backend。这可以防止它们直接使用(并阻塞)本地连接的扫描仪。

每当与标准 sane 网络套接字建立连接时,systemd 就会启动 scanbm(scanbd 的“管理器模式”),然后它会指示(已运行的)scanbd 停止轮询扫描仪,然后用替代配置目录启动 saned

最后一步是修改 /etc/scanbd/sane.d/dll.conf 中 sane 的替代配置:只需确保 "net" 指令被注释掉,并且相应的扫描仪后端被取消注释。

/etc/scanbd/sane.d/dll.conf
#net
pixma
epson2
#... whatever other scanner backend needed ...

现在是时候 启动/启用 scanbd.service启动 scanbm.socket 了。

您可以检查 scanbd.servicescanbm.socket 单元状态,以查看 scanbd 服务和 scanbm 套接字是否已启动。要增加调试详细程度,请在 /etc/scanbd/scanbd.conf 中将 debug-level = 7 更改为更高值,然后重启 scanbd 服务。

如果保留 /etc/scanbd/scanbd.conf 中的默认用户 daemon 和组 scanner,请确保您已将 daemon 添加到 scanner 组,否则 scanbm 将无法工作。

scanbd 配置

如果您运气好,您的扫描仪可能几乎可以开箱即用,您可能只想修改操作脚本,这些脚本定义了按下特定按钮时要执行的操作。

scanbm 监听扫描仪的状态,并根据收到的消息决定做什么。标准行为定义在 /etc/scanbd/scanbd.conf 中。例如,操作 scan

action scan {
        filter = "^scan.*"
        numerical-trigger {
               from-value = 1
               to-value   = 0
               }
        desc   = "Scan to file"
        script = "test.script"
       }

每当扫描仪的消息包含 "scan" 一词(有关过滤器的更多详细信息,请参阅 reg-exp)并且值从 1 变为 0 时,它就会运行脚本 /etc/scanbd/test.script

/etc/scanbd/test.script 不执行任何操作,但会将消息发送到 syslog。

/etc/scanbd/test.script
#!/bin/bash
# look in scanbd.conf for environment variables

logger -t "scanbd: $0" "Begin of $SCANBD_ACTION for device $SCANBD_DEVICE"

# printout all env-variables
/usr/bin/printenv > /tmp/scanbd.script.env

logger -t "scanbd: $0" "End   of $SCANBD_ACTION for device $SCANBD_DEVICE"

/etc/scanbd/ 中还有一些实际上能做事的脚本 - 您可以自己看看。

此外,/etc/scanbd/scanbd.conf 在末尾有 "include" 指令,这些指令引用了某些打印机的预配置按钮定义。

$ cat /etc/scanbd/scanbd.conf | grep include\(
# include("scanner.d/myscanner.conf")
# include("/my/long/path/myscanner.conf")
include(scanner.d/avision.conf)
include(scanner.d/fujitsu.conf)
include(scanner.d/hp.conf)
include(scanner.d/pixma.conf)
include(scanner.d/snapscan.conf)