从Azure设备SDK获取双胞胎

问题描述

我只需要使用用于node.js的Azure设备sdk获得设备的孪生兄弟。 我确实使用了如下的Client Cloet:-

import { Client } from 'azure-iot-device';
import { Mqtt } from 'azure-iot-device-mqtt';
await client.setoptions(options);
await client.open();
const twin = await client.getTwin();

问题是返回的双胞胎没有设备双胞胎字段,但其他字段如下所示:-

{
  _events: [Object: null prototype] { newListener: [Function: bound ] },_eventsCount: 1,_maxListeners: undefined,_transport: Mqtt {
    _events: [Object: null prototype] {
      error: [Function],connected: [Function],disconnect: [Array],message: [Function],twindesiredPropertiesUpdate: [Function: bound ]
    },_eventsCount: 5,_mid: '',_firstConnection: false,_authenticationProvider: X509AuthenticationProvider { type: 0,_credentials: [Object] },_mqtt: MqttBase {
      _events: [Object: null prototype],_eventsCount: 2,mqttProvider: [Object],_onTheWirePublishes: [OnTheWireMessageContainer],_fsm: [constructor],_options: [Object],_config: [Object],_mqttClient: [MqttClient],[Symbol(kCapture)]: false
    },_twinClient: MqttTwinClient {
      _events: [Object: null prototype],_pendingTwinRequests: {},_mqtt: [MqttBase],_topicFsm: [BehavioralFsm],_responsetopic: [Object],_desiredPropertiesUpdatesTopic: [Object],_fsm: constructor {
      initialState: 'disconnected',states: [Object],eventListeners: [Object],namespace: 'fsm.2',useSafeEmit: false,hierarchy: {},pendingDelegations: {},_stamped: true,inputQueue: [],targetReplayState: 'connected',state: 'connected',priorState: 'connecting',priorAction: 'connected.getTwin',currentAction: '',currentActionArgs: undefined,inExitHandler: false
    },_topicTelemetryPublish: 'devices/amidha/messages/events/',_topics: { method: [Object],message: [Object] },_userAgentString: 'azure-iot-device/1.17.1 (node v12.18.0; Ubuntu 18.04; x64)',[Symbol(kCapture)]: false
  },_retryPolicy: ExponentialBackOffWithJitter {
    _errorFilter: DefaultErrorFilter {
      ArgumentError: false,ArgumentOutOfRangeError: false,DeviceMaximumQueueDepthExceededError: false,DeviceNotFoundError: false,FormatError: false,UnauthorizedError: false,NotImplementedError: false,NotConnectedError: true,IotHubQuotaExceededError: false,MessagetooLargeError: false,InternalServerError: true,ServiceUnavailableError: true,IotHubNotFoundError: false,IoTHubSuspendedError: false,JobNotFoundError: false,TooManyDevicesError: false,ThrottlingError: true,DeviceAlreadyExistsError: false,DeviceMessageLockLostError: false,InvalidEtagError: false,InvalidOperationError: false,PreconditionFailedError: false,TimeoutError: true,BadDeviceResponseError: false,GatewayTimeoutError: false,DeviceTimeoutError: false,TwinRequestError: false
    },immediateFirstRetry: true,normalParameters: ExponentialBackoffWithJitterParameters {
      c: 100,cMin: 100,cMax: 10000,ju: 0.25,jd: 0.5
    },throttledParameters: ExponentialBackoffWithJitterParameters {
      c: 5000,cMin: 10000,cMax: 60000,jd: 0.5
    }
  },_maxOperationTimeout: 240000,desiredPropertiesUpdatesEnabled: false,properties: {
    reported: { update: [Function: update],'$version': 1 },desired: { '$version': 1 }
  },[Symbol(kCapture)]: false
}

我不想听通过twin.on使用上述对象可以轻松完成的孪生变化事件。我只需要获取设备的当前双胞胎。有可能吗?

解决方法

在阅读您的评论后,您似乎希望其中存在一些设备不可用的值(使用设备SDK时)。该设备可以读取和接收所需属性的更新,也可以读取/写入报告的属性,其余的则不可用。

Available operations

在评论中,您提到要在双胞胎中找到deviceScope,但这不适用于设备SDK。为此,您将需要服务SDK。

在打印const twin = await client.getTwin();的结果时,您看到的是一个带有帮助方法的对象,该方法可用于订阅所需的属性更改并修补新报告的属性。就像马克在他的问题中所述,双胞胎的属性也包含在该对象中。

,

当前的双胞胎在您发布的JSON中。请参阅部分属性:

 properties: {
    reported: { update: [Function: update],'$version': 1 },desired: { '$version': 1 }
  },

您发布的双胞胎是空的。

,

上述不仅无法从设备IoT SDK获得整个双胞胎,而且还需要Azure确认。选中here

该链接还提供了一种解决方案,可以在叶子和边缘设备之间分配父子关系。