#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 — вам нужно было указывать весь путь к теме?