# 直传模式

KIC提供了扫描数据实时直传的高级能力,不开启直传模式时,每次扫描结束后可以获取到此次扫描结果的完整PDF。

开启直传模式时可以在扫描过程中,将每页或多页的扫描图像(JPEG)实时直传至您的服务器上,可实现实时的扫描页面图像数据流获取。

直传模式是扫描过程中对扫描页面数据流的并行处理,单次扫描和连续扫描都可以开启实时直传,并且可以通过direct_mode来控制是否上传最终的PDF文件。

TIP

实时直传数据不会经过KIC服务器。

直传支持上传至公网服务器内网的设备中。

直传与正常扫描方式可以同时进行(direct_mode: 2, 即可获得直传数据又可以获得最终的PDF结果)

注意

页面数据的直传是串行的,盒子终端会对每页或多页(取决于direct_page_size)进行逐一上传,请确保您的服务端的带宽充足、能稳定的响应请求数据。接收数据后能尽快给出正常响应以提升传输效率。(最好在1秒内)

直传模式传输的页面数据不支持KHES加密,建议使用HTTPS加密协议进行接收直传数据,并可以通过开启HTTP2协议来加快传输效率。

# 开启直传

  • 调用 『创建扫描任务接口』 并将options.direct_mode设为1或2 (1 仅开启直传(不上传最终的PDF),2 同时直传(仍上传最终的PDF))

  • 设置options.direct_page_size为每次传输的页面数量 (取值范围:1-10,默认为2) 。如设为1,每个页面都会传输一次数据,如开启双面,则一页双面的纸张会传输两次页面数据。数值越大则每次传输的数据量就越大,建议使用1或2来提升整体的实时效率。

  • 设置options.direct_addr用于接收直传数据的服务端或终端接口地址(支持http、https),在页面数据生成后,盒子终端会通过POST application/json的形式向该地址发送,当扫描结束时通过PUT请求发送扫描完成结果通知。

提示

每次直传请求在收到后请尽快给出响应(最好在1秒内),如超过30秒(包含网络建连、传输时间)则认为请求超时,会继续重试 3 次。

响应速度越快则实时性越高。

注意

请确保您的服务端或终端的网关(如Nginx)和应用服务器程序的client_max_body_size 设置的值足够大(Nginx默认为1M),否则无法正确接收数据,当direct_page_size设为2或更大值时,请求body的大小往往在1M以上。建议根据您的应用环境将网关及应用服务器的最大请求Body设为20M以上,否则有可能请求会被拦截,返回413 Request Entity Too Large

# 接收直传数据 Callback

在服务端或内网终端上实现一个HTTP接口并接收页面实时直传数据(接口地址为创建扫描任务时设置的options.direct_addr,通过HTTP POST请求发送)。

建议使用HTTPS(HTTP2)接口来提高安全性与传输效率

  • 请求类型(Request Method):POST
  • 请求头(Request Header):
名称 说明
User-Agent 固定为:KIC-Client
Content-Type 固定为:application/json
  • 请求消息体(Request Body):

消息体固定为JSON 格式,包含以下结构:

名称 类型 必选 说明
client_uuid String 设备UUID
scan_uuid String 扫描任务UUID
item_id Integer 扫描数据的批次ID。
与scan.item_data回调通知中的item_id一致。
pages Object Array 页面数据对象数组
(按页面顺序排序,数量取决于options.direct_page_size,最后一次直传的数量可能小于该数值)
pages[Index].paper_number Integer 此页面的纸张页数(第几页纸张,当开启双面扫描并开启跳过空白页时,可能出现跳页,识别到空白页不传输)
pages[Index].page_number Integer 此页面的页面数(第几面,如第二张纸的面为3,当开启双面扫描并开启跳过空白页时,可能出现跳页,识别到空白页不传输)
pages[Index].front Bool 此页面是否为正面(扫描稿件朝向扫描仪的一面为正面)
pages[Index].file_type String 此页面数据的文件类型(默认为jpg)
pages[Index].file_size Integer 此页面数据的文件大小,字节数
pages[Index].check_sum String 此页面数据的文件MD5校验值
pages[Index].data String 此页面数据的文件内容(base64编码,不包含 类型前缀data:image/jpeg;base64。如需存储该文件,直接将base64解码为字节码写入jpg文件即可)
  • 直传请求Body示例:
{
    "client_uuid": "941e2dad-xxxx-xxxx-xxxx-ec78d66e227d",
    "scan_uuid": "xxxxxxx",
    "item_id": 1,
    "pages": [
      {
        "paper_number": 1,
        "page_number": 1,
        "front": true,
        "file_type": "jpg",
        "file_size": 4231105,
        "check_sum": "xxxxxxxxxxxxxx",
        "data": "xxxxxxx...."
      },
      {
        "paper_number": 1,
        "page_number": 2,
        "front": false,
        "file_type": "jpg",
        "file_size": 6237825,
        "check_sum": "xxxxxxxxxxxxxx",
        "data": "xxxxxxx...."
      },
      {
        "paper_number": 2,
        "page_number": 3,
        "front": true,
        "file_type": "jpg",
        "file_size": 6237825,
        "check_sum": "xxxxxxxxxxxxxx",
        "data": "xxxxxxx...."
      },
      ...
    ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 接收扫描完成结果 Callback

在服务端或内网终端上实现一个HTTP接口并接收扫描任务完成结果(接口地址为创建扫描任务时设置的options.direct_addr,通过HTTP PUT请求发送)。

当本次扫描任务结束时,并且在所有直传数据传输完成后,盒子终端会 同步的 发出该完成结果通知。

  • 请求类型(Request Method):PUT
  • 请求头(Request Header):
名称 说明
User-Agent 固定为:KIC-Client
Content-Type 固定为:application/json
  • 请求消息体(Request Body):

消息体固定为JSON 格式,包含以下结构:

名称 类型 必选 说明
client_uuid String 设备UUID
scan_uuid String 扫描任务UUID
error_code Integer 同回调通知中的 error_code, 扫描流程错误码
当扫描流程发生异常,此字段非0
详见 扫描错误码
item_size Integer 扫描批次的数量,即item_data的数量
total_pages Integer 总扫描页面数(开启跳过空白页时,不含空白页数量)
state String 取值:finish 扫描完成
  • 直传请求Body示例:
{
  "client_uuid": "26568435-xxxx-xxxx-xxxx-3c4ac0cea0ea",
  "scan_uuid": "11a30100-xxxx-xxxx-xxxx-066e41ffd658",
  "error_code": 0,
  "item_size": 4,
  "total_pages": 12,
  "state": "finish"
}
1
2
3
4
5
6
7
8