扫描仪按钮守护进程

来自 ArchWiki

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

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

它是如何工作的?

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

为了解决这个问题,使用了第二个守护进程(在 scanbd 的所谓“管理器模式”中):scanbm 被配置为访问扫描仪的“代理”,如果另一个应用程序尝试使用扫描仪,则命令轮询守护进程禁用轮询,以便其他扫描应用程序可以使用扫描仪。

为了实现这一点,配置 scanbm 而不是 saned 作为网络扫描守护进程。如果扫描请求到达 sane 端口,scanbm 会向轮询 scanbd 守护进程 发送 dbus 信号来停止轮询。然后它启动真正的 saned,它会扫描并将数据发回请求应用程序。之后,scanbd 管理器 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" 指令(删除其他指令(打印机),或用 # 符号注释掉它们)

/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 的“管理器模式”),而 scanbm 又告诉(已运行的)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"(有关过滤器的更多详细信息,请参见正则表达式),并且值从 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)