从 Azure 设备 sdk 获取孪生

Fetch twin from Azure device sdk

我只需要使用 node.js 的 Azure 设备 sdk 获取设备的双胞胎。 我确实使用了如下客户端代码:-

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,
    _maxListeners: undefined,
    _mid: '',
    _firstConnection: false,
    _authenticationProvider: X509AuthenticationProvider { type: 0, _credentials: [Object] },
    _mqtt: MqttBase {
      _events: [Object: null prototype],
      _eventsCount: 2,
      _maxListeners: undefined,
      mqttProvider: [Object],
      _onTheWirePublishes: [OnTheWireMessageContainer],
      _fsm: [constructor],
      _options: [Object],
      _config: [Object],
      _mqttClient: [MqttClient],
      [Symbol(kCapture)]: false
    },
    _twinClient: MqttTwinClient {
      _events: [Object: null prototype],
      _eventsCount: 1,
      _maxListeners: undefined,
      _pendingTwinRequests: {},
      _mqtt: [MqttBase],
      _topicFsm: [BehavioralFsm],
      _responseTopic: [Object],
      _desiredPropertiesUpdatesTopic: [Object],
      [Symbol(kCapture)]: false
    },
    _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,
      ju: 0.25,
      jd: 0.5
    }
  },
  _maxOperationTimeout: 240000,
  desiredPropertiesUpdatesEnabled: false,
  properties: {
    reported: { update: [Function: update], '$version': 1 },
    desired: { '$version': 1 }
  },
  [Symbol(kCapture)]: false
}

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

当前的双胞胎在您发布的 JSON 中。查看部分属性:

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

您发布的双胞胎是空的。

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

在评论中,您提到您想要在孪生中找到 deviceScope,但这对设备 SDK 不可用。为此,您需要服务 SDK。

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

要从设备 IoT sdk 中获取整个孪生对象而不仅仅是所需的和报告的属性,上述方法是不可行的,Azure 也已确认这一点。检查 here.

link也有解决leaf和edge device之间parent child relationship的方法