Я пытаюсь решить простую задачу, используя 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);
});
}
Как видите, у меня нет проблем с аутентификацией или другими вещами.Вероятно, это просто неправильное понимание того, как работает теневой класс.Любая помощь высоко ценится.