英文:
Azure Iot hub Device vs. Service SDK for getting desired properties from Device twin?
问题
以下是翻译好的内容:
这是有关 服务 和 设备 SDK 的段落摘要:
链接:https://learn.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-sdks
嗨,我有两个我正在开发的代码库或项目,一个使用了 Azure IoT Hub 的 服务 SDK(Java 文档 API 在这里:https://learn.microsoft.com/en-us/java/api/com.microsoft.azure.sdk.iot.service?view=azure-java-stable),它使得获取 DeviceTwin 的期望属性非常容易。我只需要一个 DeviceTwinDevice
对象,然后调用 getDesiredProperties()
方法即可。这一切都来自于以下依赖项:
compile group: 'com.microsoft.azure.sdk.iot', name: 'iot-service-client', version: '1.16.0'
现在,我正在另一个代码库中工作,在那里我必须从设备的 Device Twin 中读取特定属性,但该项目使用了 Azure IoT Hub 的 设备 SDK(Java 文档 API 在这里:https://learn.microsoft.com/en-us/java/api/com.microsoft.azure.sdk.iot.device?view=azure-java-stable),它的工作方式略有不同。看起来他们使用了一个 DeviceClient
对象来连接 IoT Hub 等。我没有看到任何用于检索 DeviceTwin 期望属性的方法,除了一个 getDeviceTwin()
方法,但它是一个空方法,不返回任何内容?该依赖项如下:
compile(group: 'com.microsoft.azure.sdk.iot', name: 'iot-device-client', version: '1.19.1')
对于那些以前没有见过这些“属性”的人,它只是位于 Azure 门户网站上的 JSON 数据:
在 设备 SDK 中是否有一种简单的方法来获取这些属性,还是我必须在 Gradle 中添加 服务 SDK 的依赖项,然后以那种方式来做?这似乎有些多余。请帮忙解答!
英文:
This gives a paragraph summary of the service vs device sdk:
https://learn.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-sdks
Hi, I have two repositories or projects I'm working on, one is using the Azure Iot Hub Service SDK (documentation API for java here: https://learn.microsoft.com/en-us/java/api/com.microsoft.azure.sdk.iot.service?view=azure-java-stable), which makes it very easy to get the DeviceTwin desired properties. I just need a DeviceTwinDevice
object and then I call getDesiredProperties()
on it. This all comes from the dependency:
compile group: 'com.microsoft.azure.sdk.iot', name: 'iot-service-client', version: '1.16.0'
Now, I am working on another repo, where I have to read a specific property from the Device twin, but that project is using the Azure Iot Hub Device SDK (documentation API for Java here: https://learn.microsoft.com/en-us/java/api/com.microsoft.azure.sdk.iot.device?view=azure-java-stable), and it works a little different. It looks like they use a DeviceClient
object to connect the Iot hub and such. I don't see any methods for retrieving the desired properties for the DeviceTwin other than a getDeviceTwin()
method, but it is a void method and returns nothing? The dependency for this is
compile(group: 'com.microsoft.azure.sdk.iot', name: 'iot-device-client', version: '1.19.1')
For those of you who haven't seen these "properties" before, it's just JSON located on the Azure Portal website:
Is there an easy way to grab these properties with the device sdk or must I drag the dependency in Gradle for the service sdk and do it that way? It seems redundant. Please help!
答案1
得分: 1
System.out.println("订阅设备Twin中的期望属性...");
Map<Property, Pair<TwinPropertyCallBack, Object>> desiredProperties = new HashMap<Property, Pair<TwinPropertyCallBack, Object>>()
{
{
put(new Property("HomeTemp(F)", null), new Pair<TwinPropertyCallBack, Object>(new onHomeTempChange(), null));
put(new Property("LivingRoomLights", null), new Pair<TwinPropertyCallBack, Object>(new onProperty(), null));
put(new Property("BedroomRoomLights", null), new Pair<TwinPropertyCallBack, Object>(new onProperty(), null));
put(new Property("HomeSecurityCamera", null), new Pair<TwinPropertyCallBack, Object>(new onCameraActivity(), null));
}
};
client.subscribeToTwinDesiredProperties(desiredProperties);
System.out.println("获取设备Twin...");
client.getDeviceTwin(); // 将触发回调。
处理接收到的属性然后在回调中完成,例如:
protected static class onProperty implements TwinPropertyCallBack
{
@Override
public void TwinPropertyCallBack(Property property, Object context)
{
System.out.println(
"对于" + (property.getIsReported() ? "已报告" : "期望") +
"属性的onProperty回调:" + property.getKey() +
",值为:" + property.getValue() +
",属性版本:" + property.getVersion());
}
}
<details>
<summary>英文:</summary>
The `getDeviceTwin()` method in the Device SDK in Java works a little different from other languages. There is a really good sample [here][1]. The magic happens a few lines about calling `getDeviceTwin()`, where you first define what properties you want to register a callback for. The samples below are all from the above link:
``` java
System.out.println("Subscribe to Desired properties on device Twin...");
Map<Property, Pair<TwinPropertyCallBack, Object>> desiredProperties = new HashMap<Property, Pair<TwinPropertyCallBack, Object>>()
{
{
put(new Property("HomeTemp(F)", null), new Pair<TwinPropertyCallBack, Object>(new onHomeTempChange(), null));
put(new Property("LivingRoomLights", null), new Pair<TwinPropertyCallBack, Object>(new onProperty(), null));
put(new Property("BedroomRoomLights", null), new Pair<TwinPropertyCallBack, Object>(new onProperty(), null));
put(new Property("HomeSecurityCamera", null), new Pair<TwinPropertyCallBack, Object>(new onCameraActivity(), null));
}
};
client.subscribeToTwinDesiredProperties(desiredProperties);
System.out.println("Get device Twin...");
client.getDeviceTwin(); // Will trigger the callbacks.
Handling the received property is then done in the callback, for example:
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());
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论