• 沒有找到結果。

SDK差异说明_设备接入 IoTDA_SDK参考_历史SDK_华为云

N/A
N/A
Protected

Academic year: 2022

Share "SDK差异说明_设备接入 IoTDA_SDK参考_历史SDK_华为云"

Copied!
506
0
0

加載中.... (立即查看全文)

全文

(1)

SDK 参考

文档版本 10

发布日期 2021-06-29

(2)

版权所有 © 华为技术有限公司 2022。 保留一切权利。

非经本公司书面许可,任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部,并不得以任何形式传 播。

商标声明

和其他华为商标均为华为技术有限公司的商标。

本文档提及的其他所有商标或注册商标,由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束,本文档中描述的全部或部分产品、服务或 特性可能不在您的购买或使用范围之内。除非合同另有约定,华为公司对本文档内容不做任何明示或暗示的声 明或保证。

由于产品版本升级或其他原因,本文档内容会不定期进行更新。除非另有约定,本文档仅作为使用指导,本文 档中的所有陈述、信息和建议不构成任何明示或暗示的担保。

(3)

目 录

1 SDK 下载... 1

2 应用侧 SDK... 3

2.1 Java SDK 使用指南...3

2.2 Python SDK 使用指南... 5

2.3 .NET SDK 使用指南... 7

2.4 Go SDK 使用指南... 9

2.5 Node.js SDK 使用指南... 11

2.6 PHP SDK 使用指南... 12

3 设备侧 SDK... 15

3.1 IoT Device SDK 介绍... 15

3.2 IoT Device SDK 使用指南(Java)... 18

3.3 IoT Device SDK 使用指南(C)... 32

3.4 IoT Device SDK 使用指南(C#)... 32

3.5 IoT Device SDK 使用指南(Android)... 32

3.6 IoT Device SDK 使用指南(Go 社区版)...32

3.7 IoT Device SDK Tiny 使用指南(C)... 32

4 历史 SDK...34

4.1 SDK 差异说明... 34

4.2 SDK 介绍...35

4.3 应用侧 Python SDK API 参考... 40

4.3.1 SDK 使用说明...40

4.3.2 API 列表... 42

4.3.3 应用安全接入... 44

4.3.3.1 鉴权... 45

4.3.3.2 刷新 token... 47

4.3.4 设备管理... 49

4.3.4.1 注册设备(验证码方式)... 49

4.3.4.2 刷新设备密钥...54

4.3.4.3 修改设备信息...58

4.3.4.4 删除设备... 63

4.3.4.5 查询设备激活状态... 65

4.3.4.6 查询设备影子...67

(4)

4.3.4.7 修改设备影子...72

4.3.5 数据采集... 75

4.3.5.1 查询单个设备信息... 75

4.3.5.2 批量查询设备信息列表... 80

4.3.5.3 查询设备历史数据... 85

4.3.5.4 查询设备影子历史数据... 89

4.3.5.5 查询设备服务能力... 92

4.3.6 订阅管理... 96

4.3.6.1 订阅平台业务数据... 96

4.3.6.2 订阅平台管理数据... 99

4.3.6.3 查询单个订阅... 101

4.3.6.4 批量查询订阅... 102

4.3.6.5 删除单个订阅... 106

4.3.6.6 批量删除订阅... 107

4.3.7 消息推送... 109

4.3.7.1 注册设备通知... 109

4.3.7.2 绑定设备通知... 113

4.3.7.3 设备信息变化通知...117

4.3.7.4 设备数据变化通知...121

4.3.7.5 批量设备数据变化通知... 123

4.3.7.6 设备服务信息变化通知... 125

4.3.7.7 删除设备通知... 127

4.3.7.8 设备消息确认通知...128

4.3.7.9 设备命令响应通知...130

4.3.7.10 设备事件通知... 133

4.3.7.11 增加设备模型通知... 135

4.3.7.12 删除设备模型通知... 137

4.3.7.13 设备影子状态变更通知... 138

4.3.7.14 软件升级状态变更通知... 140

4.3.7.15 软件升级结果变更通知... 142

4.3.7.16 固件升级状态变更通知... 144

4.3.7.17 固件升级结果变更通知... 146

4.3.7.18 NB 设备命令状态变化通知... 148

4.3.8 命令下发... 149

4.3.8.1 创建设备命令... 150

4.3.8.2 查询设备命令... 155

4.3.8.3 修改设备命令... 160

4.3.8.4 创建设备命令撤销任务... 164

4.3.8.5 查询设备命令撤销任务... 168

4.3.8.6 设备服务调用... 173

(5)

4.3.9.2 查询指定批量任务信息... 181

4.3.9.3 查询批量任务的子任务信息... 185

4.3.10 设备组管理...188

4.3.10.1 创建设备组... 189

4.3.10.2 删除设备组... 191

4.3.10.3 修改设备组... 193

4.3.10.4 查询设备组详情... 195

4.3.10.5 查询指定设备组... 197

4.3.10.6 查询指定设备组成员... 199

4.3.10.7 增加设备组成员... 201

4.3.10.8 删除设备组成员... 204

4.3.11 设备升级... 206

4.3.11.1 查询版本包列表... 206

4.3.11.2 查询指定版本包... 209

4.3.11.3 删除指定版本包... 211

4.3.11.4 创建软件升级任务... 212

4.3.11.5 创建固件升级任务... 216

4.3.11.6 查询指定升级任务结果... 220

4.3.11.7 查询指定升级任务子任务详情... 223

4.3.11.8 查询升级任务列表... 226

4.4 应用侧 JAVA SDK API 参考... 230

4.4.1 SDK 使用说明(联通用户专用)... 230

4.4.2 API 列表(联通用户专用)...234

4.4.3 应用安全接入...237

4.4.3.1 鉴权...237

4.4.3.2 刷新 token... 239

4.4.3.3 定时刷新 token...241

4.4.3.4 停止定时刷新 token... 242

4.4.4 设备管理... 242

4.4.4.1 注册设备(验证码方式)...242

4.4.4.2 刷新设备密钥... 248

4.4.4.3 修改设备信息... 252

4.4.4.4 删除设备... 257

4.4.4.5 查询设备激活状态...259

4.4.4.6 查询设备影子... 262

4.4.4.7 修改设备影子... 266

4.4.5 数据采集... 269

4.4.5.1 查询单个设备信息...269

4.4.5.2 批量查询设备信息列表... 274

4.4.5.3 查询设备历史数据...280

4.4.5.4 查询设备影子历史数据... 283

4.4.5.5 查询设备服务能力...286

(6)

4.4.6 订阅管理... 290

4.4.6.1 订阅平台业务数据...291

4.4.6.2 订阅平台管理数据...294

4.4.6.3 查询单个订阅... 296

4.4.6.4 批量查询订阅... 297

4.4.6.5 删除单个订阅... 301

4.4.6.6 批量删除订阅... 302

4.4.7 消息推送... 304

4.4.7.1 注册设备通知... 304

4.4.7.2 绑定设备通知... 308

4.4.7.3 设备信息变化通知...312

4.4.7.4 设备数据变化通知...315

4.4.7.5 批量设备数据变化通知... 317

4.4.7.6 设备服务信息变化通知... 319

4.4.7.7 删除设备通知... 321

4.4.7.8 设备消息确认通知...322

4.4.7.9 设备命令响应通知...324

4.4.7.10 设备事件通知... 326

4.4.7.11 增加设备模型通知... 328

4.4.7.12 删除设备模型通知... 330

4.4.7.13 设备影子状态变更通知... 332

4.4.7.14 软件升级状态变更通知... 333

4.4.7.15 软件升级结果变更通知... 335

4.4.7.16 固件升级状态变更通知... 337

4.4.7.17 固件升级结果变更通知... 338

4.4.7.18 NB 设备命令状态变化通知... 340

4.4.8 命令下发... 342

4.4.8.1 创建设备命令... 342

4.4.8.2 查询设备命令... 347

4.4.8.3 修改设备命令... 353

4.4.8.4 创建设备命令撤销任务... 357

4.4.8.5 查询设备命令撤销任务... 361

4.4.8.6 设备服务调用... 366

4.4.9 批量处理... 370

4.4.9.1 创建批量任务... 370

4.4.9.2 查询指定批量任务信息... 374

4.4.9.3 查询批量任务的子任务信息... 378

4.4.10 设备组管理...381

4.4.10.1 创建设备组... 382

4.4.10.2 删除设备组... 384

(7)

4.4.10.5 查询指定设备组... 391

4.4.10.6 查询指定设备组成员... 392

4.4.10.7 增加设备组成员... 395

4.4.10.8 删除设备组成员... 397

4.4.11 设备升级... 399

4.4.11.1 查询版本包列表... 399

4.4.11.2 查询指定版本包... 402

4.4.11.3 删除指定版本包... 404

4.4.11.4 创建软件升级任务... 405

4.4.11.5 创建固件升级任务... 409

4.4.11.6 查询指定升级任务结果... 414

4.4.11.7 查询指定升级任务子任务详情... 417

4.4.11.8 查询升级任务列表... 420

4.5 设备侧 Agent Lite API 参考(Java)... 424

4.5.1 使用前必读... 424

4.5.2 观察者模式... 425

4.5.3 直连设备接入...426

4.5.3.1 初始化 Agent Lite 资源... 426

4.5.3.2 释放 Agent Lite 资源... 427

4.5.3.3 绑定配置... 427

4.5.3.4 设备绑定... 428

4.5.3.5 设备接收解绑定命令... 431

4.5.3.6 登录参数配置... 432

4.5.3.7 登录信息的加密算法配置(可选)... 434

4.5.3.8 设备登录... 435

4.5.3.9 设备登出... 436

4.5.4 非直连设备管理... 437

4.5.4.1 添加设备... 437

4.5.4.2 更新设备状态... 439

4.5.4.3 删除设备... 441

4.5.5 上报设备数据...442

4.5.6 接收设备命令...443

4.5.7 发布数据... 444

4.6 设备侧 Agent Lite API 参考(Android)... 446

4.6.1 使用前必读... 446

4.6.2 直连设备接入...447

4.6.2.1 初始化 Agent Lite 资源... 447

4.6.2.2 释放 Agent Lite 资源... 448

4.6.2.3 绑定配置... 448

4.6.2.4 设备绑定... 449

4.6.2.5 设备接收解绑定命令... 453

4.6.2.6 登录参数配置... 453

(8)

4.6.2.7 登录信息的加密算法配置(可选)... 455

4.6.2.8 设备登录... 456

4.6.2.9 设备登出... 458

4.6.3 非直连设备管理... 459

4.6.3.1 添加设备... 459

4.6.3.2 更新设备状态... 462

4.6.3.3 删除设备... 465

4.6.4 上报设备数据...466

4.6.5 接收设备命令...468

4.6.6 发布数据... 469

4.7 设备侧 Agent Lite API 参考(C)...470

4.7.1 使用前必读... 470

4.7.2 开发说明... 471

4.7.2.1 广播机制... 471

4.7.2.2 Json 组件使用说明... 472

4.7.2.3 数据类型说明... 475

4.7.3 直连设备接入...477

4.7.3.1 初始化 Agent Lite 资源... 477

4.7.3.2 释放 Agent Lite 资源... 478

4.7.3.3 绑定配置... 478

4.7.3.4 设备绑定... 479

4.7.3.5 设备接收解绑定命令... 483

4.7.3.6 登录参数配置... 484

4.7.3.7 登录信息的加密算法配置(可选)... 485

4.7.3.8 设备登录... 486

4.7.3.9 设备登出... 488

4.7.4 非直连设备管理... 488

4.7.4.1 添加设备... 488

4.7.4.2 更新设备状态... 491

4.7.4.3 删除设备... 493

4.7.5 上报设备数据...495

4.7.6 接收设备命令...496

4.7.7 发布数据... 497

(9)

1 SDK 下载

物联网平台提供应用侧SDK和设备侧SDK,方便设备通过集成SDK接入到平台,应用通 过调用物联网平台的API,实现安全接入、设备管理、数据采集、命令下发等业务场 景。

资源包名 描述 下载路径

应用侧开发 Java

SDK Java SDK提供Java方法调用应用 侧API与平台通信。使用指南可 以参考Java SDK使用指南。

Java SDK

应用侧开发 .NET

SDK .NET SDK提供.NET方法调用应用 侧API与平台通信。使用指南可 以参考.NET SDK使用指南。

.NET SDK

应用侧开发 Python

SDK Python SDK提供Python方法调用 应用侧API与平台通信。使用指 南可以参考Python SDK使用指 南。

Python SDK

应用侧开发 Go

SDK Go SDK提供Go方法调用应用侧

API与平台通信。使用指南可以

参考Go SDK使用指南。

Go SDK

应用侧开发

Node.js SDK Node.js SDK提供Node.js方法调 用应用侧API与平台通信。使用 指南可以参考Node.js SDK使用 指南。

Node.js SDK

应用侧开发 PHP

SDK PHP SDK提供PHP方法调用应用 侧API与平台通信。使用指南可 以参考PHP SDK使用指南。

PHP SDK

设备侧IoT Device

SDK(Java) 设备可以通过集成IoT Device SDK(Java)接入物联网平台, Demo提供了调用SDK接口的样 例代码。使用指导请参考

IoT Device SDK使用指南

(Java)。

IoT Device SDK(Java)

(10)

资源包名 描述 下载路径 设备侧IoT Device

SDK(C) 设备可以通过集成IoT Device SDK(C)接入物联网平台, Demo 提供了调用SDK接口的样例代 码。使用指导请参考

IoT Device SDK(C)使用指南。

IoT Device SDK(C)

设备侧IoT Device

SDK(C#) 设备可以通过集成IoT Device SDK(C#)接入物联网平台, Demo 提供了调用SDK接口的样例代 码。使用指导请参考

IoT Device SDK(C#)使用指南。

IoT Device SDK(C#)

设备侧IoT Device

SDK(Android) 设备可以通过集成IoT Device SDK(Android)接入物联网平台, Demo提供了调用SDK接口的样 例代码。使用指导请参考

IoT Device SDK(Android)使用

指南。

IoT Device SDK(Android)

设备侧IoT Device

SDK(Go社区版) 设备可以通过集成IoT Device SDK(Go社区版)接入物联网平台, Demo提供了调用SDK接口的样 例代码。使用指导请参考

IoT Device SDK(Go社区版)使用

指南。

IoT Device SDK(Go社区

版)

设备侧IoT Device

SDK Tiny(C) 设备可以通过集成IoT Device SDK Tiny (C)接入物联网平台, Demo提供了调用SDK接口的样 例代码。使用指导请参考

IoT Device Tiny SDK(C)使用指

南。

IoT Device SDK Tiny (C)

(11)

2 应用侧 SDK

2.1 Java SDK使用指南 2.2 Python SDK使用指南 2.3 .NET SDK使用指南 2.4 Go SDK使用指南 2.5 Node.js SDK使用指南 2.6 PHP SDK使用指南

2.1 Java SDK 使用指南

物联网平台提供Java语言的应用侧SDK供开发者使用。本文介绍Java SDK的安装和配 置,及使用Java SDK调用应用侧API的示例。

SDK 获取和安装

步骤1 安装Java开发环境。

访问Java官网,下载并说明安装Java开发环境。

说明

华为云Java SDK支持Java JDK 1.8 及其以上版本。

步骤2 安装Maven软件

通过 Maven 安装项目依赖时使用 Java SDK 的推荐方法,首先您需要在操作系统中下 载并安装 Maven ,安装完成后您只需在 Java 项目的 pom.xml 文件加入相应的依赖 项即可。

步骤3 安装Java SDK 添加Maven依赖:

<dependency>

<groupId>com.huaweicloud.sdk</groupId>

<artifactId>huaweicloud-sdk-core</artifactId>

<version>[3.0.1-rc, 3.1.0-rc)</version>

</dependency>

(12)

<dependency>

<groupId>com.huaweicloud.sdk</groupId>

<artifactId>huaweicloud-sdk-iotda</artifactId>

<version>[3.0.1-rc, 3.1.0-rc)</version>

</dependency>

----结束

代码示例

注意

Maven依赖版本请使用版本区间,如您使用具体版本号,请使用3.0.60及以上。

IoTDACredentials认证方式在3.0.60版本引入。

以调用查询设备列表接口为例,以下代码示例向您展示使用Java SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

package com.huaweicloud.sdk.test;

import com.huaweicloud.sdk.core.auth.ICredential;

import com.huaweicloud.sdk.core.exception.ConnectionException;

import com.huaweicloud.sdk.core.exception.RequestTimeoutException;

import com.huaweicloud.sdk.core.exception.ServiceResponseException;

import com.huaweicloud.sdk.iotda.v5.*;

import com.huaweicloud.sdk.iotda.v5.auth.IoTDACredentials;

import com.huaweicloud.sdk.iotda.v5.region.IoTDARegion;

import com.huaweicloud.sdk.iotda.v5.model.*;

public class ListDevicesSolution {

// REGION_ID:如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn-north-4";如果是华南广州,

请填写"cn-south-4"

private static final String REGION_ID = "<YOUR REGION ID>";

// ENDPOINT:请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的https接入地址。

private static final String ENDPOINT = "<YOUR ENDPOINT>";

// 标准版/企业版:需自行创建Region对象

public static final Region REGION_CN_EAST_3 = new Region(REGION_ID, ENDPOINT);

public static void main(String[] args) { String ak = "<YOUR AK>";

String sk = "<YOUR SK>";

String projectId = "<YOUR PROJECTID>";

// 创建认证

ICredential auth = new IoTDACredentials() .withAk(ak)

.withSk(sk)

.withProjectId(projectId);

// 创建IoTDAClient实例并初始化

IoTDAClient client = IoTDAClient.newBuilder() .withCredential(auth)

// 基础版:请选择IoTDARegion中的Region对象

(13)

.build();

// 实例化请求对象

ListDevicesRequest request = new ListDevicesRequest();

try {

// 调用查询设备列表接口

ListDevicesResponse response = client.listDevices(request);

System.out.println(response.toString());

} catch (ConnectionException e) { e.printStackTrace();

} catch (RequestTimeoutException e) { e.printStackTrace();

} catch (ServiceResponseException e) { e.printStackTrace();

System.out.println(e.getHttpStatusCode());

System.out.println(e.getErrorCode());

System.out.println(e.getErrorMsg());

} } }

----结束

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

sk 您的华为云账号秘密访问密钥(Secret Access Key)。

projectId 项目ID。获取方法请参见 获取项目ID。

IoTDARegion.C

N_NORTH_4 请替换为您要访问的物联网平台的区域,当前物联网平台可以访 问的区域,在SDK代码IoTDARegion.java中已经定义。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤请参考地区和终端节点。

REGION_ID 如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn- north-4";如果是华南广州,请填写"cn-south-4"

ENDPOINT 请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的 https接入地址。

说明

项目源码及更多详细的使用指导请参考华为云Java软件开发工具包(Java SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试API的同 时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根据示例代码使用 SDK。

2.2 Python SDK 使用指南

物联网平台提供Python语言的应用侧SDK供开发者使用。本文介绍Python SDK的安装 和配置,及使用Python SDK调用应用侧API的示例。

(14)

SDK 获取和安装

步骤1 安装Python开发环境。

访问Python官网,下载并按说明安装Python开发环境。

说明

华为云 Python SDK 支持 Python3 及以上版本。

步骤2 安装pip工具

访问pip官网,下载并按说明安装pip工具。

步骤3 安装Python SDK

执行如下命令安装华为云Python SDK核心库以及相关服务库

# 安装核心库

pip install huaweicloudsdkcore

# 安装IoTDA服务库

pip install huaweicloudsdkiotda

----结束

代码示例

注意

IoTDACredentials认证方式在3.0.73版本引入。

以调用查询设备列表接口为例,以下代码示例向您展示使用Python SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

from huaweicloudsdkcore.exceptions import exceptions from huaweicloudsdkcore.region.region import Region from huaweicloudsdkiotda.v5 import *

from huaweicloudsdkiotda.v5.region.iotda_region import IoTDARegion from huaweicloudsdkiotda.v5.auth.iotda_credentials import IoTDACredentials if __name__ == "__main__":

ak = "<YOUR AK>"

sk = "<YOUR SK>"

project_id = "<YOUR PROJECTID>"

# region_id:如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn-north-4";如果是华南广州,请 填写"cn-south-4"

region_id = "<YOUR REGION ID>"

# endpoint:请在控制台的"总览"界面的"平台接入地址"中查看"应用侧"的https接入地址 endpoint = "<YOUR ENDPOINT>"

# 标准版/企业版:需自行创建Region对象

REGION_CN_EAST_3 = Region(region_id, endpoint)

(15)

# 创建IoTDAClient实例并初始化

# 基础版:请选择IoTDAClient中的Region对象 .with_region(IoTDARegion.CN_NORTH_4) # 标准版/企业版:需要自行创建Region对象

client = IoTDAClient.new_builder() \ .with_credentials(credentials) \ .with_region(REGION_CN_EAST_3) \ .build()

try:

# 实例化请求对象

request = ListDevicesRequest() # 调用查询设备列表接口

response = client.list_devices(request) print(response)

except exceptions.ClientRequestException as e:

print(e.status_code) print(e.request_id) print(e.error_code) print(e.error_msg)

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

sk 您的华为云账号秘密访问密钥(Secret Access Key)。

project_id 项目ID。获取方法请参见 获取项目ID。

IoTDARegion.C

N_NORTH_4 请替换为您要访问的物联网平台的区域,当前物联网平台可以访 问的区域,在SDK代码iotda_region.py中已经定义。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤请参考地区和终端节点。

region_id 如果是上海一,请填写"cn-east-3";如果是北京四,请填写"cn- north-4";如果是华南广州,请填写"cn-south-4"

endpoint 请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的 https接入地址。

----结束

更多

项目源码及更多详细的使用指导请参考华为云开发者 Python 软件开发工具包

(Python SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试 API的同时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根 据示例代码使用SDK。

2.3 .NET SDK 使用指南

物联网平台提供C#语言的应用侧SDK供开发者使用。本文介绍.NET SDK的安装和配 置,及使用.NET SDK调用应用侧API的示例。

(16)

SDK 获取和安装

步骤1 安装.NET开发环境。

访问.NET官网,下载并按说明安装.NET开发环境。

说明

华为云.NET SDK适用于:

.NET Framework 4.5 及其以上版本。

.NET Standard 2.0 及其以上版本。

C# 4.0 及其以上版本。

步骤2 使用 .NET CLI 工具安装SDK

dotnet add package HuaweiCloud.SDK.Core dotnet add package HuaweiCloud.SDK.IoTDA

----结束

代码示例

以调用查询设备列表接口为例,以下代码示例向您展示使用.NET SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

using System;

using System.Collections.Generic;

using HuaweiCloud.SDK.Core;

using HuaweiCloud.SDK.Core.Auth;

using HuaweiCloud.SDK.IoTDA;

using HuaweiCloud.SDK.IoTDA.V5;

using HuaweiCloud.SDK.IoTDA.V5.Model;

namespace ListDevicesSolution { class Program

{

static void Main(string[] args) {

const string ak = "<YOUR AK>";

const string sk = "<YOUR SK>";

// 创建认证

var auth = new BasicCredentials(ak, sk);

// 创建IoTDAClient实例并初始化 var client = IoTDAClient.NewBuilder() .WithCredential(auth)

.WithRegion(IoTDARegion.CN_NORTH_4) //net framework不支持在get请求头中有content-type

//.WithHttpConfig(new HttpConfig().WithIgnoreBodyForGetRequest(true)) .Build();

// 实例化请求对象

var req = new ListDevicesRequest {

};

try

(17)

var respStatusCode = resp.HttpStatusCode;

Console.WriteLine(respStatusCode);

}

catch (RequestTimeoutException requestTimeoutException) {

Console.WriteLine(requestTimeoutException.ErrorMessage);

}

catch (ServiceResponseException clientRequestException) {

Console.WriteLine(clientRequestException.HttpStatusCode);

Console.WriteLine(clientRequestException.ErrorCode);

Console.WriteLine(clientRequestException.ErrorMsg);

}

catch (ConnectionException connectionException) {

Console.WriteLine(connectionException.ErrorMessage);

} } } }

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

sk 您的华为云账号秘密访问密钥(Secret Access Key)。

IoTDARegion.C

N_NORTH_4 请替换为您要访问的物联网平台的区域,当前物联网平台可以访 问的区域,在SDK代码IoTDARegion.cs中已经定义。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤请参考地区和终端节点。

----结束

更多

项目源码及更多详细的使用指导请参考华为云 .Net 软件开发工具包(.NET SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试 API的同时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根 据示例代码使用SDK。

2.4 Go SDK 使用指南

物联网平台提供Go语言的应用侧SDK供开发者使用。本文介绍Go SDK的安装和配置,

及使用Go SDK调用应用侧API的示例。

SDK 获取和安装

步骤1 安装Go开发环境。

访问Go官网,下载并按说明安装Go开发环境。

说明

华为云 Go SDK 支持 Go 1.14 及以上版本。

(18)

步骤2 安装华为云Go库

go get github.com/huaweicloud/huaweicloud-sdk-go-v3

步骤3 安装依赖

go get github.com/json-iterator/go

----结束

代码示例

以调用查询设备列表接口为例,以下代码示例向您展示使用Go SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

package main import (

"fmt"

"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"

iotda "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/iotda/v5"

"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/iotda/v5/model"

region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/iotda/v5/region"

)func main() { ak := "<YOUR AK>"

sk := "<YOUR SK>"

// 创建认证

auth := basic.NewCredentialsBuilder().

WithAk(ak).

WithSk(sk).

Build()

// 创建IoTDAClient实例并初始化 client := iotda.NewIoTDAClient(

iotda.IoTDAClientBuilder().

WithRegion(IoTDARegion.CN_NORTH_4).

WithCredential(auth).

Build()) // 实例化请求对象

request := &model.ListDevicesRequest{}

// 调用查询设备列表接口

response, err := client.ListDevices(request) if err == nil {

fmt.Printf("%+v\n", response) } else {

fmt.Println(err) }

}

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

(19)

参数 说明 IoTDARegion.C

N_NORTH_4 请替换为您要访问的物联网平台的区域,当前物联网平台可以访 问的区域,在SDK代码region.go中已经定义。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤请参考地区和终端节点。

----结束

更多

项目源码及更多详细的使用指导请参考华为云开发者 Go 软件开发工具包(Go

SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试 API的同时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根 据示例代码使用SDK。

2.5 Node.js SDK 使用指南

物联网平台提供Node.js语言的应用侧SDK供开发者使用。本文介绍Node.js SDK的安装 和配置,及使用Node.js SDK调用应用侧API的示例。

SDK 获取和安装

步骤1 安装Node.js开发环境。

访问Node.js官网,下载并按说明安装Node.js开发环境。

说明

华为云 Node.js SDK 支持 Node 10.16.1 及以上版本。

步骤2 安装依赖

npm install @huaweicloud/huaweicloud-sdk-core npm install @huaweicloud/huaweicloud-sdk-iotda

----结束

代码示例

以调用查询设备列表接口为例,以下代码示例向您展示使用Node.js SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

const core = require('@huaweicloud/huaweicloud-sdk-core');

const iotda = require("@huaweicloud/huaweicloud-sdk-iotda");

const ak = "<YOUR AK>";

const sk = "<YOUR SK>";

// endpoint:请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的https接入地址。

(20)

// const endpoint = "https://iotda.cn-north-4.myhuaweicloud.com";

const endpoint = "<YOUR ENDPOINT>";

const project_id = "<YOUR PROJECT_ID>";

// 创建认证

const credentials = new core.BasicCredentials() .withAk(ak)

.withSk(sk)

.withProjectId(project_id) // 创建IoTDAClient实例并初始化

const client = iotda.IoTDAClient.newBuilder() .withCredential(credentials) .withEndpoint(endpoint) .build();

// 实例化请求对象

const request = new iotda.ListDevicesRequest();

// 调用查询设备列表接口

const result = client.listDevices(request);

result.then(result => {

console.log("JSON.stringify(result)::" + JSON.stringify(result));

}).catch(ex => {

console.log("exception:" + JSON.stringify(ex));

});

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

sk 您的华为云账号秘密访问密钥(Secret Access Key)。

endpoint 请替换为您要访问的华为云服务所在区域的终端节点。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤请参考地区和终端节点。

project_id 您要访问的华为云服务所在项目 ID ,根据你想操作的项目所属 区域选择对应的项目 ID

----结束

更多

项目源码及更多详细的使用指导请参考华为云开发者 Node.js 软件开发工具包

(Node.js SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试 API的同时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根 据示例代码使用SDK。

2.6 PHP SDK 使用指南

物联网平台提供PHP语言的应用侧SDK供开发者使用。本文介绍PHP SDK的安装和配 置,及使用PHP SDK调用应用侧API的示例。

SDK 获取和安装

(21)

访问PHP官网,下载并按说明安装PHP开发环境。

说明

华为云 PHP SDK 支持 PHP 5.6 及以上版本。

步骤2 安装composer

curl -sS https://getcomposer.org/installer | php

步骤3 安装PHP SDK

composer require huaweicloud/huaweicloud-sdk-php

步骤4 引入 Composer 的自动加载文件

require 'path/to/vendor/autoload.php';

----结束

代码示例

以调用查询设备列表接口为例,以下代码示例向您展示使用PHP SDK的主要步骤:

步骤1 创建认证。

步骤2 创建IoTDAClient实例并初始化。

步骤3 实例化请求对象。

步骤4 调用查询设备列表接口。

<?php

namespace HuaweiCloud\SDK\IoTDA\V5\Model;

require_once "vendor/autoload.php";

use HuaweiCloud\SDK\Core\Auth\BasicCredentials;

use HuaweiCloud\SDK\Core\Http\HttpConfig;

use HuaweiCloud\SDK\Core\Exceptions\ConnectionException;

use HuaweiCloud\SDK\Core\Exceptions\RequestTimeoutException;

use HuaweiCloud\SDK\Core\Exceptions\ServiceResponseException;

use HuaweiCloud\SDK\IoTDA\V5\IoTDAClient;

$ak = "<YOUR AK>";

$sk = "<YOUR SK>";

// endpoint:请在控制台的"总览"界面的"平台接入地址"中查看“应用侧”的https接入地址。

// $endpoint = "https://iotda.cn-north-4.myhuaweicloud.com";

$endpoint = "<YOUR ENDPOINT>";

$projectId = "<YOUR PROJECT_ID>";

// 创建认证

$credentials = new BasicCredentials($ak,$sk,$projectId);

// 创建IoTDAClient实例并初始化

$client = IoTDAClient::newBuilder(new IoTDAClient) ->withEndpoint($endpoint)

->withCredentials($credentials) ->build();

// 实例化请求对象

$request = new ListDevicesRequest();

try {

// 调用查询设备列表接口

$response = $client->ListDevices($request);

} catch (ConnectionException $e) { $msg = $e->getMessage();

echo "\n". $msg ."\n";

} catch (RequestTimeoutException $e) { $msg = $e->getMessage();

echo "\n". $msg ."\n";

} catch (ServiceResponseException $e) { echo "\n";

echo $e->getHttpStatusCode(). "\n";

echo $e->getErrorCode() . "\n";

(22)

echo $e->getErrorMsg() . "\n";

}echo "\n";

echo $response;

参数 说明

ak 您的华为云账号访问密钥ID(Access Key ID)。请在华为云控制 台“我的凭证 > 访问密钥”页面上创建和查看您的 AK/SK。更多 信息请查看访问密钥。

sk 您的华为云账号秘密访问密钥(Secret Access Key)。

endpoint 请替换为您要访问的华为云服务所在区域的终端节点。

您可以在控制台上查看当前服务所在区域名称,区域名称、区域 和终端节点的对应关系,具体步骤地区和终端节点。

projectId 您要访问的华为云服务所在项目 ID ,根据你想操作的项目所属 区域选择对应的项目 ID

----结束

更多

项目源码及更多详细的使用指导请参考华为云开发者 PHP 软件开发工具包(PHP

SDK)。

推荐您使用API在线调试工具API Explorer ,API Explorer 支持快速调试和检索,调试 API的同时,可以根据您的参数实时生成各种开发语言的SDK示例代码,方便您直接根 据示例代码使用SDK。

(23)

3 设备侧 SDK

3.1 IoT Device SDK介绍

3.2 IoT Device SDK使用指南(Java)

3.3 IoT Device SDK使用指南(C)

3.4 IoT Device SDK使用指南(C#)

3.5 IoT Device SDK使用指南(Android)

3.6 IoT Device SDK使用指南(Go社区版)

3.7 IoT Device SDK Tiny使用指南(C)

3.1 IoT Device SDK 介绍

为了帮助设备快速连接到物联网平台,华为提供了IoT Device SDK。支持TCP/IP协议 栈的设备集成IoT Device SDK后,可以直接与物联网平台通信。不支持TCP/IP协议栈 的设备,例如蓝牙设备、ZigBee设备等需要利用网关将设备数据转发给物联网平台,

此时网关需要事先集成IoT Device SDK。

(24)

1. 设备接入前,需创建产品(可通过控制台创建或者调用应用侧API接口创建产 品)。

2. 产品创建完毕后,需注册设备(可通过控制台注册单个设备或者使用应用侧API接 口注册设备)。

3. 设备注册完毕后,按照图中流程实现消息/属性上报、接收命令/属性/消息、OTA 升级、自定义TOPIC、泛协议接入(相关Demo)等功能。

平台提供了两种SDK,它们之间的区别如下表:

SDK种类 SDK集成场景 SDK支持的物联网

通信协议 IoT Device

SDK 面向运算、存储能力较强的嵌入式设备,例

如网关、采集器等。 MQTT

IoT Device 面向对功耗、存储、计算资源有苛刻限制的 LWM2M over

(25)

对接入设备的硬件要求:

SDK名称 RAM

容量 FLASH容

CPU频率 操作系统类型 开发语言

IoT Device

SDK > 4MB > 2MB > 200MHZ C版(Linux)、

Java版(Linux/

Windows)、C#版

(Windows)、

Android版

(Android)

C、Java、

C#、Android

IoT Device

SDK Tiny > 32KB > 128KB > 100MHZ 无特殊要求 C

详细SDK使用指南,请参考:

IoT Device SDK使用指南(C)

IoT Device SDK使用指南(Java)

IoT Device SDK使用指南(C#)

IoT Device SDK使用指南(Android)

IoT Device SDK使用指南(Go社区版)

IoT Device SDK Tiny使用指南

(26)

3.2 IoT Device SDK 使用指南(Java)

准备工作

● 开发环境要求:已经安装JDK(版本1.8以上)和maven

● 访问SDK下载页面,下载SDK,整个工程包含以下子工程:

iot-device-sdk-java:sdk代码

iot-device-demo:普通直连设备的demo代码 iot-gateway-demo:网关设备的demo代码

iot-bridge-demo:网桥的demo代码,用来演示如何将tcp设备桥接到平台 iot-device-code-generator:设备代码生成器,可以根据产品模型自动生成设备 代码

● 编译安装:进入到SDK根目录,执行mvn install

创建产品

为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、

烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。

步骤1 访问设备接入服务,单击“立即使用”进入设备接入控制台,查看MQTTS设备接入域 名,保存该地址。

步骤2 单击左侧导航栏“产品”,单击页面右上角的“创建产品”。

步骤3 根据页面提示填写参数,然后单击“立即创建”。

基本信息 所属资源空 间

平台自动将新创建的产品归属在默认资源空间下。如需归属在其他 资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请 先创建资源空间。

产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。

协议类型 选择“MQTT”。

数据格式 选择“JSON”。

厂商名称 自定义。支持中英文字符、数字、下划线(_)、连字符(-)的字符 组合。

模型定义

(27)

所属行业 选择产品模型的所属行业。

设备类型 自定义。

----结束

上传产品模型

步骤1 单击下载烟感产品模型smokeDetector,获取产品模型文件。

步骤2 找到步骤3创建的产品,单击产品进入产品详情页。

步骤3 选择“模型定义”页签,单击“上传模型文件”,上传步骤1获取的产品模型文件。

----结束

注册设备

步骤1 选择左侧导航栏“设备 > 所有设备”,单击页面右上角的“注册设备”。

步骤2 根据页面提示信息填写参数,然后单击“确定”。

参数名称 说明

所属资源空间 确保和步骤3创建的产品归属在同一个资源空间。

所属产品 选择步骤3创建的产品。

设备标识码 即nodeID,设备唯一物理标识。可自定义,由英文字母和数字组 成。

设备名称 即device_name,可自定义。

设备认证类型 选择“密钥”。

密钥 设备密钥,可自定义。若不填写密钥,物联网平台会自动生成密

钥。

设备注册成功后保存设备标识码、设备ID、密钥。

----结束

(28)

设备初始化

1. 创建设备时,需要写入在注册设备时获取的设备ID、密码,以及1中获取的设备对 接信息,注意格式为ssl://域名信息:端口号

IoTDevice device = new IoTDevice("ssl://iot-mqtts.cn-north-4.myhuaweicloud.com:8883", "5e06bfee334dd4f33759f5b3_demo", "mysecret", file);

2. 建立连接。调用init接口,该接口是阻塞调用,如果建立连接成功会返回0。

if (device.init() != 0) { return;

}

如果连接成功就会打印:

2019-12-26 11:02:02 INFO MqttConnection:88 - Mqtt client connected. address :ssl://iot-mqtts.cn- north-4.myhuaweicloud.com:8883

3. 创建设备并连接成功后,可以开始使用设备进行通讯。调用IoT Device 的 getClient接口获取设备客户端,客户端提供了消息、属性、命令等通讯接口。

消息上报

消息上报是指设备向平台上报消息。

1. 从device中获取客户端,调用IoTDevice的getClient接口即可获取到客户端。

2. 调用客户端的reportDeviceMessage接口来上报设备消息。在MessageSample这 个例子中我们周期性上报消息:

while (true) {

device.getClient().reportDeviceMessage(new DeviceMessage("hello"), new ActionListener() { @Override

public void onSuccess(Object context) { }

@Override

public void onFailure(Object context, Throwable var2) { log.error("reportDeviceMessagefail: "+var2);

} });

Thread.sleep(10000);

}

3. 修改MessageSample类的main函数,替换自己的设备参数后运行 MessageSample类,查看日志打印看到连接成功和发送消息的打印:

2019-12-26 11:02:02 INFO MqttConnection:88 - Mqtt client connected. address :ssl://iot-mqtts.cn- north-4.myhuaweicloud.com:8883

2019-12-26 11:02:02 INFO MqttConnection:214 - publish message topic = $oc/devices/

test_testDevice/sys/messages/up, msg = {"name":null,"id":null,"content":"hello","object_device_id":null}

4. 在设备接入控制台,选择“设备 > 所有设备”-查看设备是否在线。

5. 选择对应设备,单击“查看”,在设备详情页面启动设备消息跟踪。

(29)

6. 平台收到了设备的消息。

注:消息跟踪会有一定的延时,如果没有看到数据,请等待后刷新。

属性上报

打开PropertySample类,这个例子中会定时的上报alarm、temperature、humidity、

smokeConcentration这四个属性。

//定时上报属性 while (true) {

Map<String ,Object> json = new HashMap<>();

Random rand = new Random();

//按照物模型设置属性 json.put("alarm", alarm);

json.put("temperature", rand.nextFloat()*100.0f);

json.put("humidity", rand.nextFloat()*100.0f);

json.put("smokeConcentration", rand.nextFloat() * 100.0f);

ServiceProperty serviceProperty = new ServiceProperty();

serviceProperty.setProperties(json);

serviceProperty.setServiceId("smokeDetector");//serviceId要和物模型一致

device.getClient().reportProperties(Arrays.asList(serviceProperty), new ActionListener() { @Override

public void onSuccess(Object context) { log.info("pubMessage success" );

}

@Override

public void onFailure(Object context, Throwable var2) { log.error("reportProperties failed" + var2.toString());

} });

Thread.sleep(10000);

} }

修改PropertySample的main函数后直接运行PropertySample类,查看日志看到发送成 功的打印

在平台设备详情页面可以看到最新上报的属性值:

(30)

属性读写

调用客户端的setPropertyListener方法来设置属性回调接口。在PropertySample这个 例子中,我们实现了属性读写接口。

写属性处理:实现了alarm属性的写操作,其他属性不支持写操作。

读属性处理:将本地属性值按照接口格式进行拼装。

device.getClient().setPropertyListener(new PropertyListener() { //处理写属性

@Override

public void onPropertiesSet(String requestId, List<ServiceProperty> services) { //遍历service

for (ServiceProperty serviceProperty: services){

log.info("OnPropertiesSet, serviceId = " + serviceProperty.getServiceId());

//遍历属性

for (String name :serviceProperty.getProperties().keySet()){

log.info("property name = "+ name);

log.info("set property value = "+ serviceProperty.getProperties().get(name));

if (name.equals("alarm")){

//修改本地值

alarm = (Integer) serviceProperty.getProperties().get(name);

} } }

//修改本地的属性值

client.respondPropsSet(requestId, IotResult.SUCCESS);

}

//处理读属性 @Override

public void onPropertiesGet(String requestId, String serviceId) { log.info("OnPropertiesGet " + serviceId);

Map<String ,Object> json = new HashMap<>();

Random rand = new Random();

json.put("alarm", alarm);

json.put("temperature", rand.nextFloat()*100.0f);

json.put("humidity", rand.nextFloat()*100.0f);

json.put("smokeConcentration", rand.nextFloat() * 100.0f);

ServiceProperty serviceProperty = new ServiceProperty();

serviceProperty.setProperties(json);

serviceProperty.setServiceId("smokeDetector");

client.respondPropsGet(requestId, Arrays.asList(serviceProperty));

}

(31)

1. 属性读写接口需要调用respondPropsGet和respondPropsSet接口来上报操作结 果。

2. 如果设备不支持平台主动到设备读,onPropertiesGet接口可以空实现 运行PropertySample类,然后在平台上设备影子页面查看当前alarm属性值为1:

我们把alarm属性修改为0:

查看设备侧日志,看到设备收到属性设置,alarm被修改为0:

命令下发

设置命令监听器用来接收平台下发的命令,在回调接口里,需要对命令进行处理,并 上报响应。

在CommandSample例子中实现了命令的处理,收到命令后仅进行打印,然后调用 respondCommand上报响应。

device.getClient().setCommandListener(new CommandListener() { @Override

public void onCommand(String requestId, String serviceId, String commandName, Map<String, Object> paras) {

log.info("onCommand, serviceId = " +serviceId);

log.info("onCommand , name = " + commandName);

log.info("onCommand, paras = " + paras.toString());

//处理命令 //发送命令响应

client.respondCommand(requestId, new CommandRsp(0));

} });

(32)

直接运行CommandSample类,然后在平台上下发命令,命令的serviceId填 smokeDetector、命令名填ringAlarm、参数携带duration为整数20。

查看日志,看到设备收到命令并上报了响应:

面向物模型编程

前面介绍了直接调用设备客户端的接口和平台进行通讯的方法,这种方式比较灵活,

但用户需要妥善处理每一个接口,实现比较复杂。

SDK提供了一种更简单的方式,即面向物模型编程。面向物模型编程指基于SDK提供的 物模型抽象能力,设备代码按照物模型定义设备服务,然后可以直接访问设备服务

(即调用设备服务的属性读写接口),SDK就能自动和平台通讯,完成属性的同步和 命令的调用。

相比直接调用客户端接口和平台进行通讯,面向物模型编程更简单,它简化了设备侧 代码的复杂度,让设备代码只需要关注业务,而不用关注和平台的通讯过程。这种方 式适合多数场景。

SmokeDetector例子演示了如何面向物模型编程:

1. 按照物模型定义服务类和服务的属性(如果有多个服务,则需要定义多个服务 类):public static class SmokeDetectorService extends AbstractService {

//按照设备模型定义属性,注意属性的name和类型需要和模型一致,writeable表示属性知否可写,

name指定属性名

@Property(name = "alarm", writeable = true) int smokeAlarm = 1;

@Property(name = "smokeConcentration", writeable = false) float concentration = 0.0f;

@Property(writeable = false) int humidity;

@Property(writeable = false) float temperature;

用@Property注解来表示是一个属性,可以用name指定属性名,如果不指定则使 用字段名。

属性可以加上writeable来控制权限,如果属性只读,则加上writeable = false,

如果不加,默认认为可读写。

2. 定义服务的命令。设备收到平台下发的命令时,SDK会自动调用这里定义的命 令。

接口入参和返回值的类型是固定的不能修改,否则会出现运行时错误。

这里定义的是一个响铃报警命令,命令名为ringAlarm。

//定义命令,注意接口入参和返回值类型是固定的不能修改,否则会出现运行时错误 @DeviceCommand(name = "ringAlarm")

public CommandRsp alarm(Map<String, Object> paras) { int duration = (int) paras.get("duration");

log.info("ringAlarm duration = " + duration);

(33)

– 当设备收到平台下发的查询属性以及设备上报属性时,会自动调用getter方 法。getter方法需要读取设备的属性值,可以实时到传感器读取或者读取本地 的缓存

– 当设备收到平台下发的设置属性时,会自动调用setter方法。setter方法需要 更新设备本地的值。如果属性不支持写操作,setter保留空实现。

//setter和getter接口的命名应该符合java bean规范,sdk会自动调用这些接口 public int getHumidity() {

//模拟从传感器读取数据

humidity = new Random().nextInt(100);

return humidity;

}

public void setHumidity(int humidity) { //humidity是只读的,不需要实现 }

public float getTemperature() { //模拟从传感器读取数据

temperature = new Random().nextInt(100);

return temperature;

}

public void setTemperature(float temperature) { //只读字段不需要实现set接口

}

public float getConcentration() { //模拟从传感器读取数据

concentration = new Random().nextFloat()*100.0f;

return concentration;

}

public void setConcentration(float concentration) { //只读字段不需要实现set接口

}

public int getSmokeAlarm() { return smokeAlarm;

}

public void setSmokeAlarm(int smokeAlarm) { this.smokeAlarm = smokeAlarm;

if (smokeAlarm == 0){

log.info("alarm is cleared by app");

} }

4. 在main函数中创建服务实例并添加到设备。

//创建设备

IoTDevice device = new IoTDevice(serverUri, deviceId, secret);

//创建设备服务

SmokeDetectorService smokeDetectorService = new SmokeDetectorService();

device.addService("smokeDetector", smokeDetectorService);

if (device.init() != 0) { return;

}

5. 开启周期上报:

//启动自动周期上报

smokeDetectorService.enableAutoReport(10000);

(34)

备注:如果不想周期上报,也可以调用firePropertiesChanged接口手工触发上 报。

直接运行SmokeDetector类,查看日志在上报属性:

在平台侧查看设备影子:

在平台上修改属性alarm,查看设备日志收到属性设置:

在平台下发ringAlarm命令:

查看设备日志看到ringAlarm命令被调用,并且上报了响应:

使用代码生成器

sdk提供了设备代码生成器,用户只需要提供产品模型文件,就能自动生成设备代码框 架。代码生成器可以解析设备模型文件,然后对模型里定义的每个服务,生成对应的 service类,然后生成一个设备主类,在main函数中创建设备并注册设备服务实例。

使用代码生成器生成设备代码的步骤:

1. 下载huaweicloud-iot-device-sdk-java工程,解压缩后进入huaweicloud-iot- device-sdk-java目录执行“mvn install”。

2. 执行完成会在iot-device-code-generator的target下生成可执行jar包。

3. 将产品模型文件保存到本地,比如我的模型文件

“smokeDetector_cb097d20d77b4240adf1f33d36b3c278_smokeDetector.zip”

放到D盘。

4. 访问 iot-device-code-generator\target\目录,执行“java -jar iot-device-code- generator-0.2.0-with-deps.jar D:

(35)

5. 在huaweicloud-iot-device-sdk-java目录下会生成generated-demo包。

至此,设备代码已经生成。

编译运行生成的代码:

1. 访问“huaweicloud-iot-device-sdk-java\generated-demo”,执行“mvn install”,在target下生成jar包。

2. 执行java -jar target\iot-device-demo-ganerated-0.2.0-with-deps.jar 5e06bfee334dd4f33759f5b3_demo *****

两个参数分别为设备id和密码,运行生成的demo

修改扩展生成的代码:

生成的代码已经完成了服务的定义和注册,用户只需要进行少量的修改即可。

1. 命令接口,需要添加具体的实现逻辑

(36)

2. getter方法,生成的代码是返回随机值,需要改为从传感器读取数据。

3. setter方法,生成的代码只完成了属性的修改保存,还需要添加真实的逻辑处理,

比如向传感器下发指令。

如何开发网关

网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息 转发的功能。SDK提供了AbstractGateway抽象类来简化网关的实现。该类提供了子设 备管理功能,需要从平台获取子设备信息并保存(需要子类提供子设备持久化接 口)、子设备下行消息转发功能(需要子类实现转发处理接口)、以及上报子设备列 表、上报子设备属性、上报子设备状态、上报子设备消息等接口。

● 使用AbstractGateway类

继承该类,在构造函数里提供子设备信息持久化接口,实现其下行消息转发的抽 象接口:

public abstract void onSubdevCommand(String requestId, Command command);

public abstract void onSubdevPropertiesSet(String requestId, PropsSet propsSet);

public abstract void onSubdevPropertiesGet(String requestId, PropsGet propsGet);

public abstract void onSubdevMessage(DeviceMessage message);

iot-gateway-demo代码介绍

工程iot-gateway-demo基于AbstractGateway实现了一个简单的网关,它提供 tcp设备接入能力。关键类:

SimpleGateway:继承自AbstractGateway,实现子设备管理和下行消息转发 StringTcpServer:基于netty实现一个TCP server,本例中子设备采用TCP协议,

并且首条消息为鉴权消息

SubDevicesFilePersistence:子设备信息持久化,采用json文件来保存子设备信 息,并在内存中做了缓存

Session:设备会话类,保存了设备id和TCP的channel的对应关系

SimpleGateway类 添加或删除子设备处理

添加子设备:AbstractGateway的onAddSubDevices接口已经完成了子设备信息 的保存。我们不需要再增加额外处理,因此SimpleGateway不需要重写

onAddSubDevices接口

删除子设备:我们不仅需要修改持久化信息,还需要断开当前子设备的连接。所 以我们重写了onDeleteSubDevices接口,增加了拆链处理,然后调用父类的 onDeleteSubDevices。

(37)

for (DeviceInfo subdevice : subDevicesInfo.getDevices()) {

Session session = nodeIdToSesseionMap.get(subdevice.getNodeId());

if (session != null) {

if (session.getChannel() != null) { session.getChannel().close();

channelIdToSessionMap.remove(session.getChannel().id().asLongText());

nodeIdToSesseionMap.remove(session.getNodeId());

} } }

return super.onDeleteSubDevices(subDevicesInfo);

}

● 下行消息处理

网关收到平台下行消息时,需要转发给子设备。平台下行消息分为三种:设备消 息、属性读写、命令。

– 设备消息:这里我们需要根据deviceId获取nodeId,从而获取session,从 session里获取channel,就可以往channel发送消息。在转发消息时,可以根 据需要进行一定的转换处理。

@Override

public void onSubdevMessage(DeviceMessage message) {

//平台接口带的都是deviceId,deviceId是由nodeId和productId拼装生成的,即 //deviceId = productId_nodeId

String nodeId = IotUtil.getNodeIdFromDeviceId(message.getDeviceId());

if (nodeId == null) { return;

}

//通过nodeId获取session,进一步获取channel Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) {

log.error("subdev is not connected " + nodeId);

return;

}

if (session.getChannel() == null){

log.error("channel is null " + nodeId);

return;

}

//直接把消息转发给子设备

session.getChannel().writeAndFlush(message.getContent());

log.info("writeAndFlush " + message);

}

– 属性读写:

属性读写包括属性设置和属性查询。

属性设置:

@Override

public void onSubdevPropertiesSet(String requestId, PropsSet propsSet) { if (propsSet.getDeviceId() == null) {

return;

}

String nodeId = IotUtil.getNodeIdFromDeviceId(propsSet.getDeviceId());

if (nodeId == null) { return;

}

Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) { return;

}

(38)

//这里我们直接把对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(propsSet));

//为了简化处理,我们在这里直接回响应。更合理做法是在子设备处理完后再回响应 getClient().respondPropsSet(requestId, IotResult.SUCCESS);

log.info("writeAndFlush " + propsSet);

}

属性查询:

@Override

public void onSubdevPropertiesGet(String requestId, PropsGet propsGet) { //不建议平台直接读子设备的属性,这里直接返回失败

log.error("not supporte onSubdevPropertiesGet");

deviceClient.respondPropsSet(requestId, IotResult.FAIL);

}

– 命令:处理流程和消息类似,实际场景中可能需要不同的编解码转换。

@Override

public void onSubdevCommand(String requestId, Command command) { if (command.getDeviceId() == null) {

return;

}

String nodeId = IotUtil.getNodeIdFromDeviceId(command.getDeviceId());

if (nodeId == null) { return;

}

Session session = nodeIdToSesseionMap.get(nodeId);

if (session == null) { return;

}

//这里我们直接把command对象转成string发给子设备,实际场景中可能需要进行一定的编解 码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(command));

//为了简化处理,我们在这里直接回命令响应。更合理做法是在子设备处理完后再回响应 getClient().respondCommand(requestId, new CommandRsp(0));

log.info("writeAndFlush " + command);

}

● 上行消息处理

上行处理在StringTcpServer的channelRead0接口里。如果会话不存在,需要先创 建会话:

如果子设备信息不存在,这里会创建会话失败,直接拒绝连接

@Override

protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception { Channel incoming = ctx.channel();

log.info("channelRead0" + incoming.remoteAddress() + " msg :" + s);

//如果是首条消息,创建session //如果是首条消息,创建session

Session session = simpleGateway.getSessionByChannel(incoming.id().asLongText());

if (session == null) { String nodeId = s;

session = simpleGateway.createSession(nodeId, incoming);

//创建会话失败,拒绝连接

(39)

} }

如果会话存在,则进行消息转发:

else {

//如果需要上报属性则调用reportSubDeviceProperties DeviceMessage deviceMessage = new DeviceMessage(s);

deviceMessage.setDeviceId(session.getDeviceId());

simpleGateway.reportSubDeviceMessage(deviceMessage, null);

}

到这里,网关的关键代码介绍完了,其他的部分看源代码。整个demo是开源的,

用户可以根据需要进行扩展。比如修改持久化方式、转发中增加消息格式的转 换、实现其他子设备接入协议。

iot-gateway-demo的使用 a. 在平台上为网关注册开户。

b. 修改StringTcpServer的main函数,替换构造参数,然后运行该类。

simpleGateway = new SimpleGateway(new SubDevicesFilePersistence(), "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883",

"5e06bfee334dd4f33759f5b3_demo", "mysecret");

c. 在平台上看到该网关在线后,添加子设备。

此时网关上日志打印:

2020-02-11 09:42:17 INFO SubDevicesFilePersistence:75 - add subdev: ffff d. 运行TcpDevice类,建立连接后,输入子设备的nodeId。

e. 在平台上看到子设备上线。

f. 子设备上报消息

(40)

查看日志看到上报成功

g. 查看消息跟踪

在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备 发送数据,等待片刻后看到消息跟踪:

3.3 IoT Device SDK 使用指南(C)

IoT Device SDK(C)提供设备接入华为云IoT物联网平台的C版本的SDK,提供设备和 平台之间通讯能力,以及设备服务、网关服务、OTA等高级服务,并且针对各种场景 提供了丰富的demo代码。相关集成指导请参考IoT Device SDK(C)使用指南。

3.4 IoT Device SDK 使用指南(C#)

IoT Device SDK(C#)提供设备接入华为云IoT物联网平台的C#版本的SDK,提供设备 和平台之间通讯能力,以及设备服务、OTA等高级服务,并且针对各种场景提供了丰 富的demo代码。相关集成指导请参考IoT Device SDK(C#)使用指南。

3.5 IoT Device SDK 使用指南(Android)

IoT Device SDK(Android)提供设备接入华为云IoT物联网平台的Android版本的 SDK,提供设备和平台之间通讯能力,以及设备服务、OTA等高级服务,并且针对各种 场景提供了丰富的demo代码。相关集成指导请参考IoT Device SDK(Android)使用 指南。

3.6 IoT Device SDK 使用指南(Go 社区版)

Go语言版的SDK提供了跟平台基础的通信能力,由开源社区提供,如果使用有问题请 在github上提issue。

3.7 IoT Device SDK Tiny 使用指南(C)

(41)

物联网平台以及数据上报和命令接收等功能,相关集成指导请参见端云互通组件开发 指南。

说明

IoT Device SDK Tiny可以运行于无linux操作系统的设备,也可以被模组集成,但是不提供网关 服务。

(42)

4 历史 SDK

这里的历史SDK指的是SDK介绍章节所描述的所有SDK,新版SDK指的是SDK下载章节 所描述的设备侧SDK和应用侧SDK。为方便描述,后续统一将老版本称为v3版本,当前 版本称为v5版本。

4.1 SDK差异说明 4.2 SDK介绍

4.3 应用侧Python SDK API参考 4.4 应用侧JAVA SDK API参考 4.5 设备侧Agent Lite API参考(Java) 4.6 设备侧Agent Lite API参考(Android) 4.7 设备侧Agent Lite API参考(C)

4.1 SDK 差异说明

为提供更好的SDK性能、易用性、丰富性,我们全新开放了新版设备侧SDK。新版SDK 引入了物模型的概念,新增了消息、属性、设备影子,自定义Topic等功能,相关概念 解释请参考名词解释。

SDK差异参考下表:

使用 旧版SDK 新版SDK

支持版本

不同 ● 提供应用侧Java版、Python版 SDK。

● 提供设备侧C版、Java版、

Android版SDK(agentlite)。

● 提供应用侧Java版、C#版、

Python版SDK。

● 提供设备侧Java版、C版SDK

(iot-device-sdk)。

应用侧SDK 需用旧域名接入(内置了旧域名的 证书,旧域名及端口为:iot-api.cn- north-4.myhuaweicloud.com:

8743)

用新域名接入(内置了新域名的 证书,新域名为:iotda.cn- north-4.myhuaweicloud.com)

參考文獻

相關文件

School Address WAN CHAI ROAD, WAN CHAI, HONG

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.

主要指标 单位 参考期.