设备影子 | 学习笔记

简介: 快速学习 设备影子

开发者学堂课程【物联网平台开发全栈教程设备影子学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/562/detail/7697


设备影子


内容介绍

一、设备影子

二、应用场景

三、设备影子 JSON 详解

四、设备影子数据流


一、设备影子

设备影子是阿里云 IoT 平台保证数据能够可靠传输的方法,起到补充 MQTT 作用。因为不支持 MQTT 中的 QoS2等级,QoS2是保障设备必须到达一次,所以引出了设备影子。

设备影子的学习安排首先是从设备影子的文档入口,了解设备影子是什么,使用场景,再在基础版中新建一个设备,通过 PC 端个人电脑模拟一个 MQTTnet 来订阅和发布消息到平台。

设备影子

可以点进产品文档,在设备端开发指南中可以找到设备影子相关文档。

1、什么是设备影子

设备影子是一个 JSON 文档,就是在 IoT 服务器上每一个设备都有唯一的 JSON 文档,用于存储设备上报状态、应用程序期望状态信息。JSON 文档描述了在这个设备当前最新状态以及最新状态的上报时间,也描述了平台下发给当前设备某一个属性的希望数值,而且 JSON 文档中也会告诉设备是否成功执行希望数值的状态,设备可以去读这个 JSON 文档来解析平台,比如说这个设备可以调整自己的温度,就可以读一下 JSON 文档,了解到平台希望当前调整温度为多少,同时也可以主动上报平台当前的温度值。

(1)、每个设备有且只有一个设备影子,就像有真实的设备存在才会有影子。设备可以通过 MQTT 获取和设置设备影子以此来同步状态,该同步可以是影子同步给设备,也可以是设备同步给影子。

(2)、应用程序通过物联网平台的 SDK 获取和设置设备影子,获取设备最新状态或者下发期望状态给设备。


二、应用场景

场景一:

由于网络不稳定,设备频繁上下线。应用程序发出需要获取当前的设备状态请求时,设备掉线,无法获取设备状态,但下一秒设备又连接成功,应用程序无法正确发起请求。

使用设备影子机制存储设备最新状态,一旦设备状态产生变化,设备会将状态同步到设备影子。应用程序在请求设备当前状态时,只需要获取影子中的状态即可,不需要关心设备是否在线。

场景二:

如果设备网络稳定,很多应用程序请求获取设备状态,设备需要根据请求响应多次,即使响应的结果是一样的,设备本身处理能力有限,无法负载被请求多次的情况。

使用设备影子机制,设备只需要主动同步状态给设备影子一次,多个应用程序请求设备影子获取设备状态,即可获取设备最新状态,做到应用程序和设备的解耦。

场景三:

设备网络不稳定,导致设备频繁上下线,应用程序发送控制指令给设备时,设备掉线,指令无法下达到设备。

(1)、通过 QoS=1或者2实现,但是该方法对于服务端的压力比较大,一般不建议使用。通常通信中 QoS 值为0,而且不管对服务器还是设备压力都非常小。

(2)、使用设备影子机制,应用程序发送控制指令,指令携带时间戳保存在设备影子中。当设备掉线重连时,获取指令并根据时间戳确定是否执行。

设备真实掉线,指令发送失败。设备再上线时,设备影子功能通过指令加时间戳的模式,保证设备不会执行过期指令。


三、设备影子 JSON 详解

平台中设备影子 JSON 的文档示例可以了解一下,重要的是 JSON 属性说明中的属性,如 timestamp 属性为影子文档的最新更新时间,即每个影子文档上面的时间戳和其他属性,这里需要注意 version 版本要递增,否则会出错,所以可以通过发布版本号大的不要版本小的,来确保版本号是最新的。


四、设备影子数据流

在设备影子数据流中主要围绕了数据流进行案例说明,下面也主要参考两个 Topic 实现数据流转实现案例讲解。

1、前期准备

物联网平台为每个设备预定义了两个 Topic 实现数据流转,定义的 Topic 都以固定格式呈现。

topic/shadow/update/${productKey}/${deviceName}

设备和应用程序发布消息到此 Topic,物联网平台收到该 topic 的消息后,将消息中的状态更新到设备影子中。

topic/shadow/get/${productKey}/${deviceName}

设备影子更新状态 update 到该 Topic,设备 get 去订阅,读此 Topic 的消息。

准备模板:

推送 TOPIC 模板为:

"method": "update",

"state":{

"reported": {

"IndoorTemperature": +15.5

},

"version": 1

}

清空期望值模板为:

{

"method": "update",

"state'": {

"desired":"nul"

},

"version": 4

}

设备获取影子模板为:
{

“method”:”get”

}

在下面的案例讲解中可以参考设备影子数据流中的案例说明。

2、案例演练

首先在平台产品管理中已经新建了 Test2的基础版,但基础版是没有提前约定好的属性的,所以直接看设备。这里设备中也已经新建设备 Test2

根据 Test2productKey deviceName 用工具计算出域名,ClientID UserName

依照以上信息在 MQTT.fx 进行填写后 Connect 连接,连接成功后回到平台中会发现设备状态会变为在线,然后查看设备影子,进行刷新查看则此时的设备影子就是目前在平台上最新的 JSON 文件,version 版本为8

接下来进行上报 JSON 的最新状态,需要按照格式写代码进行上报,方法为 update 更新,更新了IndoorTemperature

假设当前温度为47,版本号为1

此时需要订阅一下服务器返回的 TOPIC

订阅成功后进行 publish 推送,会发现 Subscribe error 报错为409409错误表示影子版本冲突,是因为此时平台版本号推送到8,而此处版本号为1,版本比8低,如果改推送版本为9,再次进行 publish 推送则成功。

刷新平台中设备影子查看,发现成功读取影子温度为47,而即使 Disconnect 掉线了,app 也可以通过 api 来读取影子文件,timesamp 时间戳是唯一的

如果 app 要设置当前温度为-3°,则点击更新影子,在 desired 中添加期望值为-3

并且修改上报温度为33,执行版本为11,点击 publish 推送成功,回到平台查看发现版本号成功为11,温度期望值为-3,当前温度为33

如果已经订阅了设备的话会收到平台的提示,像之前上报的47一样,提示当前平台温度为47,期望温度为-3,版本号为10

但假设设备掉线了,平台又发了期望值为-6,而设备掉线了收不到期望值。这里 Publish 先连接一下,连接成功后 get 方法请求影子,订阅后点击 Publish 推送,此时请求后通过提示得知平台 温度期望值为-6

所以假设此时温度调节到了-5,因为条件温度需要时间所以这里直接赋值,版本号要使用最新为13,之后点击推送

回到平台刷新发现已经达到-5度,但还是期望值是-6,要告诉平台有没有收到 desired 值为-6,像刚才已经收到了,而收到后就需要清空期望值,否则下次 get 请求期望值还是-6,要告诉服务器已经接收到消息,所以要执行清空代码,版本为14,点击 publish 推送。

提示 success 推送成功。再回到平台设备影子刷新,会发现已经没有 desired,如图:

image.png

总结:设备影子是针对 app 开发和设备开发,是唯一的。不管是谁都可以读设备影子当前是什么,然后可以通过影子里面的字段进行解析,解析出服务器希望做什么和设备状态,通过设备影子解耦了平台掉线,平台再进行读取的工作。本质上设备的开发和云端的开发都是对字符串进行操作,只不过这里的是用到底层字符串是基础版,如果是高级版就是提前约定好的功能定义,设备影子的概念也是对标识符进行读取,最后以上就是设备影子的用途和使用方法。

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
传感器 数据采集 物联网
MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2
4434 0
|
存储 网络协议 物联网
Android集成MQTT教程:实现高效通信和实时消息传输
Android集成MQTT教程:实现高效通信和实时消息传输
3210 0
|
物联网 开发工具
物联网平台实用技巧:设备端检测自己是否在线
基于MQTT接入的设备靠心跳保活,但心跳是周期性的、且自动收发和超时重连,这些特性给主动检测设备端是否在线带来了一定难度。本文提供通过消息收发是否正常判定设备是否在线的原理、流程、实现方式。
4869 1
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
存储 消息中间件 JSON
DDD基础教程:一文带你读懂DDD分层架构
DDD基础教程:一文带你读懂DDD分层架构
|
缓存 Java 调度
使用scheduleAtFixedRate进行定时任务调度
使用scheduleAtFixedRate进行定时任务调度
Altium Designer中编译原理图之后出现 off grid at..... 的解决方法
Altium Designer中编译原理图之后出现 off grid at..... 的解决方法
1069 0
|
监控 安全 物联网
阿里云mqtt简介和使用流程
本文介绍了阿里云MQTT的准备工作、简介和使用流程。首先,用户需要注册阿里云账号并完成实名认证。接着,通过阿里云物联网平台创建产品和设备,获取连接所需的Broker Address、Port、Username和Password。然后,使用MQTT客户端(如MQTTX)配置这些信息进行连接,并激活设备。最后,创建并订阅/发布自定义Topic,实现设备间的通信。阿里云MQTT是一个适用于物联网设备的轻量级通信协议,提供高并发、高可靠性的服务,广泛应用于各种物联网场景。
阿里云mqtt简介和使用流程
|
存储 数据挖掘 数据库
InfluxDB的连续查询与数据聚合技术详解
【4月更文挑战第30天】InfluxDB的连续查询(CQ)功能用于自动定时聚合时间序列数据,适用于数据降采样、实时分析和告警通知等场景。CQ使用InfluxQL编写,例如,每1小时对`cpu_usage`测量值计算主机的平均CPU使用率并存入`cpu_usage_hourly`。InfluxDB提供多种聚合函数如`MEAN()`, `MAX()`, 支持滑动窗口聚合等复杂操作,助力时间序列数据分析和趋势预测。通过CQ,用户能高效管理和利用时间序列数据信息。
1261 0
|
数据采集 监控 物联网
IOT/智能设备日志解决方案(1):概述
无论是物联网还是智能设备,规模都越来越大,产业分工也越来越明确,逐渐形成一整套的生态系统。而同时无论是物联网还是智能设备的生态系统中,日志数据永远是不可缺少的一个重要环节。
6124 0
IOT/智能设备日志解决方案(1):概述