Page tree
Skip to end of metadata
Go to start of metadata


概述

  • 自动升级任务是企业用户在管理台通过已有的固件版本创建的升级任务,让设备在连接时,设备满足于升级任务的起始版本自动升级到目标版本。

接口详情

1.创建自动升级任务

  • 创建一个自动升级任务,需要提供起始版本和目标版本的固件信息。
  • 了解固件信息可查看文档 产品与设备管理接口
  • Api-Version请求头,默认不传为0,可选字段为2

Request

URL

POST /v2/upgrade/firmware/task

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"
Api-Version:"2"

Content

{
    "product_id":"产品ID",
    "name":"升级任务名称",
    "description":"描述",
    "from_version":"起始版本号",
    "from_version_url":"起始版本文件地址",
    "from_version_md5":"起始版本文件MD5",
    "from_version_size":"起始版本文件大小",   
    "target_version":"目标版本号",
    "target_version_url":"目标版本文件地址",
    "target_version_md5":"目标版本文件MD5",
    "target_version_size":"目标版本文件大小",
    "type" : "固件类型",
    "identify":"用来定位多MCU或多子设备的情况",
    "scope":{
        "category":"范围类别, 0:全网, 1:指定设备",
        "device_list":["设备ID1"]
     },
   "task_type":"升级任务类型",
   "tag_type":"升级任务标签类型, 0:正式任务, 1:测试任务"
 }


字段是否必须描述
product_id

产品ID

name自动升级任务名称,32个字符以内
description描述,250个字符以内

from_version

起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, type为mcu或多子设备时必传, 默认为0, type/identify/from_version联合唯一
task_type升级任务模式, 0自动模式, 1手动模式
scope
升级范围
scope.category
范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表
tag_type升级任务标签类型, 0:正式任务,1:测试任务,不传默认为正式任务

Response

Header

HTTP/1.1 200 OK


Content

{
    "id": "自动升级任务ID",
    "product_id": "产品ID",
    "name": "升级任务名称",
    "description": "描述",
    "from_version": "起始版本号",
    "from_version_url": "起始版本文件地址",
    "from_version_md5": "起始版本文件MD5",
    "from_version_size": "起始版本文件大小",
    "target_version": "目标版本号",
    "target_version_url": "目标版本文件地址",
    "target_version_md5": "目标版本文件MD5",
    "target_version_size": "目标版本文件大小",
    "upgrade_count": "已升级设备数量",
    "status": "任务状态",
    " type": "固件类型",
    "identify": "用来定位多MCU或多子设备的情况",
    "task_type": "升级任务模式, 0 自动模式, 1 手动模式 ",
    "scope": {
        "category": "范围类别, 0:全网, 1:指定设备",
        "device_list": ["设备ID1"]
    },
    "tag_type": "升级任务标签类型, 0:正式任务, 1:测试任务",
    "create_time": "升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'"
}


字段是否必须描述
id自动升级任务ID
product_id产品ID
name自动升级任务名称,32个字符以内
description描述,250个字符以内
from_version起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
upgrade_count已升级设备数量
status任务状态:0:停止状态,1:启动状态,2: 待执行,3:待审核
Api-Version为2时默认为待执行状态,其他默认为停止状态
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, type为mcu或多子设备时存在, 默认为0, type/identify/from_version联合唯一
task_type升级任务模式, 0自动模式, 1手动模式
scope升级范围
scope.category范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表
tag_type升级任务标签类型, 0:正式任务,1:测试任务,不传默认为正式任务
create_time升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'

2.获得自动升级任务列表GET

获得所有的自动升级任务列表。

Request

URL

GET /v2/upgrade/firmware/tasks?product_id={product_id}&offset=offset&limit=limit


Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权/XLINK调用凭证"
Api-Version:"2"


Content


Response

Header

HTTP/1.1 200 OK


Content

[{
    "id": "自动升级任务ID",
    "product_id": "产品ID",
    "name": "升级任务名称",
    "from_version": "起始版本号",
    "from_version_url": "起始版本文件地址",
    "from_version_md5": "起始版本文件MD5",
    "from_version_size": "起始版本文件大小",
    "target_version": "目标版本号",
    "target_version_url": "目标版本文件地址",
    "target_version_md5": "目标版本文件MD5",
    "target_version_size": "目标版本文件大小",
    "upgrade_count": "已升级设备数量",
    "status": "任务状态",
    "type": "固件类型",
    "identify": "用来定位多MCU或多子设备的情况",
    "description": "升级描述",
    "surplus_count": "当前剩余版本号为起始版本号的设备总数,即是要升级的设备数",
    "task_type": "升级任务模式, 0自动模式, 1手动模式",
    "scope": {
        "category": "范围类别, 0:全网, 1:指定设备",
        "device_list": ["设备ID1"]
    },
    "tag_type": "升级任务标签类型, 0:正式任务, 1:测试任务",
    "audit_member_id": "审批人标识",
    "create_time": "升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'"
}]


字段是否必须描述
id自动升级任务ID
product_id产品ID
name自动升级任务名称,32个字符以内
description描述,250个字符以内
from_version起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
upgrade_count已升级设备数量
status

任务状态:0:停止状态,1:启动状态,2: 待执行,3:待审核

Api-Version为2时 有可能为 0、1、2、3

Api-Version为其他时,只有0、1
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, 默认为0, type/identify/from_version联合唯一
description描述
surplus_count当前剩余版本号为起始版本号的设备总数,即是要升级的设备数, type为wifi时才有
task_type升级任务模式, 0自动模式, 1手动模式
scope升级范围
scope.category范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表
tag_type升级任务标签类型, 0:正式任务,1:测试任务,不传默认为正式任务
audit_member_id审批人标识
create_time升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'

3.开始和停止自动升级任务

通过本接口可开始或停止某个自动升级任务


Request

URL

POST /v2/upgrade/firmware/task/status


Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"


Content

{
    "product_id":"产品ID",
    "upgrade_task_id":"升级任务ID",
    "status":"任务状态"
}


字段是否必须描述
product_id产品ID
upgrade_task_id升级任务ID
status任务状态,0:停止状态,1:启动状态

Response

Header

HTTP/1.1 200 OK


Content


4.删除升级任务

彻底删除一个升级任务。


Request

URL

POST /v2/upgrade/firmware/task/delete


Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"


Content

{
    "id": "升级任务ID",
    "product_id": "产品ID"
}


Response

Header

HTTP/1.1 200 OK


Content


5.查询最新升级任务

获取最新的升级任务,根据product_id, device_id, type, from_version查询升级任务, 如有多个则按时间排序


Request

URL

POST /v2/upgrade/firmware/check/{device_id}


Header

Content-Type:"application/json"
Access-Token:"用户/企业成员调用凭证"


Content

{
    "product_id": "产品ID",
    "type": "升级任务类型",
    "current_version": "设备当前版本",
    "identify": "用来定位多MCU或多子设备的情况"
}


字段是否必须描述
product_id产品ID
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
current_version设备当前版本
identify用来定位多MCU或多子设备的情况,type若为"wifi",identify设置为0。

Response

Header

HTTP/1.1 200 OK


Content

{
    "id": "自动升级任务ID",
    "product_id": "产品ID",
    "name": "升级任务名称",
    "description": "描述",
    "from_version": "起始版本号",
    "from_version_url": "起始版本文件地址",
    "from_version_md5": "起始版本文件MD5",
    "from_version_size": "起始版本文件大小",
    "target_version": "目标版本号",
    "target_version_url": "目标版本文件地址",
    "target_version_md5": "目标版本文件MD5",
    "target_version_size": "目标版本文件大小",
    "upgrade_count": "已升级设备数量",
    "status": "任务状态",
    "type": "固件类型",
    "identify": "用来定位多MCU或多子设备的情况",
    "scope": {
        "category": "范围类别, 0:全网, 1:指定设备",
        "device_list": ["设备ID1"]
    }
}


字段是否必须描述
id自动升级任务ID
product_id产品ID
name自动升级任务名称,32个字符以内
description描述,250个字符以内
from_version起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
upgrade_count已升级设备数量
status任务状态:0:停止状态,1:启动状态,默认为停止状态。
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, 默认为0
scope升级范围

scope.category

范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表

6.上报升级结果

上报升级结果, 根据type,identify,last_version,current_version查找升级任务, 如果升级成功增加升级任务已升级设备数, 记录升级结果关联冗余升级任务id, 通过mq将上报结果暴露出来


Request

URL

POST /v2/upgrade/firmware/report/{device_id}


Header

Content-Type:"application/json"
Access-Token:"用户/设备/XLINK调用凭证"


Content

{
    "type":"升级任务类型",
    "mod":"固件型号",
    "identify":"用来定位多MCU或多子设备的情况",
    "last_version":"升级前version",
    "current_version":"升级后version",
    "result":"升级结果, 0:成功, 1:失败",
    "desc":"升级状况描述",
    "start_date":"升级开始时间",
    "end_date":"升级结束时间"
}


字段是否必须描述
type升级任务类型
mod固件型号
identify用来定位多MCU或多子设备的情况
last_version升级前version
current_version升级后version
result升级结果, 0:成功, 1:失败
desc升级状况描述
start_date升级开始时间, 例:2015-10-09T08:15:40.843Z
end_date升级结束时间, 例:2015-10-09T08:15:40.843Z

Response

Header

HTTP/1.1 200 OK


Content


7.获得自动升级任务列表POST

获得条件适应的自动升级任务列表。


Request

URL

POST /v2/upgrade/firmware/tasks


Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权/XLINK调用凭证"
Api-Version:"2"


Content

{
    "product_id": "产品id",
    "offset": "请求偏移量",
    "limit": "每页请求量",
    "type": "请求固件版本列表",
    "tag_type": "标签类型, 0:正式任务, 1:测试任务",
    "query": {
        "_id": {
            "$eq": "标识"
        },
        "name": {
            "$like": "名称"
        }
    },
    "order": {
        "name": "desc/asc"
    }
}


字段是否必须描述
product_id产品id
offset请求偏移量, 默认值0
limit每页请求量, 默认值10
type不传时,为全部类型
tag_type任务标签类型, 0:正式任务,1:测试任务
query查询条件,仅仅支持name和id字段

Response

Header

HTTP/1.1 200 OK


Content

{
    "count": "返回总数",
    "list": [{
        "id": "自动升级任务ID",
        "product_id": "产品ID",
        "name": "升级任务名称",
        "from_version": "起始版本号",
        "from_version_url": "起始版本文件地址",
        "from_version_md5": "起始版本文件MD5",
        "from_version_size": "起始版本文件大小",
        "target_version": "目标版本号",
        "target_version_url": "目标版本文件地址",
        "target_version_md5": "目标版本文件MD5",
        "target_version_size": "目标版本文件大小",
        "upgrade_count": "已升级设备数量",
        "status": "任务状态",
        "type": "固件类型",
        "identify": "用来定位多MCU或多子设备的情况",
        "description": "升级描述",
        "surplus_count": "当前剩余版本号为起始版本号的设备总数,即是要升级的设备数",
        "task_type": "升级任务模式, 0自动模式, 1手动模式",
        "scope": {
            "category": "范围类别, 0:全网, 1:指定设备",
            "device_list": ["设备ID1"]
        },
        "tag_type": "升级任务标签类型, 0:正式任务, 1:测试任务",
        "audit_member_id": "审批人标识",
        "create_time": "升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'"
    }]
}


字段是否必须描述
count返回总数
id自动升级任务ID
product_id产品ID
name自动升级任务名称,32个字符以内
description描述,250个字符以内
from_version起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
upgrade_count已升级设备数量
status

任务状态:0:停止状态,1:启动状态,2: 待执行,3:待审核

Api-Version为2时 有可能为 0、1、2、3

Api-Version为其他时,只有0、1
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, 默认为0, type/identify/from_version联合唯一
description描述
surplus_count当前剩余版本号为起始版本号的设备总数,即是要升级的设备数, type为wifi时才有
task_type升级任务模式, 0自动模式, 1手动模式
scope升级范围
scope.category范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表
tag_type升级任务标签类型, 0:正式任务,1:测试任务,不传默认为正式任务
audit_member_id审批人标识
create_time升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'

8.下发ota升级日志

  • 升级网关向设备下发升级指令成功后,由升级网关向API服务增加一条下发ota升级日志

Request

URL

POST /v2/upgrade/ota-log

Header

Content-Type:"application/json"
Access-Token:"XLINK调用凭证"
Corp-ID:"企业标识"

Content

{
    "device_id": "设备标识",
    "task_id": "升级任务标识"
}
字段是否必须描述
device_id设备标识
task_id升级任务标识

Response

Header

HTTP/1.1 200 OK

Content


9.查询ota升级日志

  • 查询ota升级日志,用于管理台获取使用

Request

URL

POST /v2/upgrade/ota-logs

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

{
    "offset": "请求列表的偏移量",
    "limit": "请求数量",
    "filter": [
        "字段A",
        "字段B"
    ],
    "query": {
        "filed1": {
            "$like": "字段值"
        },
        "filed3": {
            "$lt": "字段值"
        }
    },
    "order": {
        "filed1": "desc",
        "filed2": "asc"
    }
}


字段是否必须描述
offset从某个偏移量开始请求,默认为0
limit请求的条目数量,默认为10
order可以指定通过设备默认的某个字段排序,desc降序,asc升序
filter字段过滤,集合类型,可以指定返回结果列表的字段,可以
包含扩展属性字段
query

查询条件,可以根据不同字段加上不同的比较指令来查询,查
询条件字段包含设备所有默认字段,不支持扩展属性字段,支
持比较指令包含如下:
$in:包含于该列表任意一个值
$lt:小于该字段值
$lte:小于或等于字段值
$gt:大于该字段值
$gte:大于或等于该字段值
$like:模糊匹配该字段值

可提供字段有:

  • task_id
  • device_id
  • device_mac
  • device_sn

Response

Header

HTTP/1.1 200 OK


Content

{
    "count": "总数量",
    "list": [{
        "id": "ota升级日志标识",
        "product_id": "产品标识",
        "task_id": "升级任务标识",
        "device_id": "设备标识",
        "device_mac": "设备mac地址",
        "device_sn": "设备序列号",
        "status": "升级状态",
        "execute_time": "结束时间"
    }]
}


字段是否必须描述
count总数量
list设备列表
idota升级日志标识
product_id产品标识
task_id升级任务标识
device_id设备标识
device_mac设备mac地址
device_sn设备序列号
status升级状态, 1:已下发,2:已完成
execute_time结束时间

10.升级任务由测试类型转为正式类型

  • 升级任务由测试类型转为正式类型
  • 状态转为待执行状态
  • 可以修改参数包括
    • name:升级名称
    • description:升级描述
    • scope:升级范围

Request

URL

PUT /v2/upgrade/firmware/tasks/{task_id}/product-tag

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

{
    "name": "升级任务名称",
    "description": "升级任务描述",
    "scope": {
        "category": "范围类别, 0:全网, 1:指定设备",
        "device_list": ["设备ID1"]
    }
}


字段是否必须描述
name升级任务名称
description升级任务描述
scope升级范围
scope.category范围类型,当出现scope时,category必须
scope.device_list当scope.category为指定设备时, 必须

Response

Header

HTTP/1.1 200 OK

Content


11.提交升级任务审核

  • 任务类型必须为正式任务
  • 任务状态必须为待执行状态
  • 必须填写审核人(企业成员)
  • 提交后状态重置为待审核状态

Request

URL

PUT /v2/upgrade/firmware/tasks/{task_id}/submit-audit

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

{
    "audit_member_id":"审批人标识"
}


字段是否必须描述
audit_member_id审核人标识

Response

Header

HTTP/1.1 200 OK

Content

12.审核升级任务

  • 任务类型必须为正式任务
  • 任务状态必须为待审核状态
  • 接口调用者必须与任务审批人标识相等
  • 如果审批人批准,则任务状态转换为执行中
  • 如果审批人拒绝,则任务状态转换为待执行
  • 将任务审批人置为空

Request

URL

PUT /v2/upgrade/firmware/tasks/{task_id}/audit

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

{
    "audit_result":"审批结果"
}


字段是否必须描述
audit_result审批结果,1:批准,2:拒绝

Response

Header

HTTP/1.1 200 OK

Content

13.为测试任务变更指定设备

  • 任务类型必须为测试任务
  • 目前只能修改升级范围
  • 全量变更

Request

URL

PUT /v2/upgrade/firmware/tasks/{task_id}/devices

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

{
    "opt": "操作类型",
    "device_list": [
        "device_id1",
        "device_id2"
    ]
}


字段是否必须描述
opt操作,1:新增,2:删除, 3:覆盖
device_list设备标识列表


Response

Header

HTTP/1.1 200 OK

Content

14.获取升级任务

  • 根据标识获取升级任务

Request

URL

GET /v2/upgrade/firmware/tasks/{task_id}

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"
Api-Version:"2"

Content

Response

Header

HTTP/1.1 200 OK

Content

{
    "id": "自动升级任务ID",
    "product_id": "产品ID",
    "name": "升级任务名称",
    "from_version": "起始版本号",
    "from_version_url": "起始版本文件地址",
    "from_version_md5": "起始版本文件MD5",
    "from_version_size": "起始版本文件大小",
    "target_version": "目标版本号",
    "target_version_url": "目标版本文件地址",
    "target_version_md5": "目标版本文件MD5",
    "target_version_size": "目标版本文件大小",
    "upgrade_count": "已升级设备数量",
    "status": "任务状态",
    "type": "固件类型",
    "identify": "用来定位多MCU或多子设备的情况",
    "description": "升级描述",
    "surplus_count": "当前剩余版本号为起始版本号的设备总数,即是要升级的设备数",
    "task_type": "升级任务模式, 0自动模式, 1手动模式",
    "scope": {
        "category": "范围类别, 0:全网, 1:指定设备",
        "device_list": ["设备ID1"]
    },
    "tag_type": "升级任务标签类型, 0:正式任务, 1:测试任务",
    "audit_member_id": "审批人标识",
    "create_time": "升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'"
}


字段是否必须描述
id自动升级任务ID
product_id产品ID
name自动升级任务名称,32个字符以内
description描述,250个字符以内
from_version起始版本号,32位整形
from_version_url起始版本文件地址
from_version_md5起始版本文件MD5值
from_version_size起始版本文件大小
target_version目标版本文件号
target_version_url目标版本文件地址
target_version_md5目标版本文件MD5
target_version_size目标版本文件大小
upgrade_count已升级设备数量
status

任务状态:0:停止状态,1:启动状态,2: 待执行,3:待审核

Api-Version为2时 有可能为 0、1、2、3

Api-Version为其他时,只有0、1
type升级任务类型,新增,见附件升级任务类型, 默认为wifi
identify用来定位多MCU或多子设备的情况, 数字, 默认为0, type/identify/from_version联合唯一
description描述
surplus_count当前剩余版本号为起始版本号的设备总数,即是要升级的设备数, type为wifi时才有
task_type升级任务模式, 0自动模式, 1手动模式
scope升级范围
scope.category范围类别, 0:全网, 1:指定设备
scope.device_list指定升级设备标识列表
tag_type升级任务标签类型, 0:正式任务,1:测试任务,不传默认为正式任务
audit_member_id审批人标识
create_time升级任务创建时间, 格式为yyyy-MM-dd'T'HH:mm:ss.SS'Z'

15.查询操作日志接口

  • 根据标识获取升级任务的操作日志

Request

URL

GET /v2/upgrade/firmware/tasks/{task_id}/op-logs

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

Response

Header

HTTP/1.1 200 OK

Content

{
    "count": "操作日志数量",
    "list": [{
        "id": "操作日志标识",
        "conent": "操作日志内容",
        "opt_id": "操作人标识",
        "opt_name": "操作人名称",
        "opt_account": "操作人账号",
        "create_date": "日志产生时间"
    }]
}


字段是否必须描述
count操作日志数量
id操作日志标识
content操作日志内容
opt_id操作人标识
opt_name操作人名称
opt_account操作人账号
create_date日志产生时间


16.查询自定义升级任务版本占比

  • 查询自定义升级任务的设备版本占比
  • 以选定的设备总数为基数,各个版本设备数为占比

Request

URL

GET /v2/statistics/ota/customize-task/{task_id}/device-firmware-version

Header

Content-Type:"application/json"
Access-Token:"企业成员/第三方授权调用凭证"

Content

Response

Header

HTTP/1.1 200 OK

Content

{
    "total": "总设备数",
    "ratios": [{
        "devices": "该版本设备总数",
        "firmware_version": "版本"
    }, {
        "devices": "该版本设备总数",
        "firmware_version": "版本"
    }]
}


字段是否必须描述
total该升级任务包含设备总数
ratios占比
devices该版本设备总数
firmware_version版本


升级附录

1.设备固件类型

枚举值说明
1WIFI
2MCU
3子设备

2.设备升级任务类型

枚举值说明
1WIFI
2MCU
3子设备



  • No labels