aws-iot-device-sdk-js: функция обратного вызова thingShadow "on status" не запускается - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь решить простую задачу, используя aws-iot-device-sdk-js и node.js.Я хочу подписаться на все обновления, сделанные в тени и так что-то с ними.Я мог бы сделать это, используя класс device, используя сертификаты, но это не доступно для целей этой демонстрации.

Вот мой код:

var AWS = require('aws-sdk');
var AWSIoTData = require('aws-iot-device-sdk');
var thingName = 'MyThing';
var shadowsRegistered = false;

var AWSConfiguration = {
   poolId: 'us-east-2:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX', // 'YourCognitoIdentityPoolId'
   host: 'XXXXXXXXXXXXXX-ats.iot.us-east-2.amazonaws.com', // 'YourAWSIoTEndpoint', e.g. 'prefix.iot.us-east-1.amazonaws.com'
   region: 'us-east-2' // 'YourAwsRegion', e.g. 'us-east-1'
};

//
// Initialize our configuration.
//
AWS.config.region = AWSConfiguration.region;

AWS.config.credentials = new AWS.CognitoIdentityCredentials({
   IdentityPoolId: AWSConfiguration.poolId
});

var shadowsRegistered = false;

iniShadows = function(credentials){
    const shadows = AWSIoTData.thingShadow({
       region: AWS.config.region,  // Set the AWS region we will operate in.
       host:AWSConfiguration.host, //Set the AWS IoT Host Endpoint
       clientId: 'some random string', // Use a random client ID.
       protocol: 'wss', // Connect via secure WebSocket
       //
       // Set the maximum reconnect time to 8 seconds; this is a browser application
       // so we don't want to leave the user waiting too long for reconnection after
       // re-connecting to the network/re-opening their laptop/etc...
       //
       maximumReconnectTimeMs: 8000,
       debug: true, // Enable console debugging information (optional)
       //
       // IMPORTANT: the AWS access key ID, secret key, and sesion token must be
       // initialized with empty strings.
       //
       accessKeyId: credentials.AccessKeyId,
       secretKey: credentials.SecretKey,
       sessionToken: credentials.SessionToken
    });
    shadows.on('connect', function(){
      console.log('connect');
      //
      // We only register our shadows once.
      //
      if (!shadowsRegistered) {
        console.log('=== registering shadows ');
         shadows.register(thingName,{
           persistentSubscribe:true
         },function(){
           console.log('after registerging. ');
           shadowsRegistered = true;

         });

      }
    });
    shadows.on('reconnect', function(){
      console.log('reconnect');
    });

    shadows.on('status', function(thingName, statusType, clientToken, stateObject) {
      console.log(thingName);
      console.log('----> got status ' + statusType);
      console.log(JSON.stringify(stateObject));
    });
    shadows.on('delta', function(thingName, stateObject) {
      console.log(thingName);
      console.log(JSON.stringify(stateObject));
    });
    shadows.on('timeout', function(thingName, clientToken) {
       console.log('received timeout on '+thingName);
    });    

}


var cognitoIdentity = new AWS.CognitoIdentity();
AWS.config.credentials.get(function(err, data) {
   if (!err) {
      console.log('retrieved identity: ' + AWS.config.credentials.identityId);
      var params = {
         IdentityId: AWS.config.credentials.identityId
      };
      cognitoIdentity.getCredentialsForIdentity(params, function(err, data) {
         if (!err) {
            //
            // Update our latest AWS credentials; the MQTT client will use these
            // during its next reconnect attempt.
            //
            //shadows.updateWebSocketCredentials(data.Credentials.AccessKeyId,
            //   data.Credentials.SecretKey,
            ///   data.Credentials.SessionToken);
            iniShadows(data.Credentials);
              console.log('updated credentials in shadows ');

         } else {
            console.log('error retrieving credentials: ' + err);
            alert('error retrieving credentials: ' + err);
         }
      });
   } else {
      console.log('error retrieving identity:' + err);
      alert('error retrieving identity: ' + err);
   }
});

Журнал на консоли просто: ... (некоторый вывод cognito) обновленные учетные данные в тенях подключаются === регистрация теней после регистрации.

так что когнитивная часть работает, и я могу ее зарегистрировать.

shadows.on('status',... и shadows.on('delta', никогда не называются.Даже если поток данных идет, потому что я могу зарегистрироваться в тени / обновлениях / принятых в mqtt-клиенте AWS IoT.

Затем я попытался вызвать shadows.get(thingName) из-за обратного вызова функции регистра, И я получил обратный вызов для status, работающего один раз.Однако обратный вызов не работает для каждого нового сообщения, которое принимается тенью.

if (!shadowsRegistered) {
        console.log('=== registering shadows ');
         shadows.register(thingName,{
           persistentSubscribe:true
         },function(){
           console.log('after registerging. ');
           shadowsRegistered = true;

           opClientToken = shadows.get(thingName);
         });

      }

Как видите, у меня нет проблем с аутентификацией или другими вещами.Вероятно, это просто неправильное понимание того, как работает теневой класс.Любая помощь высоко ценится.

...