问题描述
我只需要使用用于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时)。该设备可以读取和接收所需属性的更新,也可以读取/写入报告的属性,其余的则不可用。
在评论中,您提到要在双胞胎中找到deviceScope,但这不适用于设备SDK。为此,您将需要服务SDK。
在打印const twin = await client.getTwin();
的结果时,您看到的是一个带有帮助方法的对象,该方法可用于订阅所需的属性更改并修补新报告的属性。就像马克在他的问题中所述,双胞胎的属性也包含在该对象中。
当前的双胞胎在您发布的JSON中。请参阅部分属性:
properties: {
reported: { update: [Function: update],'$version': 1 },desired: { '$version': 1 }
},
您发布的双胞胎是空的。
,上述不仅无法从设备IoT SDK获得整个双胞胎,而且还需要Azure确认。选中here。
该链接还提供了一种解决方案,可以在叶子和边缘设备之间分配父子关系。