热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AzureIotAndroid开发MQTT协议通信(设备和IoT实时通信)2设备孪生详解

之前简单讲解了IotHub使用,现在详解DeviceTwin,看文章之前先了解AzureIotAndroid开发-MQTT协议通信(设备和IoT实时通信)1设备孪生设备孪生存储具有

之前简单讲解了IotHub 使用,现在详解DeviceTwin,看文章之前先了解Azure Iot Android 开发-MQTT协议通信(设备和IoT 实时通信)1

设备孪生

设备孪生存储具有以下用途的设备相关信息:

  • 设备和后端可以使用这些信息来同步设备状态和配置。
  • 解决方案后端可以使用这些信息来查询和定位长时间运行的操作。

设备孪生的生命周期链接到相应的 设备标识。 在 IoT 中心创建或删除设备标识时,将隐式创建和删除设备孪生。

设备孪生是一个 JSON 文档,其中包含:

  • 标记。 解决方案后端可从中读取和写入数据的 JSON 文档的某个部分。 标记对设备应用不可见。
  • 所需的属性。 与报告的属性结合使用,同步设备配置或状态。 解决方案后端可设置所需的属性,并且设备应用可进行读取。 此外,当所需的属性发生更改时,设备应用可收到通知。
  • 报告的属性。 与所需的属性结合使用,同步设备配置或状态。 设备应用可设置报告的属性,并且解决方案后端可进行读取和查询。
  • 设备标识属性。 设备孪生 JSON 文档的根包含标识注册表中存储的相应设备标识的只读属性。

《Azure Iot Android 开发-MQTT协议通信(设备和IoT 实时通信)2-设备孪生详解》

以下示例显示了一个设备孪生 JSON 文档:

JSON复制

{
"deviceId": "devA",
"etag": "###Ac=",
"status": "enabled",
"statusReason": "provisioned",
"statusUpdateTime": "0001-01-01T00:00:00",
"connectionState": "connected",
"lastActivityTime": "2015-02-30T16:24:48.789Z",
"cloudToDeviceMessageCount": 0,
"authenticationType": "sas",
"x509Thumbprint": {
"primaryThumbprint": null,
"secondaryThumbprint": null
},
"version": 2,
"tags": {
"$etag": "123",
"deploymentLocation": {
"building": "43",
"floor": "1"
}
},
"properties": {
"desired": {
"telemetryConfig": {
"sendFrequency": "5m"
},
"$metadata" : {...},
"$version": 1
},
"reported": {
"telemetryConfig": {
"sendFrequency": "5m",
"status": "success"
}
"batteryLevel": 55,
"$metadata" : {...},
"$version": 4
}
}
}

根对象中包含设备标识属性,以及 tagsreporteddesired 属性的容器对象。 properties 容器包含一些只读元素($metadata$etag$version),设备孪生元数据和乐观并发部分描述了这些元素。

一、设备孪生修改属性(reported单个属性)、查看属性(方法一)(Desired 所有属性)

创建一个 Device 对象用于存储设备孪生属性。

DeviceClient client = new DeviceClient(connString, protocol);
// Create a Device object to store the device twin properties
Device dataCollector = new Device() {
// Print details when a property value changes
@Override
public void PropertyCall(String propertyKey, Object propertyValue, Object context) {
System.out.println(propertyKey + " changed to " + propertyValue);
}
};

创建 connectivityType 报告属性并将其发送到 IoT 中心:

try {
// Open the DeviceClient and start the device twin services.
client.open();
client.startDeviceTwin(new DeviceTwinStatusCallBack(), null, dataCollector, null);
//可获取到Desired 属性
client.subscribeToDesiredProperties(telemetryConfig.getDesiredProp());
// Create a reported property and send it to your IoT hub.
dataCollector.setReportedProp(new Property("connectivityType", "cellular"));
client.sendReportedProperties(dataCollector.getReportedProp());
}
catch (Exception e) {
System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \n" + e.getMessage());
dataCollector.clean();
client.close();
System.out.println("Shutting down...");
}

通过getDeviceTwin() 回调PropertyCall方法

client.getDeviceTwin();
二、通过PropertyCallback 获取reported、Desired 所有属性

实现设备孪生功能,请通过将以下嵌套类添加到 App 类来提供回调:

protected static class DeviceTwinStatusCallback implements IotHubEventCallback
{
public void execute(IotHubStatusCode status, Object context)
{
System.out.println("IoT Hub responded to device twin operation with status " + status.name());
}
}
protected static class PropertyCallback implements PropertyCallBack
{
public void PropertyCall(String propertyKey, String propertyValue, Object context)
{
System.out.println("PropertyKey: " + propertyKey);
System.out.println("PropertyKvalue: " + propertyKey);
}
}

要启动直接方法和设备孪生例程,以下代码:

client = new DeviceClient(connString, protocol);
try
{
client.open();
client.subscribeToDeviceMethod(new DirectMethodCallback(), null, new DirectMethodStatusCallback(), null);
client.startDeviceTwin(new DeviceTwinStatusCallback(), null, new PropertyCallback(), null);
System.out.println("Client connected to IoT Hub. Waiting for firmwareUpdate direct method.");
}
catch (Exception e)
{
System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \n" + e.getMessage());
client.close();
System.out.println("Shutting down...");
}
三、通过PropertyCallback 、subscribeToTwinDesiredProperties 订阅指定属性、批量更新reported属性

添加以下回调:

protected static class DeviceTwinStatusCallBack implements IotHubEventCallback
{
@Override
public void execute(IotHubStatusCode status, Object context)
{
if((status == IotHubStatusCode.OK) || (status == IotHubStatusCode.OK_EMPTY))
{
Succeed.set(true);
}
else
{
Succeed.set(false);
}
System.out.println("IoT Hub responded to device twin operation with status " + status.name());
}
}
/*
* If you don't care about version, you can use the PropertyCallBack.
*/
protected static class onHomeTempChange implements TwinPropertyCallBack
{
@Override
public void TwinPropertyCallBack(Property property, Object context)
{
System.out.println(
"onHomeTempChange change " + property.getKey() +
" to " + property.getValue() +
", Properties version:" + property.getVersion());
}
}
protected static class onProperty implements TwinPropertyCallBack
{
@Override
public void TwinPropertyCallBack(Property property, Object context)
{
System.out.println(
"onProperty callback for " + (property.getIsReported()?"reported": "desired") +
" property " + property.getKey() +
" to " + property.getValue() +
", Properties version:" + property.getVersion());
}
}

订阅指定属性、批量更新reported属性

DeviceClient client = new DeviceClient(connString, protocol);
try
{
client.open();
// onHomeTempChange 里面获取所有属性值(Desired、 Report)
client.startDeviceTwin(new DeviceTwinStatusCallBack(), null, new onHomeTempChange(), null); Map> desiredProperties = new HashMap>()
{
{
//此处订阅指定的属性值Desired
put(new Property("LivingRoomLights", null), new Pair(new onProperty(), null));
put(new Property("BedroomRoomLights", null), new Pair(new onProperty(), null));
}
};
client.subscribeToTwinDesiredProperties(desiredProperties);

client.getDeviceTwin();
// For each desired property in the Service, the SDK will call the appropriate callback with the value and version.
//批量更新多个属性
Set reportProperties = new HashSet()
{
{
add(new Property("HomeTemp(F)", 70));
add(new Property("LivingRoomLights", LIGHTS.ON));
add(new Property("BedroomRoomLights", LIGHTS.OFF));
}
};
client.sendReportedProperties(reportProperties);
catch (Exception e)
{
client.closeNow();
System.out.println("Shutting down...");
}
}

以上就是DeviceTwin使用详解

参考:

Azure IoT文档中心:https://docs.azure.cn/zh-cn/iot-hub/iot-hub-devguide

GitHub:https://github.com/Azure/azure-iot-sdk-java/tree/master/device

官方GitHub详细地址


推荐阅读
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 本指南详细介绍了在Linux环境中高效连接MySQL数据库的方法。用户可以通过安装并使用`mysql`客户端工具来实现本地连接,具体命令为:`mysql -u 用户名 -p 密码 -h 主机`。例如,使用管理员账户连接本地MySQL服务器的命令为:`mysql -u root -p pass`。此外,还提供了多种配置优化建议,以确保连接过程更加稳定和高效。 ... [详细]
  • 在Kubernetes上部署多个Mitmproxy代理服务器以实现高效流量管理 ... [详细]
  • 背景由于性能数据每天导入量,数据库表空间每天增长很快,且不需要太长的保存周期,为避免爆表,因此需要定制定期清理计划。数据的清理可以有多种方案,根据场景的不同可以分为离线,在线。后续 ... [详细]
  • MQTT介绍(MessageQueuingTelemetryTransport,消息队列遥测传输)是IBM推出的一种针对移动终端设备的基于TCPIP的发布订阅协议可以连接大量的远程 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • 以下是实验程序的源代码:***********************pthread.c***************************#include#inc ... [详细]
  • 在Android源码环境下编译系统App使用第三方jar包的方法(备忘)
    1将要使用的jar包放入App的根目录,即Android.mk所在目录2按如下方式编写Android.mk文件(########之间的行用于编译和使用jar包)LOCAL_PATH:$(ca ... [详细]
  • 1、背景-在项目的实施过程中,由于有dev环境和pro环境,这时会有两个redis集群,但是部分数据从甲方的三方数据库中获取存入生产环境的redis集群中,为了方便测试和数据校验, ... [详细]
  • python 英文关键词提取_如何提取文章的关键词(Python版)
    项目需求:我们采集来的文章没有关键词,在发布的时候无法设定标签,我们通过代码自动提取出文章的关键词,达到对数据加工的目的。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 本文由编程笔记小编整理,主要介绍了使用Junit和黄瓜进行自动化测试中步骤缺失的问题。文章首先介绍了使用cucumber和Junit创建Runner类的代码,然后详细说明了黄瓜功能中的步骤和Steps类的实现。本文对于需要使用Junit和黄瓜进行自动化测试的开发者具有一定的参考价值。摘要长度:187字。 ... [详细]
author-avatar
手机用户2602937435
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有