AWS IoT NodeJS SDK не может обновить именованные тени

#node.js #shadow #aws-iot

#node.js #тень #aws-iot

Вопрос:

Пытаюсь разобраться с AWS IoT named shadows, но я не могу подписаться или обновить именованные тени, а только тень по умолчанию. В моей консоли IoT у меня есть классическая тень и именованная тень с именем simShadow1

 const awsIoT = require('aws-iot-device-sdk');
const pathToCerts = "./certs";

const thingName = "mySimulatedThing";
const shadowName = "simShadow1";

const options = {
  keyPath:`${pathToCerts }/xxxx-private.pem.key`,
  certPath:`${pathToCerts }/xxxx-certificate.pem.crt`,
  caPath:`${pathToCerts }/rootCa.pem`,
  clientId:"xxxx",
  host:"xxxx-ats.iot.eu-west-1.amazonaws.com", 
  debug:true
};

let clientTokenUpdate;

const thinkShadow = awsIoT.thingShadow(options);
thinkShadow.on("connect", ()=>{
  console.info("connected to shadow");

  thinkShadow.register( thingName, {}, ()=>{
    console.debug(`registered to ${thingName} thing`);
    console.warn(`about to perform an update on ${thingName}`);

    clientTokenUpdate = thinkShadow.update( thingName, {
      state:{
        desired:{
          welcome:"Hello new value",
          ts:Date.now()
        }
      }
    });

    thinkShadow.subscribe(thingName, {}, (error, result)=>{
      console.info("simShadow1 subscription callback", error, result);
    });

    if(clientTokenUpdate === null){
      console.warn('update shadow failed, operation still in progress');
    }
  });

});

thinkShadow.on('status', (thingName, stat, clientToken, stateObject)=>{
  console.debug("on status", thingName, stat, clientToken, stateObject);
});

thinkShadow.on('delta', (thingName, stateObject)=>{
  console.debug("on delta", thingName, stateObject);
});

thinkShadow.on('timeout', (thingName, clientToken)=>{
  console.debug("on timeout", thingName, clientToken);
});
  

Приведенный выше код работает нормально. Я могу повлиять на классическую тень, используя имя объекта (mySimulatedThing), посмотреть в консоли AWS IoT, как изменяются желаемые значения, и если я изменю желаемое значение json в консоли AWS, я смогу увидеть статус событий NodeJS и вызываемую дельту.

Но я не могу найти способ взаимодействовать с именованной тенью «simShadow1». Я попытался установить для имени объекта значение «mySimulatedThing / simShadow1», «mySimulatedThing / shadow / name / simShadow1» и многие другие комбинации. Я также попытался thinkShadow.register(«с именем вещи» …), А затем добавить именованную тень при обновлении и подписке на такие thinkShadow.update(thingName «/» shadowName, {…}) и thinkShadow.subscribe(thingName «/» shadowName, …).

Есть ли у кого-нибудь рабочий пример взаимодействия с именованными тенями?

Ответ №1:

По-видимому, я должен указать полный путь как:

      device.subscribe(`$aws/things/${thingName}/shadow/name/${shadowName}/update/accepted`, (error, result)=>{
         console.info(">>", error, result);
     });
  

Я бы не ожидал, что нужно указывать полный путь. Интересно, есть ли более элегантные решения.

Ответ №2:

Я нахожусь в аналогичной ситуации — я могу обновить, используя thing в GG (v1) и IoT Cloud. Но не может повлиять на изменение состояния устройства с помощью локальной теневой службы, т.Е. Когда я делаю локальную теневую службу подписчиком темы вместо вещи. Я все еще пытаюсь выяснить, почему…..

Комментарии:

1. А как насчет функций thingShadow.register и update — вам нужно было указывать весь путь к теме?