华为云用户手册

  • 附:TCP SACK介绍 TCP是面向连接的协议。当双方希望通过TCP连接进行通信时,他们通过TCP握手交换某些信息建立连接,例如发起一个TCP请求,通过SYN发送初始序列ID、确认ID、连接使用的最大数据包段大小(MSS)、认证信息和处理选择性确认(SACK)等。整体TCP连接通过我们熟知的三次握手最终建立。 TCP通过一个数据段单元发送和接收用户数据包。 TCP数据段由TCP头、选项和用户数据组成。每个TCP段都有序列号(SEQ)和确认号(ACK)。 接收方通过SEQ号和ACK号来跟踪成功接收了哪些段。ACK号下一个预期接受的段。 示例: 上图中用户A通过13个100字节的段发送1k字节的数据,每个段具有20字节的TCP头,总计是13个段。在接收端,用户B接收了段1,2,4,6,8-13,而段3,5和7丢失,B没有接收到。 通过使用ACK号,用户B告诉A,他需要段3,用户A读取到B接收到2后没有收到3,A将重新发送全部段,尽管B已经收到了4,6和8-13段。这就导致了网络的低效使用。
  • CCI自定义策略样例 示例1:更新命名空间 { "Version": "1.1", "Statement": [ { "Effect": "Allow", "Action": [ "cci:namespace:update" ] } ]} 示例2:拒绝用户删除命名空间 拒绝策略需要同时配合其他策略使用,否则没有实际作用。用户被授予的策略中,一个授权项的作用如果同时存在Allow和Deny,则遵循Deny优先原则。 如果您给用户授予CCI FullAccess的系统策略,但不希望用户拥有CCI FullAccess中定义的删除命名空间权限(cci:namespace:delete),您可以创建一条相同Action的自定义策略,并将自定义策略的Effect设置为Deny,然后同时将CCI FullAccess和拒绝策略授予用户,根据Deny优先原则,则用户可以对CCI执行除了删除命名空间外的所有操作。拒绝策略示例如下: { "Version": "1.1", "Statement": [ { "Action": [ "cci:namespace:delete" ], "Effect": "Deny" } ]} 示例3:多个授权项策略 一个自定义策略中可以包含多个授权项,且除了可以包含本服务的授权项外,还可以包含其他服务的授权项,可以包含的其他服务必须跟本服务同属性,即都是项目级服务或都是全局级服务。多个授权语句策略描述如下: { "Version": "1.1", "Statement": [ { "Action": [ "ecs:cloudServers:resize", "ecs:cloudServers:delete", "ecs:cloudServers:delete", "ims:images:list", "ims:serverImages:create" ], "Effect": "Allow" } ]}
  • 查看Pod 有时,您也许会通过调用创建Pod接口或者使用kubectl直接创建Pod,这些Pod并不在某个负载或任务之下,不方便通过控制台管理。云容器实例提供了Pod管理功能,您可以通过“选择来源”更方便找到需要的Pod。 图2 选择Pod来源 您可以查看到所有Pod详情,包括基本信息、Pod中容器组成、Pod的监控信息、事件,以及使用远程终端访问Pod。您还可以对Pod进行删除操作,并查看Pod的日志。 图3 Pod详情
  • 什么是Pod Pod是Kubernetes创建或部署的最小单位。一个Pod封装一个或多个容器(container)、存储资源(volume)、一个独立的网络IP以及管理控制容器运行方式的策略选项。 Pod使用主要分为两种方式: Pod中运行一个容器。这是Kubernetes最常见的用法,您可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。 Pod中运行多个需要耦合在一起工作、需要共享资源的容器。通常这种场景下是应用包含一个主容器和几个辅助容器(SideCar Container),如图1所示,例如主容器为一个web服务器,从一个固定目录下对外提供文件服务,而辅助的容器周期性的从外部下载文件存到这个固定目录下。 图1 Pod 实际使用中很少直接创建Pod,而是使用Kubernetes中称为Controller的抽象层来管理Pod实例,例如Deployment和Job。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和自愈能力。通常,Controller会使用Pod Template来创建相应的Pod。
  • 操作步骤 登录云容器实例管理控制台,在左侧导航栏中选择“权限管理”,进入权限管理页面。 单击“添加授权”,进入添加授权页面。 图1 添加授权 在添加授权页面,选择要授权使用的命名空间,此处选择“rbac-test-3”。 图2 选择命名空间 为“委托账号”增加“admin”权限,在展开的选项中进行如下配置: 用户/用户组:选择“委托账号”,并在二级选项中选择需要授权的委托账号。 权限:选择“admin”。 图3 为委托账号授予admin权限 单击“创建”,完成委托账号在命名空间中的相应权限设置。
  • 网络访问概述 负载访问可以分为如下几种场景: 内网访问:访问内网资源。 使用“Service”方式访问:该方式适合CCI中同一个命名空间中的负载相互访问。 使用ELB(私网)访问:该方式适合云服务内部资源(云容器实例以外的资源,如ECS等)且与负载在同一个VPC内互相访问,另外在同一个VPC不同命名空间的负载也可以选择此种方式。通过内网域名或ELB的“IP:Port”为内网提供服务,支持HTTP/HTTPS和TCP/UDP协议。如果是内网且与负载不在同一个VPC内,也可以选择创建VPC对等连接,使得两个VPC之间网络互通。 公网访问:即给负载绑定ELB(ELB必须与负载在同一个VPC内),通过ELB从公网访问负载。 从容器访问公网:通过在NAT网关服务中配置SNAT规则,使得容器能够访问公网。 图1 网络访问示意图 父主题: 负载网络访问
  • 容器启动命令 启动容器就是启动主进程,但有些时候,启动主进程前,需要一些准备工作。比如MySQL类的数据库,可能需要一些数据库配置、初始化的工作,这些工作要在最终的MySQL服务器运行之前解决。这些操作,可以在制作镜像时通过在Dockerfile文件中设置ENTRYPOINT或CMD来完成,如下所示的Dockerfile中设置了ENTRYPOINT ["top", "-b"]命令,其将会在容器启动时执行。 FROM ubuntuENTRYPOINT ["top", "-b"] 启动命令必须为容器镜像支持的命令,否则会导致容器启动失败。 在云容器实例中同样可以设置容器的启动命令,例如上面Dockerfile中的命令,只要在创建负载时配置容器的高级设置,先单击“添加”,输入“top”命令,再单击“添加”,输入参数“-b”,如下图所示。 图1 启动命令 由于容器引擎运行时只支持一条ENTRYPOINT命令,云容器实例中设置的启动命令会覆盖掉制作镜像时Dockerfile中设置的ENTRYPOINT和CMD命令,其规则如下表所示。 镜像Entrypoint 镜像CMD 容器运行命令 容器运行参数 最终执行 [touch] [/root/test] 未设置 未设置 [touch /root/test] [touch] [/root/test] [mkdir] 未设置 [mkdir] [touch] [/root/test] 未设置 [/opt/test] [touch /opt/test] [touch] [/root/test] [mkdir] [/opt/test] [mkdir /opt/test] 父主题: 工作负载
  • Secret文件格式说明 secret.yaml资源描述文件 例如现在有一个应用需要获取下面的key-value并加密,可以通过Secret来实现: key1: value1 key2: value2 定义的Secret文件secret.yaml内容如下。其中Value需要进行Base64编码,Base64编码方法请参见如何进行Base64编码。 apiVersion: v1kind: Secretmetadata: name: mysecret # secret的名称 annotations: description: "test" labels: label-01: value-01 label-02: value-02data: key1: dmFsdWUx #需要用Base64编码 key2: dmFsdWUy #需要用Base64编码type: Opaque # 必须为Opaque secret.json资源描述文件 定义的Secret文件secret.json内容如下。 { "apiVersion": "v1", "kind": "Secret", "metadata": { "annotations": { "description": "test" }, "labels": { "label-01": "value-01", "label-02": "value-02" }, "name": "mysecret" }, "data": { "key1": "dmFsdWUx", "key2": "dmFsdWUy" }, "type": "Opaque"}
  • 添加日志存储 在创建负载的时候设置为容器添加日志存储。 容器内日志路径:即日志存储挂载到容器内的挂载路径,需要保证应用程序的日志输出路径与该路径一致,这样日志才能写入到日志存储卷中。 请确保日志存储卷路径在当前容器内是不存在的,否则会把容器内这个路径下的内容清空。 目前只支持日志路径下的“.log”、“.trace”、“.out”日志文件。 最多只能采集20个日志文件,也就是说您的日志最多只能输出到日志路径下的20个文件中。 日志存储空间:日志的存储空间大小。 AOM每月赠送每个租户500M的免费日志存储空间,超过500M时将根据实际使用量进行收费,计费规则请参见产品价格详情。 日志存储空间取值请确保为1或2,后台调api接口创建负载时,请确保取值为1GB或2GB。 该空间为免费空间,超时不采集,如果日志文件超过2G,请您提前做好转储。 图2 使用日志存储
  • 弹性伸缩 当前仅支持无状态负载弹性伸缩。 您可以根据业务需求自行定义伸缩策略,降低人为反复调整资源以应对业务变化和高峰压力的工作量,帮助您节约资源和人力成本。当前支持三种弹性伸缩策略: 告警策略:支持根据CPU/内存的使用率,进行工作负载的自动伸缩。工作负载创建完成后即可设置,在CPU/内存超过或少于一定值时,自动增减实例。 定时策略:支持在特定时间点进行工作负载的自动伸缩。适用于秒杀周年庆等活动,例如在秒杀这个时间点增加一定数量的实例个数。 周期策略:支持以天、周、月为周期的伸缩策略。适用于周期性的流量变化。
  • ConfigMap文件格式要求 ConfigMap资源文件支持json和yaml两种格式,且数据值大小不得超过1MB。 json格式 文件名称为configmap.json,配置示例如下: { "kind": "ConfigMap", "apiVersion": "v1", "metadata": { "name": "nginxconf", "namespace": "cci-namespace-demo" }, "data": { "nginx.conf": "server {\n listen 80;\n server_name localhost;\n\n location / {\n root html;\n index index.html index.htm;\n }\n}" }} yaml格式 文件名称为configmap.yaml,配置示例如下: kind: ConfigMapapiVersion: v1metadata: name: nginxconf namespace: cci-namespace-demodata: nginx.conf: |- server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } }
  • SSL证书介绍 SSL证书就是遵守SSL(Secure Socket Layer)协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。服务器通过安装SSL证书可以实现数据信息在客户端和服务器之间的加密传输,可以防止数据信息的泄露,保证了双方传递信息的安全性,而且可以通过服务器证书验证他所访问的网站是否是真实可靠。 SSL证书分为权威证书和自签名证书。权威证书由权威的数字证书认证机构签发,您可向第三方证书代理商购买,使用权威证书的Web网站,默认客户端都是信任的。自签名证书是由用户自己颁发给自己的,一般可以使用openssl生成,默认客户端是不信任的,浏览器访问时会弹出告警,选择忽略告警可继续正常访问。
  • 使用SSL证书 当服务有公网访问时,可以使用SSL证书,设置ELB为HTTPS协议。 在创建负载的过程中,负载访问方式选择“公网访问”,ELB协议选择“HTTP/HTTPS”,证书选项选择SSL证书,负载创建过程中会将SSL证书自动安装到弹性负载均衡器上,从而实现数据传输加密。 图2 使用SSL证书 负载创建完成后,云容器实例将会在ELB中创建与负载名字相同证书。云容器实例服务创建以“beethoveen-cci-ingress”开头名称的证书,请勿删除或更新该类证书,否则引起访问异常。
  • 网络访问场景 在前面两节中介绍了如何通过Service和Ingress访问Pod,本节总结一下云容器实例中Pod的访问场景,如图1所示,访问负载可以分为如下几种场景,每种场景下可以使用Service和Ingress来解决访问问题。 同一个命名空间中的负载相互访问:只需创建Service,使用“服务名称:服务端口”访问负载。 同一个VPC内资源互相访问:直接访问Service的IP地址,或者通过Ingress绑定私网ELB,使用私网ELB的IP访问负载。 不同VPC内资源互相访问:不同VPC内,可以选择创建VPC对等连接,使得两个VPC之间网络互通,在访问时通过Service的IP地址或私网ELB访问负载。 从公网访问负载:从外部访问负载,需要通过Ingress绑定公网ELB,通过ELB的IP访问负载。 从负载中访问公网:通过在NAT网关服务中配置SNAT规则,使得容器能够访问公网,具体配置方法请参见从容器访问公网。 图1 网络访问示意图 父主题: 使用Service和Ingress管理网络访问
  • 设置容器生命周期 云容器实例基于Kubernetes,提供了,在容器的生命周期的特定阶段执行调用,比如容器在停止前希望执行某项操作,就可以注册相应的钩子函数。目前提供的生命周期钩子函数如下所示。 启动后处理(PostStart):容器启动后触发。 停止前处理(PreStop):容器停止前触发。 当前云容器实例仅支持命令行类型(Exec)钩子函数。 登录云容器实例控制台,在创建负载配置生命周期过程中,选择“启动后处理”或者“停止前处理”页签。 例如需要在容器中执行“/postStart.sh all”命令,则在界面上做如下配置即可,第一行是命令行脚本名称,第二行是参数。 图1 命令行脚本
  • Pod规格计算方式 Pod规格的计算方式遵循如下规则: Pod 包含的所有 Init 容器上定义的任何特定资源的约束值 (limit) 或 请求值 (request) 的最大值,作为 Pod 有效初始 request/limit。 Pod 对资源的有效 limit/request ,是取如下两项的较大者: 所有应用容器对某个资源的 limit/request 之和; 对某个资源的有效初始的 limit/request 。 针对如下实例,计算Pod规格。 apiVersion: v1kind: Podmetadata: name: web-appspec: initContainers: - name: config-generator image: busybox resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "256Mi" cpu: "250m" - name: mysql-checker image: centos resources: requests: memory: "1Gi" cpu: "500m" limits: memory: "1Gi" cpu: "500m" containers: - name: app image: images.my-company.example/app:v4 env: - name: MYSQL_ROOT_PASSWORD value: "password" resources: requests: memory: "1Gi" cpu: "500m" limits: memory: "1Gi" cpu: "500m" - name: log-aggregator image: images.my-company.example/log-aggregator:v6 resources: requests: memory: "1Gi" cpu: "250m" limits: memory: "1Gi" cpu: "250m" Init 容器,request/limit取最大值:memory为1Gi,cpu为500m。 所有应用容器request/limit之和:memory为2Gi,cpu为750m。 如上两步取较大值,Pod的规格为request/limit:memory 2Gi,cpu 750m。 父主题: Pod
  • 文档导读 本文档分为如下几个部分。 使用kubectl 介绍如何在云容器实例中配置kubectl。CCI支持使用原生kubectl或定制的kubectl来创建负载等资源,建议优先选用原生kubectl。 Namespace和Network 介绍云容器示例中Namespace与Network的概念。 Pod 介绍Pod相关概念,以及如何使用Pod。 Label 介绍Label的作用,以及如何使用Label。 无状态负载(Deployment) 介绍Deployment的使用场景,如何使用Deployment将容器镜像部署到云容器实例中。 访问负载 介绍Service和Ingress两种管理负载访问的资源对象,使用Service和Ingress解决负载访问的问题。 Service:定义一系列Pod以及访问这些Pod的策略的一层抽象。 Ingress:管理外部访问的资源对象。 使用存储 介绍负载中如何使用存储,即如何容器中如何使用存储卷。包括如何使用云硬盘(EVS)、弹性文件服务(SFS)、对象存储(OBS)。 使用ConfigMap和Secret 介绍如何使用ConfigMap和Secret。 ConfigMap和Secret用于保存配置信息和敏感信息,从而提高负载配置的易用性和灵活性。 使用Job和CronJob 介绍如何使用Job。Job适用于一次性任务的场景。
  • EIP随Pod创建 创建Pod时,填写pod-with-eip的annotation后,EIP会随Pod自动创建并绑定至该Pod。 以下示例创建一个名为nginx的无状态负载,EIP将随Pod自动创建并绑定至Pod。具体字段含义见表1。 创建独占带宽类型的Deployment,无需指定带宽ID,示例如下: apiVersion: apps/v1kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "14" description: "" name: nginx namespace: eip spec: ... template: metadata: annotations: yangtse.io/pod-with-eip: "true" yangtse.io/eip-bandwidth-size: "5" yangtse.io/eip-network-type: 5_g-vm yangtse.io/eip-charge-mode: bandwidth yangtse.io/eip-bandwidth-name: "xxx" 创建共享带宽类型的Deployment,必须指定带宽ID且只需填写该字段,示例如下: apiVersion: apps/v1kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "14" description: "" name: nginx namespace: eip spec: ... template: metadata: annotations: yangtse.io/pod-with-eip: "true" yangtse.io/eip-bandwidth-id: "xxx" 表1 参数说明 参数 参数含义 必选/可选 约束 yangtse.io/pod-with-eip EIP随Pod创建 必选 字段填写值为"true"时,才会开启该功能。 yangtse.io/eip-bandwidth-size 指定EIP带宽 可选 默认值为5。 yangtse.io/eip-network-type 指定带宽类型 可选 默认值为5_bgp,若region不支持5_bgp,同时该字段未填写时,pod会报event。 yangtse.io/eip-charge-mode 指定收费类型 可选 默认值bandwidth,可选值traffic。 yangtse.io/eip-bandwidth-id 指定共享带宽id 必选(共享型带宽) 填写该字段时,无需填写其他值。 yangtse.io/eip-bandwidth-name 指定带宽名 可选 默认值同该EIP的名称。 查看随Pod创建的EIP: # kubectl get eip -n eipNAME EIPPOOLOWNER STATUS BANDWIDTHSIZE PRIVATEIPV4 NODENAME PODNAMESPACE PODNAME AGE100.93.9.115 ACTIVE 5 192.168.154.181 cnnorth7b-pod04-common001-cna003 eip nginx-867489bb7-cvhnz 79s 随Pod创建的EIP可以在annotation中查看该EIP属于哪个pod: # kubectl get eip -n eip 100.93.9.115 -oyamlapiVersion: crd.yangtse.cni/v1 kind: EIPmetadata: annotations: yangtse.io/auto-created-by-pod: eip/nginx-867489bb7-cvhnz ... 父主题: EIP
  • 控制Pod的EIP准备就绪 容器网络控制器会在Pod IP分配后,为Pod绑定EIP并回写分配结果至Pod的Annotation(yangtse.io/allocated-ipv4-eip),Pod业务容器的启动时间可能早于EIP分配结果回写成功时间。 您可以尝试为Pod配置init container并使用downwardAPI把yangtse.io/allocated-ipv4-eip annotation通过volume挂载到init container里,并在init container中检查EIP是否已经分配成功。您可以参考以下示例配置init container。 CCI当前提供Pod自动绑定EIP的能力,实际的EIP分配发生在Pod调度完成之后,因此当前不支持通过ENV将EIP的Annotation注入至Pod中。 apiVersion: v1kind: Podmetadata: name: example namespace: demo annotations: yangtse.io/eip-pool: eippool-demo1spec: initContainers: - name: init image: busybox:latest command: ['timeout', '60', 'sh', '-c', "until grep -E '[0-9]+' /etc/eipinfo/allocated-ipv4-eip; do echo waiting for allocated-ipv4-eip; sleep 2; done"] volumeMounts: - name: eipinfo mountPath: /etc/eipinfo volumes: - name: eipinfo downwardAPI: items: - path: "allocated-ipv4-eip" fieldRef: fieldPath: metadata.annotations['yangtse.io/allocated-ipv4-eip'] 父主题: EIP
  • 概念 Init-Containers,即初始化容器,顾名思义容器启动的时候,会先启动可一个或多个容器,如果有多个,那么这几个Init Container按照定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到。 Init Container可以在多种K8S资源里被使用到如Deployment、DaemonSet、Job等,但归根结底都是在Pod启动时,在主容器启动前执行,做初始化工作。
  • 使用场景 部署服务时需要做一些准备工作,在运行服务的pod中使用一个init container,可以执行准备工作,完成后Init Container结束退出,再启动要部署的容器。 等待其它模块Ready:比如有一个应用里面有两个容器化的服务,一个是Web Server,另一个是数据库。其中Web Server需要访问数据库。但是当启动这个应用的时候,并不能保证数据库服务先启动起来,所以可能出现在一段时间内Web Server有数据库连接错误。为了解决这个问题,可以在运行Web Server服务的Pod里使用一个Init Container,去检查数据库是否准备好,直到数据库可以连接,Init Container才结束退出,然后Web Server容器被启动,发起正式的数据库连接请求。 初始化配置:比如集群里检测所有已经存在的成员节点,为主容器准备好集群的配置信息,这样主容器起来后就能用这个配置信息加入集群。 其它使用场景:如将pod注册到一个中央数据库、下载应用依赖等。 更多内容请参见初始容器文档参考。
  • 操作步骤 编辑initcontainer工作负载yaml文件。 vi deployment.yaml Yaml示例如下: apiVersion: apps/v1kind: Deploymentmetadata: name: mysqlspec: replicas: 1 selector: matchLabels: name: mysql template: metadata: labels: name: mysql spec: initContainers: - name: getresource image: busybox command: ['sleep 20'] containers: - name: mysql image: percona:5.7.22 imagePullPolicy: Always ports: - containerPort: 3306 resources: limits: memory: "500Mi" cpu: "500m" requests: memory: "500Mi" cpu: "250m" env: - name: MYSQL_ROOT_PASSWORD value: "mysql" 创建initcontainer工作负载。 kubectl create -f deployment.yaml 命令行终端显示如下类似信息: deployment.apps/mysql created
  • URI DELETE /v5/iot/{project_id}/devices/{device_id} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 参数说明:项目ID。获取方法请参见 获取项目ID 。 device_id 是 String 参数说明:设备ID,用于唯一标识一个设备。在注册设备时直接指定,或者由物联网平台分配获得。由物联网平台分配时,生成规则"product_id" + "" + "node_id"拼接而成。 取值范围:长度不超过128,只允许字母、数字、下划线()、连接符(-)的组合。
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 参数说明:用户Token。通过调用IAM服务 获取IAM用户Token接口获取,接口返回的响应消息头中“X-Subject-Token”就是需要获取的用户Token。简要的获取方法样例请参见 Token认证。 Instance-Id 否 String 参数说明:实例ID。物理多租下各实例的唯一标识,一般华为云租户无需携带该参数,仅在物理多租场景下从管理面访问API时需要携带该参数。您可以在IoTDA管理控制台界面,选择左侧导航栏“总览”页签查看当前实例的ID
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 device_id String 设备ID,用于唯一标识一个设备,在注册设备时由物联网平台分配获得。 command_id String 设备命令ID,用于唯一标识一条命令,在下发设备命令时由物联网平台分配获得。 service_id String 设备命令所属的设备服务ID,在设备关联的产品模型中定义。 command_name String 设备命令名称,在设备关联的产品模型中定义。 paras Object 设备执行的命令,Json格式,里面是一个个健值对,如果service_id不为空,每个健都是profile中命令的参数名(paraName);如果service_id为空则由用户自定义命令格式。设备命令示例:{"value":"1"},具体格式需要应用和设备约定。 expire_time Integer 物联网平台缓存命令的时长, 单位秒。 status String 设备命令状态,如果命令被缓存,返回PENDING, 如果命令下发给设备,返回SENT。 created_time String 命令的创建时间,"yyyyMMdd'T'HHmmss'Z'"格式的UTC字符串。 send_strategy String 下发策略, immediately表示立即下发,delay表示缓存起来,等数据上报或者设备上线之后下发。
  • 请求示例 POST https://{endpoint}/v5/iot/{project_id}/devices/{device_id}/async-commands{ "service_id" : "b1224afb-e9f0-4916-8220-b6bab568e888", "command_name" : "ON_OFF", "paras" : { "value" : "ON" }, "expire_time" : 0, "send_strategy" : "immediately"}
  • 响应示例 状态码: 200 OK { "device_id" : "c1224afb-e9f0-4916-8220-b6bab568e888", "command_id" : "b1224afb-e9f0-4916-8220-b6bab568e888", "service_id" : "Switch", "command_name" : "ON_OFF", "send_strategy" : "immediately", "paras" : { "value" : "ON" }, "expire_time" : 0, "status" : "SENT", "created_time" : "20151212T121212Z"}
  • 功能介绍 设备的产品模型中定义了物联网平台可向设备下发的命令,应用服务器可调用此接口向指定设备下发异步命令,以实现对设备的控制。平台负责将命令发送给设备,并将设备执行命令结果异步通知应用服务器。 命令执行结果支持灵活的数据流转,应用服务器通过调用物联网平台的创建规则触发条件(Resource:device.command.status,Event:update)、创建规则动作并激活规则后,当命令状态变更时,物联网平台会根据规则将结果发送到规则指定的服务器,如用户自定义的HTTP服务器,AMQP服务器,以及华为云的其他储存服务器等, 详情参考设备命令状态变更通知。 注意: 此接口适用于NB设备异步命令下发,暂不支持其他协议类型设备命令下发。 此接口仅支持单个设备异步命令下发,如需多个设备异步命令下发,请参见 创建批量任务。
  • URI POST /v5/iot/{project_id}/devices/{device_id}/async-commands 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 参数说明:项目ID。获取方法请参见 获取项目ID 。 device_id 是 String 参数说明:下发命令的设备ID,用于唯一标识一个设备,在注册设备时由物联网平台分配获得。 取值范围:长度不超过128,只允许字母、数字、下划线(_)、连接符(-)的组合。
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 参数说明:用户Token。通过调用IAM服务 获取IAM用户Token接口获取,接口返回的响应消息头中“X-Subject-Token”就是需要获取的用户Token。简要的获取方法样例请参见 Token认证。 Instance-Id 否 String 参数说明:实例ID。物理多租下各实例的唯一标识,一般华为云租户无需携带该参数,仅在物理多租场景下从管理面访问API时需要携带该参数。您可以在IoTDA管理控制台界面,选择左侧导航栏“总览”页签查看当前实例的ID。 表3 请求Body参数 参数 是否必选 参数类型 描述 service_id 否 String 参数说明:设备命令所属的设备服务ID,在设备关联的产品模型中定义。如设备需要编解码插件来解析命令,此参数为必填项。 取值范围:长度不超过64的字符串。 最大长度:64 command_name 否 String 参数说明:设备命令名称,在设备关联的产品模型中定义。如设备需要编解码插件来解析命令,此参数为必填项。 取值范围:长度不超过128的字符串。 最大长度:128 paras 是 Object 参数说明:设备执行的命令,Json格式,里面是一个个健值对,如果service_id不为空,每个健都是profile中命令的参数名(paraName);如果service_id为空则由用户自定义命令格式。设备命令示例:{"value":"1"},具体格式需要应用和设备约定, 最大32K。 最大长度:32768 expire_time 否 Integer 参数说明:物联网平台缓存命令的时长, 单位秒, 平台最多缓存20条消息(即最多缓存20条PENDING状态的命令) 该参数在send_strategy字段为delay时有效,默认缓存24小时,最大缓存2天。 最小值:0 最大值:172800 send_strategy 是 String 参数说明:下发策略,默认缓存下发。 取值范围: immediately:表示立即下发,此时expire_time无效。 delay:表示缓存下发,等数据上报或者设备上线之后下发。expire_time为0或空时,命令会默认缓存24小时。 最大长度:32
共100000条