华为云用户手册

  • 请求示例 修改节点池中的节点数为1。 { "metadata" : { "name" : "lc-it-nodepool-3" }, "spec" : { "nodeTemplate" : { "k8sTags" : { }, "taints" : [ { "key" : "status", "value" : "unavailable", "effect" : "NoSchedule" } ], "userTags" : [ ] }, "autoscaling" : { "enable" : false, "minNodeCount" : 0, "maxNodeCount" : 0, "scaleDownCooldownTime" : 0, "priority" : 0 }, "initialNodeCount" : 1 }}
  • 响应示例 状态码: 200 表示更新指定节点池成功。 { "kind" : "NodePool", "apiVersion" : "v3", "metadata" : { "name" : "lc-it-nodepool-3", "uid" : "1deef848-690d-11ea-a11b-0255ac1001b7" }, "spec" : { "initialNodeCount" : 1, "type" : "vm", "nodeTemplate" : { "flavor" : "Sit3.xlarge.2", "az" : "******", "os" : "EulerOS 2.5", "login" : { "sshKey" : "KeyPair-001" }, "rootVolume" : { "volumetype" : "SAS", "size" : 40 }, "dataVolumes" : [ { "volumetype" : "SAS", "size" : 100, "extendParam" : { "useType" : "docker" } } ], "publicIP" : { "eip" : { "bandwidth" : { } } }, "nodeNicSpec" : { "primaryNic" : { "subnetId" : "7e767d10-7548-4df5-ad72-aeac1d08bd8a" } }, "billingMode" : 0, "extendParam" : { "maxPods" : 110 }, "k8sTags" : { "cce.cloud.com/cce-nodepool" : "lc-it-nodepool-3" } }, "autoscaling" : { }, "nodeManagement" : { } }, "status" : { "phase" : "" }}
  • URI DELETE /api/v3/projects/{project_id}/clusters/{cluster_id}/nodepools/{nodepool_id} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见如何获取接口URI中参数。 cluster_id 是 String 集群ID,获取方式请参见如何获取接口URI中参数。 nodepool_id 是 String 节点池ID
  • 响应示例 状态码: 200 表示删除节点池作业下发成功。 { "kind" : "NodePool", "apiVersion" : "v3", "metadata" : { "name" : "lc-it-nodepool-79796", "uid" : "99addaa2-69eb-11ea-a592-0255ac1001bb" }, "spec" : { "type" : "vm", "nodeTemplate" : { "flavor" : "s6.large.2", "az" : "******", "os" : "EulerOS 2.5", "login" : { "sshKey" : "KeyPair-001" }, "rootVolume" : { "volumetype" : "SAS", "size" : 40 }, "dataVolumes" : [ { "volumetype" : "SAS", "size" : 100, "extendParam" : { "useType" : "docker" } } ], "publicIP" : { "eip" : { "bandwidth" : { } } }, "nodeNicSpec" : { "primaryNic" : { "subnetId" : "7e767d10-7548-4df5-ad72-aeac1d08bd8a" } }, "billingMode" : 0, "extendParam" : { "maxPods" : 110 }, "k8sTags" : { "cce.cloud.com/cce-nodepool" : "lc-it-nodepool-79796" } }, "autoscaling" : { }, "nodeManagement" : { } }, "status" : { "phase" : "Deleting", "jobId" : "3281fa02-69ee-11ea-a592-0255ac1001bb" }}
  • 功能介绍 该API用于创建一个空集群(即只有控制节点Master,没有工作节点Node)。请在调用本接口完成集群创建之后,通过创建节点添加节点。 集群管理的URL格式为:https://Endpoint/uri。其中uri为资源路径,也即API访问的路径。 调用该接口创建集群时,默认不安装ICAgent,若需安装ICAgent,可在请求Body参数的annotations中加入"cluster.install.addons.external/install":"[{"addonTemplateName":"icagent"}]"的集群注解,将在创建集群时自动安装ICAgent。ICAgent是 应用性能管理 APM的采集代理,运行在应用所在的服务器上,用于实时采集探针所获取的数据,安装ICAgent是使用应用性能管理 APM 的前提。
  • 接口约束 调用CCE接口创建集群之前,请检查是否已满足如下条件: 创建集群之前,您必须先确保已存在虚拟私有云,否则无法创建集群。若您已有虚拟私有云,可重复使用,无需重复创建。虚拟私有云为CCE集群提供一个隔离的、用户自主配置和管理的虚拟网络环境。 创建集群之前,请提前规划好容器网段和服务网段。网段参数在集群创建后不可更改,需要重新创建集群才能调整,请谨慎选择。 请确保已正确创建委托,并确保委托未被删除,委托校验失败将导致集群创建失败。建议登录CCE控制台,如没有创建委托,会提示您创建,如已经创建则无提示。 默认情况下,一个帐户只能创建5个集群(每个Region下),如果您需要创建更多的集群,请申请增加配额。
  • 请求示例 创建一个v1.19版本的CCE集群,计费模式为按需计费,集群规模为50节点,且为高可用集群。 /api/v3/projects/{project_id}/clusters{ "kind" : "Cluster", "apiVersion" : "v3", "metadata" : { "name" : "cluster" }, "spec" : { "category" : "CCE", "flavor" : "cce.s2.small", "version" : "v1.19", "hostNetwork" : { "vpc" : "030bfb19-5fa7-42ad-8a0d-c0721d268867", "subnet" : "ca964acf-8468-4735-8229-97940ef6c881" }, "containerNetwork" : { "mode" : "vpc-router", "cidr" : "10.0.0.0/16" }, "kubernetesSvcIpRange" : "10.247.0.0/16", "description" : "", "billingMode" : 0, "extendParam" : { "kubeProxyMode" : "iptables", "alpha.cce/fixPoolMask" : "25", "enterpriseProjectId" : "0" }, "authentication" : { "mode" : "rbac" }, "ipv6enable" : false }} 创建一个v1.19版本的CCE集群,计费模式为按需计费,集群规模为50节点,且为高可用集群,并在集群中安装ICAgent。 /api/v3/projects/{project_id}/clusters{ "kind" : "Cluster", "apiVersion" : "v3", "metadata" : { "name" : "cluster", "annotations" : { "cluster.install.addons.external/install" : "[{\"addonTemplateName\":\"icagent\"}]" } }, "spec" : { "category" : "CCE", "flavor" : "cce.s2.small", "version" : "v1.19", "hostNetwork" : { "vpc" : "030bfb19-5fa7-42ad-8a0d-c0721d268867", "subnet" : "ca964acf-8468-4735-8229-97940ef6c881" }, "containerNetwork" : { "mode" : "vpc-router", "cidr" : "10.0.0.0/16" }, "kubernetesSvcIpRange" : "10.247.0.0/16", "description" : "", "billingMode" : 0, "extendParam" : { "kubeProxyMode" : "iptables", "alpha.cce/fixPoolMask" : "25", "enterpriseProjectId" : "0" }, "authentication" : { "mode" : "rbac" }, "ipv6enable" : false }} 创建一个v1.19版本的CCE集群,计费模式为按需计费,集群规模为50节点,且为高可用集群,并指定自定义的节点默认安全组。 /api/v3/projects/{project_id}/clusters{ "kind" : "Cluster", "apiVersion" : "v3", "metadata" : { "name" : "cluster" }, "spec" : { "category" : "CCE", "flavor" : "cce.s2.small", "version" : "v1.19", "hostNetwork" : { "vpc" : "030bfb19-5fa7-42ad-8a0d-c0721d268867", "subnet" : "ca964acf-8468-4735-8229-97940ef6c881", "SecurityGroup" : "a4ef108c-2ec6-492f-a6c4-7b64e25ae490" }, "containerNetwork" : { "mode" : "vpc-router", "cidr" : "10.0.0.0/16" }, "kubernetesSvcIpRange" : "10.247.0.0/16", "description" : "", "billingMode" : 0, "extendParam" : { "kubeProxyMode" : "iptables", "alpha.cce/fixPoolMask" : "25", "enterpriseProjectId" : "0" }, "authentication" : { "mode" : "rbac" }, "ipv6enable" : false }}
  • 响应示例 状态码: 201 表示创建集群作业下发成功。 { "kind" : "Cluster", "apiVersion" : "v3", "metadata" : { "alias" : "cluster", "name" : "cluster", "uid" : "bce956e1-87f3-11ec-b5e5-0255ac101514", "creationTimestamp" : "2022-02-07 08:55:45.785425492 +0000 UTC", "updateTimestamp" : "2022-02-07 08:55:45.78542824 +0000 UTC", "annotations" : { "jobid" : "bd42f724-87f3-11ec-b5e5-0255ac101514", "resourceJobId" : "bce99f78-87f3-11ec-b5e5-0255ac101514" } }, "spec" : { "category" : "CCE", "type" : "VirtualMachine", "flavor" : "cce.s2.small", "version" : "v1.19.10-r0", "platformVersion" : "cce.5.0", "hostNetwork" : { "vpc" : "030bfb19-5fa7-42ad-8a0d-c0721d268867", "subnet" : "ca964acf-8468-4735-8229-97940ef6c881" }, "containerNetwork" : { "mode" : "vpc-router", "cidr" : "10.0.0.0/16", "cidrs" : [ { "cidr" : "10.0.0.0/16" } ] }, "eniNetwork" : { }, "authentication" : { "mode" : "rbac", "authenticatingProxy" : { } }, "billingMode" : 0, "kubernetesSvcIpRange" : "10.247.0.0/16", "kubeProxyMode" : "iptables", "extendParam" : { "alpha.cce/fixPoolMask" : "25", "enterpriseProjectId" : "0", "kubeProxyMode" : "iptables", "orderID" : "" } }, "status" : { "phase" : "Creating", "jobID" : "bd42f724-87f3-11ec-b5e5-0255ac101514" }}
  • API URL说明 集群管理、节点管理、节点池管理、插件管理、配额管理的URL格式为:https://Endpoint/uri。其中uri为资源路径,也即API访问的路径。 Kubernetes API、存储管理的URL格式为:https://{clusterid}.Endpoint/uri。其中{clusterid}为集群ID,uri为资源路径,也即API访问的路径。 插件管理接口调用的URL格式为:https://{clusterid}.Endpoint/uri,但{clusterid}参数仅用于 域名 ,不会被接口校验和使用。插件管理实际使用的{clusterid}参数请参考插件管理,填写在query或body体中。 {clusterid}参数对Kubernetes API、存储管理生效,对应需要调用接口访问的集群。 表1 URL中的参数说明 参数 描述 {clusterid} 集群ID,创建集群后,调用获取指定项目下的集群接口获取。 Endpoint Web服务入口点的URL,可以从终端节点(Endpoint)中获取。 uri 资源路径,也即API访问路径。从具体接口的URI模块获取,例如“获取用户Token”API的resource-path为“v3/auth/tokens”。 父主题: API
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 kind String API类型,固定值“Config”,该值不可修改。 缺省值:Config apiVersion String API版本,固定值“v1”。 preferences String 当前未使用该字段,当前默认为空。 clusters Array of Clusters objects 集群列表。 users Array of Users objects 存放了指定用户的一些证书信息和ClientKey信息。 contexts Array of Contexts objects 上下文列表。 current-context String 当前上下文,若存在publicIp(虚拟机弹性IP)时为 external; 若不存在publicIp为 internal。 表4 Clusters 参数 参数类型 描述 name String 集群名字。 若不存在publicIp(虚拟机弹性IP),则集群列表的集群数量为1,该字段值为“internalCluster”。 若存在publicIp,则集群列表的集群数量大于1,所有扩展的cluster的name的值为“externalCluster”。 cluster ClusterCert object 集群信息。 表5 ClusterCert 参数 参数类型 描述 server String 服务器地址。 certificate-authority-data String 证书授权数据。 insecure-skip-tls-verify Boolean 不校验服务端证书,在 cluster 类型为 externalCluster 时,该值为 true。 表6 Users 参数 参数类型 描述 name String 当前为固定值“user“。 user User object 存放了指定用户的一些证书信息和ClientKey信息。 表7 User 参数 参数类型 描述 client-certificate-data String 客户端证书。 client-key-data String 包含来自TLS客户端密钥文件的PEM编码数据。 表8 Contexts 参数 参数类型 描述 name String 上下文的名称。 若不存在publicIp(虚拟机弹性IP),则集群列表的集群数量为1,该字段值为“internal”。 若存在publicIp,则集群列表的集群数量大于1,所有扩展的context的name的值为“external”。 context Context object 上下文信息。 表9 Context 参数 参数类型 描述 cluster String 上下文cluster信息。 user String 上下文user信息。
  • 响应示例 状态码: 200 表示成功获取指定集群的证书。证书文件格式参见kubernetes v1.Config结构 { "kind" : "Config", "apiVersion" : "v1", "preferences" : { }, "clusters" : [ { "name" : "internalCluster", "cluster" : { "server" : "https://192.168.1.7:5443", "certificate-authority-data" : "Q2VydGlmaWN******kQgQ0VSVElGSUNBVEUtLS0tLQo=" } } ], "users" : [ { "name" : "user", "user" : { "client-certificate-data" : "LS0tLS1CRUdJTi******RklDQVRFLS0tLS0K", "client-key-data" : "LS0tLS1CRUdJTiBSU******BLRVktLS0tLQo=" } } ], "contexts" : [ { "name" : "internal", "context" : { "cluster" : "internalCluster", "user" : "user" } } ], "current-context" : "internal"}
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 Content-Type 是 String 消息体的类型(格式) 枚举值: application/json;charset=utf-8 application/json X-Auth-Token 是 String 调用接口的认证方式分为Token和AK/SK两种,如果您使用的Token方式,此参数为必填,请填写Token的值,获取方式请参见获取token。 最大长度:16384
  • 响应示例 状态码: 200 表示获取指定节点池成功。 { "kind" : "NodePool", "apiVersion" : "v3", "metadata" : { "name" : "lc-it-nodepool-79796", "uid" : "99addaa2-69eb-11ea-a592-0255ac1001bb" }, "spec" : { "type" : "vm", "nodeTemplate" : { "flavor" : "s6.large.2", "az" : "******", "os" : "EulerOS 2.5", "login" : { "sshKey" : "KeyPair-001" }, "rootVolume" : { "volumetype" : "SAS", "size" : 40 }, "dataVolumes" : [ { "volumetype" : "SAS", "size" : 100, "extendParam" : { "useType" : "docker" } } ], "publicIP" : { "eip" : { "bandwidth" : { } } }, "nodeNicSpec" : { "primaryNic" : { "subnetId" : "7e767d10-7548-4df5-ad72-aeac1d08bd8a" } }, "billingMode" : 0, "extendParam" : { "maxPods" : 110 }, "k8sTags" : { "cce.cloud.com/cce-nodepool" : "lc-it-nodepool-79796" } }, "autoscaling" : { }, "nodeManagement" : { } }, "status" : { "phase" : "Deleting", "jobId" : "3281fa02-69ee-11ea-a592-0255ac1001bb" }}
  • URI GET /api/v3/projects/{project_id}/clusters/{cluster_id}/nodepools/{nodepool_id} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见如何获取接口URI中参数。 cluster_id 是 String 集群ID,获取方式请参见如何获取接口URI中参数。 nodepool_id 是 String 节点池ID
  • 响应示例 状态码: 200 表示删除指定集群作业下发成功。 { "kind" : "Cluster", "apiVersion" : "v3", "metadata" : { "alias" : "mycluster", "name" : "mycluster", "uid" : "fc563b3c-9552-11e8-8beb-0255ac106311", "creationTimestamp" : "2018-08-01 06:20:28.81667161 +0000 UTC", "updateTimestamp" : "2018-08-01 09:23:38.944333282 +0000 UTC" }, "spec" : { "type" : "VirtualMachine", "flavor" : "cce.s1.small", "version" : "v1.7.3-r13", "description" : "new description", "hostNetwork" : { "vpc" : "cbed56e8-03e7-4304-a477-b54bef0857c3", "subnet" : "5de50062-2be2-4a52-893e-e0906e3e9c9d" }, "containerNetwork" : { "mode" : "overlay_l2", "cidr" : "172.16.0.0/16" }, "authentication" : { "mode" : "x509", "authenticatingProxy" : { } }, "billingMode" : 0 }, "status" : { "phase" : "Available", "jobID" : "e8ebf96c-956d-11e8-a949-0255ac10575d", "endpoints" : [ { "url" : "https://192.168.0.16:5443", "type" : "Internal" } ] }}
  • URI DELETE /api/v3/projects/{project_id}/clusters/{cluster_id} 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见如何获取接口URI中参数。 cluster_id 是 String 集群ID,获取方式请参见如何获取接口URI中参数。 表2 Query参数 参数 是否必选 参数类型 描述 delete_efs 否 String 是否删除SFS Turbo(极速文件存储卷), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程,默认选项) delete_eni 否 String 是否删除eni ports(原生弹性网卡), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程,默认选项) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程) delete_evs 否 String 是否删除evs(云硬盘), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程,默认选项) delete_net 否 String 是否删除elb(弹性负载均衡)等集群Service/Ingress相关资源。 枚举取值: true或block (执行删除流程,失败则阻塞后续流程,默认选项) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程) delete_obs 否 String 是否删除obs(对象存储卷), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程,默认选项) delete_sfs 否 String 是否删除sfs(文件存储卷), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程,默认选项) delete_sfs30 否 String 是否删除sfs3.0(文件存储卷3.0), 枚举取值: true或block (执行删除流程,失败则阻塞后续流程) try (执行删除流程,失败则忽略,并继续执行后续流程) false或skip (跳过删除流程,默认选项) tobedeleted 否 String 是否使用包周期集群删除参数预置模式(仅对包周期集群生效)。 需要和其他删除选项参数一起使用,未指定的参数,则使用默认值。 使用该参数,集群不执行真正的删除,仅将本次请求的全部query参数都预置到集群数据库中,用于包周期集群退订时识别用户要删除的资源。 允许重复执行,覆盖预置的删除参数。 枚举取值: true (预置模式,仅预置query参数,不执行删除)
  • 接口介绍 API分组 应用场景 应用安全接入 本部分接口提供“鉴权”以及“刷新token”两个接口。应用服务器通过调用这两个接口获取鉴权令牌,是调用其他平台API的前提,其他接口调用都需要在请求的Header中携带参数app_key和Authorization。 app_key取值与请求参数中appId相同。 Authorization的格式为Authorization: Bearer {accessToken}。 关于应用安全接入的接口一般有两种调用模式,一种是每次业务处理前都调用一下鉴权接口重新获取token,然后用token来调用其他业务接口;另外一种是应用服务器有一个有效管理机制,通过定期地刷新token,保证在调用其他业务接口前token都是有效的。 设备管理 本部分接口提供设备管理的相关功能。设备作为一种资源,设备管理接口提供了注册设备,删除设备,修改设备信息、位置信息等。查询设备信息的接口归类在“数据采集”中。 平台的接入的设备有两种,直连设备和非直连设备。 直连设备指已实现TCP/IP协议栈的设备,它可以直接与平台进行通信,常见的设备包括网关、以太网设备、NB-IoT设备等。 非直连设备指未实现TCP/IP协议栈的设备,只能基于一些简单的近场通信协议如ZigBee、ZWave、Bluetooth或者是其他的一些非IP有线方式传输协议如串口、并口等接入,此时需要一个网关设备,先让设备接入到网关,再通过网关与华为 物联网平台 通信。 设备管理的接口中提供了发现非直连设备、删除非直连设备等接口。如果您的方案中不包含非直连设备,则不需要调用这两个接口。 数据采集 数据采集接口提供设备的查询、批量设备查询、设备历史数据和历史命令的查询、设备能力(即profile中定义的设备能力)查询。 当应用服务器向平台查询设备的历史数据和历史命令时,这些数据已经存储在物联网平台上,因此与设备是否在线无关。 订阅管理 物联网平台允许应用服务器订阅其所关注的事件,每一种事件的每一次订阅都会生成一个subscriptionId,应用服务器可以使用subscriptionId对本次订阅进行查询、更新、删除等操作。 平台是通过Restful接口向应用服务器推送数据的,因此应用服务器需要开发一个Restful接口来接收推送数据,这个接口的URL也需要在订阅时提供给物联网平台。由于不同事件的推送消息结构不同,因此应用服务器可以考虑为每一种事件实现一个Restful接口。 注意事项: 关于平台上的事件种类和推送的消息样例,请参考推送通知。 https推送的前提是先在平台上上传应用服务器的CA证书。 命令下发 本部分接口提供命令的创建、删除、查询、批量创建等功能。 批量处理 目前仅支持创建批量下发缓存命令任务,您也可以查询批量任务信息。 设备组管理 应用服务器可以通过本部分接口在物联网平台上管理设备组。设备组是把设备进行分组管理。一个设备可以归属到多个设备组内。 在对设备进行某些操作时(如升级设备软固件、批量下发命令等),可通过设备组来指定要进行操作的设备。 设备升级 若需要对设备进行软固件版本升级,应用服务器可调用本部分接口为多个设备创建升级任务,升级前请确保目标版本包已经上传到物联网平台。当前仅支持对CoAP接入的设备进行软固件版本升级。
  • OpenLab现场测试 合作伙伴在物联网平台上完成产品开发(包括平台侧开发、设备侧开发和应用侧开发)后,然后才可以进行OpenLab技术认证,认证流程如下。 关键操作 说明 相关资源 成为合作伙伴 提交企业相关信息,成为合作伙伴,可以申请合作伙伴的权益。 注:如果未 注册华为账号 ,需先进行华为账号注册。 成为合作伙伴 合作方案构建 合作伙伴根据华为提供的构建指导书,提交合作方案资料。通过专业检测服务完成该方案的构建和优化。 - 合作方案技术认证 合作方案完成构建后,合作伙伴可以申请华为技术认证。通过认证的方案,将获得华为颁发的技术认证证书,同时该技术认证结果将公布到华为技术认证证书网站供合作伙伴和客户查询。 华为IoT应用认证指导(Enabled) 华为NB-IoT终端认证指导(Compatible) 华为IoT Agent Lite终端认证指导(Compatible) 华为IoT Agent Tiny终端认证指导(Compatible)
  • 认证概述 华为IoT技术认证是华为面向合作伙伴提供的IoT技术认证服务,旨在通过严谨而专业的检测技术帮助合作伙伴发现并解决自身产品的不足,缩短产品上市周期,同时联合合作伙伴向共同的客户提供经过验证的方案。通过该认证的伙伴产品将获得华为颁发的IoT技术认证证书,该证书标志着华为对双方物联网产品预集成的技术认可。 技术认证特点: 权威性:提供华为商业化平台认证服务、国家/区域重要法规认证服务、重要行业安全标准认证服务,得到许多行业客户以及运营商的认可。 全面性:完备的测试环境和专业的测试服务,从功能、性能、可靠性、安全、可维护性等为物联网产品提供端到端的软硬件能力测试,高效打造优质产品。 多渠道推广:达到一定标准的产品可以在产品中心发布,获得证书的产品不仅可以在产品中心、华为云市场发布,而且还可以享受华为提供的商业推广机会,例如展会活动、联合营销等。 方便快捷 :OpenLab认证实验室全球覆盖、线上一站式申请、线下专业人员指导,为全球合作伙伴提供贴身的技术认证服务。 华为会针对行业特点对认证产品的安全进行必要的验证,但不承担合作伙伴所属产品的安全责任。
  • 认证分类 根据产品的认证方式、认证测试内容和认证目的不同,分为Enabled和Compatible两种认证证书。 因为设备的通信技术和集成方式不同,所以将Compatible证书细化为NB-IoT Compatible、Agent Lite Compatible和Agent Tiny Compatible三种认证类型。 认证证书 认证类型 认证对象 认证测试指导 Enabled Enabled 业务应用 测试指导请参考自助测试(联通用户专用)。 Compatible NB-IoT Compatible 使用NB-IoT通信技术的设备 测试指导请参考OpenLab现场测试。 Agent Lite Compatible 集成Agent Lite SDK的设备 Agent Tiny Compatible 集成LiteOS SDK的设备 如需申请技术认证请联系oceanconnect@huawei.com。
  • 添加非直连设备 在添加非直连设备前,确认非直连设备的profile已经上传了,详见上传Profile并注册设备步骤。 在设备或网关登录成功后就可以调用HubService.addDevice(int cookie, IotaDeviceInfo deviceInfo)接口添加非直连设备。 这里非直连设备的设备固有信息是测试数据。真实情况下,网关往往需要跟具体的非直连设备交互,才能得到具体的设备固有信息。 1 2 3 4 5 6 7 8 91011121314 private void addSensor() { SharedPreferences preferences = getSharedPreferences("AgentLiteDemo", MODE_PRIVATE); if (preferences.getString("SENSORID", null) != null) { Toast.makeText(this, "The sensor is already added.", Toast.LENGTH_SHORT).show(); return; } LogUtil.i(this, TAG, "addSensor!"); int cookie; Random random = new Random(); cookie = random.nextInt(65535); IotaDeviceInfo deviceInfo = new IotaDeviceInfo("0123456test", "Huawei", "Motion", "test01", "MQTT"); HubService.addDevice(cookie, deviceInfo);} 注册广播接收器对添加设备结果进行相应处理。添加非直连设备成功后就能从广播中得到非直连设备的“deviceId”。 1 LocalBroadcastManager.getInstance(this).registerReceiver(addDeviceReceiver, new IntentFilter(HubService.TOPIC_ADDDEV_RSP)); 非直连设备添加成功后可以在“设备列表”中看到新增一条记录。
  • 编译安装程序 绑定和登录功能完成后,可以先测试一下网关是否能正常与平台对接,再进行后续功能开发。 将Android设备连到计算机上,点击“”按钮编译安装工程到Android设备上。 在Android设备上运行AgentLiteDemo,修改“平台IP”、“MQTT端口”、“HTTP端口”和“verifyCode”等值。 “平台IP”、“MQTT端口”和“HTTP端口”可以从物联网平台环境开发中心的“对接信息”界面获取。 “verifyCode”则是设备的标识,每个设备对应一个verifyCode,不可重复,所以建议使用IMEI或者MAC地址等天然的设备标识。AgentLiteDemo可以在界面上人工输入设备的verifyCode,测试时只要输入一个没有使用过的verifyCode即可。
  • 非直连设备状态更新 非直连设备添加上时,一般情况下是“离线”状态。所以在非直连设备添加成功后,或者在非直连设备上报数据前,要调用HubService.updateDeviceStatus(int cookie, String deviceId, String status, String statusDetail)进行设备状态更新。 1 2 3 4 5 6 7 8 910111213 private void updateDeviceStatus(String status, String statusDetail) { LogUtil.i(this, TAG, "updateDeviceStatus!"); int cookie; Random random = new Random(); cookie = random.nextInt(65535); SharedPreferences preferences = getSharedPreferences("AgentLiteDemo", MODE_PRIVATE); String deviceId = preferences.getString("SENSORID", null); if (deviceId != null) { HubService.updateDeviceStatus(cookie, deviceId, status, statusDetail); }} AgentLiteDemo中只添加了一个非直连设备,所以updateDeviceStatus()方法中使用的“deviceId”是直接从SharedPreferences中读取的。 注册广播接收器对非直连设备状态更新结果进行相应处理。 1 LocalBroadcastManager.getInstance(this).registerReceiver(devStatusUpdateReceiver, new IntentFilter(HubService.TOPIC_DEVSTATUS_RSP));
  • 数据上报和数据发布 设备或网关向物联网平台上报数据可以通过调用SDK的“设备服务数据上报”接口或“数据发布”接口: “设备服务数据上报”接口:deviceId,requstId和serviceId由SDK组装为消息的header;serviceProperties由SDK组装为消息的body。消息组装格式为JSON。 设备或网关登录成功后可以调用DataTransService.dataReport(int cookie, String requstId, String deviceId, String serviceId, String serviceProperties)接口上报数据。 当设备主动上报数据时,“requstId”可以为空。 当上报的数据为某个命令的响应时,“requstId”必须与下发命令中的“requstId”保持一致。requestId可以从广播中获取,请参考API文档中“设备命令接收”接口的广播参数“DATATRANS_IE_REQUESTID”的说明。 “serviceId”要与profile中定义的某个serviceId保持一致,否则无法上报数据。 “serviceProperties”实际上是一个json字符串,内容是健值对(可以有多组健值对)。每个健是profile中定义的属性名(propertyName),值就是具体要上报的内容了。 1 2 3 4 5 6 7 8 910 private void gatewayDataReport() { LogUtil.i(this, TAG, "gatewayDataReport!"); int cookie; String deviceId = GatewayInfo.getDeviceID(); Random random = new Random(); cookie = random.nextInt(65535); LogUtil.i(this, TAG, "cookie = " + cookie); DataTransService.dataReport(cookie, null, deviceId, "Storage", "{\"storage\":10240,\"usedPercent\":20}");} 注册广播接收器对网关数据上报结果进行相应处理。 1 LocalBroadcastManager.getInstance(this).registerReceiver(dataReportRsp, new IntentFilter(DataTransService.TOPIC_DATA_REPORT_RSP)); “数据发布”接口:topic固定为“/cloud/signaltrans/v2/categories/data”;“serviceData”参数作为消息体(包括header和body),SDK只进行透传,不进行格式调整和组装。 设备或网关登录成功后可以调用DataTransService. mqttDataPub(int cookie, String topic, int qos, byte[] serviceData)接口发布数据。 “Topic”是要发布数据的topic。 “Qos”是mqtt协议的一个参数。 “serviceData”实际上是一个json字符串,内容是健值对(可以有多组健值对)。每个健是profile中定义的属性名(propertyName),值就是具体要上报的内容了。 123 private void gatewayDataPub(int cookie, String topic, int qos, byte[] serviceData) { DataTransService. mqttDataPub(cookie, topic, qos, serviceData);} 注册广播接收器对网关数据上报结果进行相应处理。 1 LocalBroadcastManager.getInstance(this).registerReceiver(mqttDataPubRsp, new IntentFilter(DataTransService.TOPIC_MQTT_PUB_RSP));
  • 绑定和登录 设备或网关第一次接入IoT联接管理平台时需要进行绑定操作,从而将设备或网关与平台进行关联。开发者通过传入设备序列号以及设备信息,将设备或网关绑定到物联网平台。 设备或网关绑定成功后或重启后,需要进行登录的流程,在设备或网关成功登录物联网平台后,才可以进行其它服务操作,比如接入其他传感器,数据上报等等。如果设备或网关登录成功,那么设备或网关在平台的状态显示为已在线。 修改绑定参数。 绑定时使用的设备固有信息(如设备型号等)是从“config.properties”文件中读取的,所以需要修改./app/src/main/assets/conf目录下config.properties文件中的如下信息: “platformIP”:物联网平台的设备对接地址(MQ TTS ),可参考平台对接信息获取。 “verifyCode”(设备的标识)和必要的设备信息,包括“Manufacture”(厂商Id)、“deviceType”(设备类型)、“HardwareModel”(设备模型)和“protocolType”(协议类型),其中“manufacturerId”(厂商Id)、“deviceType”(设备类型)、“HardwareModel”(设备模型)和“protocolType”(协议类型)与Profile文件中的定义保持一致。 如果通过“设备管理服务控制台”注册设备,则“verifyCode”填写为设备注册时的“preSecret”(预置密钥)。 如果通过开发中心注册设备,则“verifyCode”填写为设备注册后返回的“nodeId”(设备标识)。 “config.properties”文件中设备固有示例: platformIP=100.100.100.100mqttPort=8883httpPort=8943verifyCode=0123456789Manufacturer=HuaweiHardwareModel=AgentLite01deviceType=GatewayprotocolType=HuaweiM2M 绑定设备。 调用API接口BindConfig.setConfig()设置绑定配置。 123456 private void startBind() { .... configBindPara(); registerBindReceiver(); ...} 1234 private void configBindPara() { BindConfig.setConfig(BindConfig.BIND_CONFIG_ADDR, AgentLiteUtil.get(ConfigName.platformIP)); BindConfig.setConfig(BindConfig.BIND_CONFIG_PORT, AgentLiteUtil.get(ConfigName.httpPort));} 注册广播接收器对设备绑定结果进行相应处理。 1 LocalBroadcastManager.getInstance(this).registerReceiver(mBindStatusReceiver, new IntentFilter(BindService.TOPIC_BINDDEVICE_RSP)); 调用API接口BindService .bind(String verifyCode, IotaDeviceInfo deviceInfo)绑定设备,主要入参为“verifyCode”(设备验证码)和必要的设备信息,包括“nodeId”(设备标识码)、“Manufacture”(厂商Id)、“deviceType”(设备类型)、“HardwareModel”(设备模型)和“protocolType”(协议类型),其中“verifyCode”的值与“nodeId”保持一致。 1 2 3 4 5 6 7 8 9101112131415 private void startBind() { LogUtil.i(this, TAG, "startBind"); String nodeId = AgentLiteUtil.get(ConfigName.verifyCode); String verifyCode = AgentLiteUtil.get(ConfigName.verifyCode); String manufacturerId = AgentLiteUtil.get(ConfigName.Manufacturer); String deviceType = AgentLiteUtil.get(ConfigName.deviceType); String model = AgentLiteUtil.get(ConfigName.HardwareModel); String protocolType = AgentLiteUtil.get(ConfigName.protocolType); IotaDeviceInfo deviceInfo = new IotaDeviceInfo(nodeId, manufacturerId, deviceType, model, protocolType); ... BindService.bind(verifyCode, deviceInfo);} 设备或网关绑定成功,后续就不需要再绑定了,除非设备或网关被删除,才需要重新绑定。 设备绑定成功会收到广播,广播内容请参考Agent Lite API接口文档中设备绑定接口的返回结果说明和demo中mBindStatusReceiver函数的处理。 配置登录参数。 登录前需要通过参数配置接口LoginConfig.setConfig()传入所需的登录信息。 “设备Id”(即网关Id, “ LOG IN_CONFIG_DEVICEID”),“appId”(“LOGIN_CONFIG_APPID”)和“密码”(“LOGIN_CONFIG_SECRET”),这些信息是都是从网关绑定成功的广播中得到的。 “平台HTTP地址”(“LOGIN_CONFIG_IOCM_ADDR”)和“MQTT地址”(“LOGIN_CONFIG_MQTT_ADDR”)一般是同一个地址,可以从绑定成功的广播中得到。一般情况下,这个地址和Agent Lite设备或网关对接的平台地址一致。 绑定成功的广播参数获取可以参考mBindStatusReceiver函数的处理。 123456789 private void configLoginPara() { LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_DEVICEID, GatewayInfo.getDeviceID()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_APPID, GatewayInfo.getAppID()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_SECRET, GatewayInfo.getSecret()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_IOCM_ADDR, GatewayInfo.getHaAddress()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_IOCM_PORT, "8943"); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_MQTT_ADDR, GatewayInfo.getHaAddress()); LoginConfig.setConfig(LoginConfig.LOGIN_CONFIG_MQTT_PORT, "8883");} 设备登录。 注册广播接收器对设备登录结果进行相应处理。 1 LocalBroadcastManager.getInstance(this).registerReceiver(LoginConnectReceiver, new IntentFilter(LoginService.TOPIC_LOGIN_CONNECTED)); 调用LoginService.login()进行直连设备登录,具体API的参数使用参考Agent Lite接口文档中设备登录接口的说明。 12345 private void startLogin() { LogUtil.i(this, TAG, "startLogin"); configLoginPara(); LoginService.login();}
  • 初始化 在发起业务前,需要先初始化Agent Lite相关资源,调用API接口BaseService.init(),初始化Agent Lite资源,具体API的参数使用参考Agent Lite API接口文档。可参考“AgentLiteMain.java”中onCreate()方法对BaseService.init()的调用。 1 BaseService.init(WORK_PATH, LOG_PATH, context); “WORK_PATH”为工作路径,不能为空。 “LOG_PATH”为打印日志路径,当“LOG_PATH”为空时,打印路径默认为工作路径,开发者也可以自己定义打印日志路径。
  • 使用必读 开发环境要求: Android系统:API_LEVEL21及以上。 工程目录结构及文件说明: 目录结构 目录 说明 Agent LiteDemo │ ├─src │ └─com │ └─huawei │ └─agentlitedemo ├─gen ├─assets │ └─conf ├─bin ├─libs │ └─armeabi └─res src 存放Agent Lite Demo代码 libs 存放Agent Lite提供的jar包和第三方jar包 armeabi 存放Agent Lite编译后的库文件和第三方库文件 conf 存放TLS证书文件、配置文件 如果开发者没有设备,可以直接在X86 Linux系统进行开发。
  • 数据上报和数据发布 设备或网关向物联网平台上报数据可以通过调用SDK的“设备服务数据上报”接口或“数据发布”接口: “设备服务数据上报”接口:pcDeviceId、pcRequstId和pcServiceId由SDK组装为消息的header;pcServiceProperties由SDK组装为消息的body。消息组装格式为JSON。 设备或网关登录成功后可以调用IOTA_ServiceDataReport接口上报数据。 当设备主动上报数据时,“pcRequstId”可以为空。 当上报的数据为某个命令的响应时,“pcRequstId”必须与下发命令中的requstId保持一致。“pcRequestId”可以从广播中获取,请参考API文档中“设备命令接收”接口的“EN_IOTA_DATATRANS_IE_REQUESTID”参数。 “pcServiceID”要与Profile中定义的某个“serviceId”保持一致,否则无法上报数据。 “pcServiceData”实际上是一个JSON字符串,内容是健值对(可以有多组健值对)。每个健是Profile中定义的属性名(propertyName),值就是具体要上报的数据。 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930 HW_VOID Gateway_DataReport(HW_CHAR **pcJsonStr){ HW_JSON json; HW_JSONOBJ hJsonObj; hJsonObj = HW_JsonObjCreate(); json = HW_JsonGetJson(hJsonObj); HW_JsonAddUint(json, (HW_CHAR*)"storage", (HW_INT)10240); HW_JsonAddUint(json, (HW_CHAR*)"usedPercent", (HW_INT)20); *pcJsonStr = HW_JsonEncodeStr(hJsonObj); Device_ServiceDataReport(g_stGateWayInfo.pcDeviceID, "Storage", pcJsonStr); //another method //Device_ServiceDataReport(pcDeviceId, "Storage", "{\"storage\":20240,\"usedPercent\":20}");}HW_INT Device_ServiceDataReport(const HW_CHAR *pcSensorDeviceID, const HW_CHAR *pcServiceId, const HW_CHAR *pcServiceProperties){ HW_CHAR aszRequestId[BUFF_MAX_LEN]; HW_GetRequestId(aszRequestId); if (HW_TRUE != g_uiLoginFlg) { //TODO e.g. resend service data HW_LOG_INF("Device_MApiMsgRcvHandler():GW discon,pcJsonStr=%s", pcServiceProperties); return HW_ERR; } IOTA_ServiceDataReport(HW_GeneralCookie(), aszRequestId, pcSensorDeviceID, pcServiceId, pcServiceProperties); return HW_OK;} 注册广播接收器对网关数据上报结果进行相应处理。广播过滤参数为“IOTA_TOPIC_DATATRANS_REPORT_RSP/{deviceId}”。 12 sprintf(acBuf, "%s/%s", IOTA_TOPIC_DATATRANS_REPORT_RSP, g_stGateWayInfo.pcDeviceID);HW_BroadCastReg(acBuf, Device_ServiceDataReportResultHandler); “数据发布”接口:topic固定为“/cloud/signaltrans/v2/categories/data”;“pbstrServiceData”参数作为消息体(包括header和body),SDK只进行透传,不进行格式调整和组装。 设备或网关登录成功后可以调用IOTA_MqttDataPub接口发布数据。 “pucTopic”为发布数据的topic。 “uiQos”为mqtt协议中的一个参数。 “pbstrServiceData”实际上是一个json字符串,内容是健值对(可以有多组健值对)。每个健是profile中定义的属性名(propertyName),值就是具体要上报的。 12345 HW_INT Device_ServiceDataPub(const HW_UCHAR *pucTopic, HW_UINT uiQos, const HW_BYTES *pbstrServiceData){ IOTA_MqttDataPub(HW_GeneralCookie(),pucTopic,uiQos,pbstrServiceData); return HW_OK;} 注册广播接收器对网关数据上报结果进行相应处理。广播过滤参数为“IOTA_TOPIC_DATATRANS_PUB_RSP”。 1 HW_BroadCastReg(IOTA_TOPIC_DATATRANS_PUB_RSP, Device_ServiceDataPubResultHandler);
  • 添加非直连设备 在添加非直连设备前,确认非直连设备的profile已经上传,详见上传Profile并注册设备步骤。 在设备或网关登录成功后,可以调用IOTA_HubDeviceAdd接口添加非直连设备。 此处非直连设备的设备固有信息是测试数据。真实情况下,网关需要与具体的非直连设备交互,才能得到非直连设备的固有信息。 1 2 3 4 5 6 7 8 9101112131415161718192021 HW_VOID AddSensors(){ ST_IOTA_DEVICE_INFO stDeviceInfo = {0}; FILE *fp = NULL; HW_CHAR szdeviceInfoFileName[BUFF_MAX_LEN] = {0}; HW_INT file_size; HW_CHAR *pcJsonStr; HW_JSONOBJ jsonObj; HW_JSON json; //get device info stDeviceInfo.pcNodeId = "SN Number_8532157"; stDeviceInfo.pcManufacturerName = "Huawei"; stDeviceInfo.pcManufacturerId = "Huawei"; stDeviceInfo.pcDeviceType = "Motion"; stDeviceInfo.pcModel = "test01"; stDeviceInfo.pcProtocolType = "Z-Wave"; IOTA_HubDeviceAdd(g_uiCookie, &stDeviceInfo); return;} 注册广播接收器对添加设备结果进行相应处理。添加非直连设备成功后就能从广播中得到非直连设备的deviceId。 1 HW_BroadCastReg(IOTA_TOPIC_HUB_ADDDEV_RSP, Device_AddResultHandler); Demo在设备添加成功一段时间后会再调用删除设备接口进行设备删除。如果再次运行sdk.out前,还没执行删除设备接口,再次添加相同设备会失败。可以修改“NodeId”的值或者调用设备删除接口把原来的设备删除掉再进行测试。 非直连设备添加成功后可以在“设备列表”中看到新增一条记录。
  • 非直连设备状态更新 非直连设备添加上时,一般情况下是“离线”状态。所以在非直连设备添加成功后,或者在非直连设备上报数据前,要调用IOTA_DeviceStatusUpdate()进行设备状态更新。 1 IOTA_DeviceStatusUpdate(g_uiCookie, g_cDeviceId, "ONLINE", "NONE"); AgentLiteDemo中只添加了一个非直连设备,所以IOTA_DeviceStatusUpdate中的g_cDeviceId直接使用全局变量。 注册广播接收器对非直连设备状态更新结果进行相应处理。 1 HW_BroadCastReg(IOTA_TOPIC_DEVUPDATE_RSP, Device_DevUpDateHandler);
共100000条