# 网络打印机总结详细描述 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 ->向snmpwalk发送请求获取设备信息 ->调用cups接口连接打印机
  ipp(1) | lpinfo 获取 ipp uri ->通过名称猜测厂商和型号 ->调用cups接口连接打印机
  ipp(2) | ippfind 获取 ipp uri ->向snmpwalk发送请求获取设备信息 ->调用cups接口连接打印机
  socket | avahi获取ip ->并处理成socket uri ->向snmpwalk发送请求获取设备信息 ->调用cups接口连接打印机
  dnssd | lpinfo 获取 dnssd uri ->通过名称猜测厂商和型号 ->调用cups接口连接打印机
  http(1) | avahi使用_printer._tcp获取http ->uri向snmpwalk发送请求获取设备信息 ->调用cups接口连接打印机
  http(2) | avahi获取ip 并处理成http uri ->向snmpwalk发送请求获取设备信息 ->调用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

- 零配置网络协议规范(Zero configuration networking)，是一种自动生成可用ip地址的网络技术、自动化配置管理网络的一种规范。即计算机或一些网络设备可以无需任何配置可以自动互连并 可发现各自相关的服务。多应用于局域网，如自动发现可用打印机、MacBook可以自动发现连入同一局域网内iphone设备并使用相关服务等。

#### avahi

- Avahi是zeroconf协议的开源实现，基本是使用在Linux和FreeBSD上。包含了一整套多播DNS(multicastDNS)/DNS-SD网络服务的实现，使用的发布授权是LGPL。
- 在apple上，与avahi对应的实现是Bonjour。苹果的AirDrop以及一系列互联应用及服务便是基于Bonjour开发的。

### 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）的缩写，是一种软件建构的标准，亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的，是让分布式系统中的所有元素，都能 有唯一的辨识信息，而不需要通过中央控制端来做辨识信息的指定。