---
export_on_save:
html: true
---
<font face="Sarasa Mono HC">


# 网络打印机总结详细描述 0605

## 主要任务目标
1. 调研网络打印机发现->连接并安装驱动->打印测试页整个流程。
2. 尽可能多的搜集网络打印机设备信息，方便准确定位打印机。
3. 尽可能多的发现打印机连接中出现问题并分析原因。
4. 调研网络打印机的安装->打印测试页流程能否和usb打印机合并，减少开发工作量。

## 硬件环境
测试打印机：Brother DCP-7195DW
固件版本：F1911142047 1.08

## 软件环境
系统环境：v10SP1
cups=2.3.1-9kylin1k4
avahi-daemon=0.7-4kylin7
snmp=5.8+dfsg-2kylin2k2

## 任务阶段性成果详细描述

1. 发现了`7`种自动发现并添加网络机打印的方案。
  * 为什么要寻找多种打印机协议发现方案，而不是只用一种方法？
    * 由于需要适配打印机种类繁多，无法保证所有的打印机都遵守某一种协议。此外，打印机厂商也可能没有完全按照协议去设置打印机的固件属性。为保证所有打印机的正常连接，引入不同的打印机连接方案，也是代码强鲁棒性的保证。
  * 调研期间，通过不同的协议及获取数据的方式，发现了7种不同的发现网络打印机的方案。（详细测试结果请查阅`网络打印协议测试.xlsx`）

    | 方案连接协议 | 连接流程 |
    | :--------   | :-----   |
    | lpd | lpinfo/avahi 获取 lpd uri<br>->向snmpwalk发送请求获取设备信息<br>->调用cups接口连接打印机 |
    | ipp(1) | lpinfo 获取 ipp uri<br>->通过名称猜测厂商和型号<br>->调用cups接口连接打印机 |
    | ipp(2) | ippfind 获取 ipp uri<br>->向snmpwalk发送请求获取设备信息<br>->调用cups接口连接打印机 |
    | socket | avahi获取ip<br>->并处理成socket uri<br>->向snmpwalk发送请求获取设备信息<br>->调用cups接口连接打印机 |
    | dnssd | lpinfo 获取 dnssd uri<br>->通过名称猜测厂商和型号<br>->调用cups接口连接打印机|
    | http(1) | avahi使用_printer._tcp获取http<br>->uri向snmpwalk发送请求获取设备信息<br>->调用cups接口连接打印机 |
    | http(2) | avahi获取ip 并处理成http uri<br>->向snmpwalk发送请求获取设备信息<br>->调用cups接口连接打印机 |

  * 问题分析：
    * lpd无法打印问题：在Ubuntu 20.04, UOS, deepin, v10sp1开展对比测试,lpd 无法打印现象相同：可以通过驱动添加打印机，可以发送打印请求，但是均无法打印成功。从现象上来看，应该可以排除系统的问题，可能是测试使用的打印机不支持lpd协议导致。
2. 其中`5`种手动可以通过输入ip地址来添加网络打印机。
  * 支持ip地址查询，需要满足能够通过ip地址发现打印机厂商、型号、uri地址等信息，经过筛选，有五种方案可以做到这一点。
3. 其他已知但还需要调研的工作
  * 关于https打印机
    https打印机在初次安装时无法打印，原因是打印机的设置中没有打开https的端口导致，需要手动在打印机的设置中将https端口打开；需要调研其他打印机是否也是如此。
## 各功能点实现方案

* 功能点划分
  * 由于打印机的安装(需要`打印机名称`、`uri`、`pdd文件路径`)、寻找驱动(需要`厂商`、`型号`)、打印测试页已经在usb打印机阶段完成，现阶段只需要完成参数收集的任务即可。
  * 有关snmpwalk，可以参考`snmpwalk_usage.md(pdf,html)`

1. 打印机定位及获取ip
  * 通过封装好的qt类ZConfServiceBrowser实现:当发现网络中出现打印机时，触发serviceEntryAdded信号,开发者可以使用qt的`信号-槽`机制实现定制开发。
  * 通过`3.`解析到的域名获取到打印机的ip地址。
  * 用户手动输入

2. 打印机网络节点获取
  打印机在接入网络的时候，会生成一个局域网内唯一的网络节点标识，用来确认打印机在网络中的位置。
  * 通过`1.`获取到ip地址，用snmpwalk查询
  * 通过`3.`获取到域名，用snmpwalk查询
  * 通过`3.`获取到的uri解析获取

3. 打印机uri获取
  * 通过lpinfo 获取
  * 通过ippfind 获取
  * 通过`1.`获取到ip，组合成uri
  * 通过avahi获取到域名

4. 打印机厂商型号信息获取
  * 通过`1.` 获取到的ip，用snmpwalk查询
  * 通过`3.`获取到域名，用snmpwalk查询
  * 通过`5.`打印机名称猜测(可能不稳定，因为用户可以自由设置打印机名称)
5. 打印机名称获取
  打印机名称可以任意设置，仅是本机的标识，并不作为打印机连接的凭证。不过一般打印机的默认的格式为`厂商名_型号名`。
  * 可以通过lpinfo命令获取
  * 通过`4`获取到的厂商型号信息组合生成

6. 打印机其他信息获取
  * uuid 打印机硬件生成，可以作为打印机唯一标识
    * 通过avahi获取
  * serial 打印机序列号，打印机硬件生成，可以作为打印机唯一标识
    * 通过`1.`获取到ip地址，用snmpwalk查询
    * 通过`3.`获取到域名，用snmpwalk查询
## 名词解释

### printer
#### ipp
* 互联网打印协议(IPP；InternetPrintingProtocol)是一个在互联网上打印的标准网络协议，它容许用户可以透过互联网作遥距打印及管理打印工作等工作。
#### lpd
* 行式打印机后台程序(Line Printer Daemon)是一个安装在UNIX打印服务器上的后台程序。它的功能是等待接受客户使用行式打印机远程（LPR）协议传来的打印工作。
### zeroconf
#### zeroconf
* 零配置网络协议规范(Zero configuration networking)，是一种自动生成可用ip地址的网络技术、自动化配置管理网络的一种规范。即计算机或一些网络设备可以无需任何配置可以自动互连并可发现各自相关的服务。多应用于局域网，如自动发现可用打印机、MacBook可以自动发现连入同一局域网内iphone设备并使用相关服务等。
#### avahi
* Avahi是zeroconf协议的开源实现，基本是使用在Linux和FreeBSD上。包含了一整套多播DNS(multicastDNS)/DNS-SD网络服务的实现，使用的发布授权是LGPL。
* 在apple上，与avahi对应的实现是Bonjour。苹果的AirDrop以及一系列互联应用及服务便是基于Bonjour开发的。
### snmp
#### snmp
* 简单网络管理协议(Simple Network Management Protocol)是专门设计用于在 IP 网络管理网络节点（服务器、工作站、路由器、交换机及HUBS等）的一种标准协议，它是一种应用层协议。
#### MIB
* 管理信息库(Management Information Base),是TCP/IP网络管理协议标准框架的内容之一，MIB定义了受管设备必须保存的数据项、允许对每个数据项进行的操作及其含义，即管理系统可访问的受管设备的控制和状态信息等数据变量都保存在MIB中。可以使用snmp协议访问MIB中的内容。
#### OID
* 对象标识符(Object Identifier，OID)是与对象相关联的用来无歧义地标识对象的全局唯一的值，可保证对象在通信与信息处理中正确地定位和管理。通俗地讲，OID就是网络通信中对象的身份证。
### network
#### udp
* 用户数据报协议(UDP，User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
#### dnssd
* DNS服务发现(DNS Service Discovery)是一种使用标准 DNS 编程接口、服务器和数据包格式来浏览网络服务的方法。
### other
#### UUID
* UUID 是 通用唯一识别码（Universally Unique Identifier）的缩写，是一种软件建构的标准，亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的，是让分布式系统中的所有元素，都能有唯一的辨识信息，而不需要通过中央控制端来做辨识信息的指定。
</font>