1

AWS IOT を使用して THING と APP を接続しています。両方ともAWS IOT SDK for Node.jsを使用しています。THING にはset_temp設定可能な温度 ( ) と温度センサー ( actual_temp) があります。

THING は$aws/things/THING_ID/shadow/updates/delta/MQTT トピックをリッスンします。APP は$aws/things/THING_ID/shadow/updates/、次のメッセージを使用してトピックを公開します。

{
    "state": {
        "desired": {
            "set_temp": 38.7
        }
    }
}

この MQTT メッセージは Thing Shadow に伝播し、THING 自体に伝播します。ただし、THINGが$aws/things/THING_ID/shadow/updates/トピックについて次のように報告する場合:

{
    "state": {
        "reported": {
            "set_temp": 38.7,
            "actual_temp": 32.4
        }
    }
}

... Thing Shadow はそれを受け取りますが、メッセージを APP に伝達しません。set_tempAPP に伝搬する必要が実際にはないため、これで問題ありません。しかし、actual_temp変更が加えられると、APP に反映されるはずですが、反映されません。

AWS IOTのドキュメントによると、これは機能するはずです。desired: null彼らは、THING からのメッセージ に「 」を含めて送信するようにさえ言います。

Thing Shadow をポーリングせずに「聞く」にはどうすればよいでしょうか? 私のやり方が間違っているか、AWS の IOT プラットフォームに大きな穴が開いているかのどちらかです。

更新(実際のコードを含む):

App.js:

var awsIot = require('aws-iot-device-sdk');
var name = 'THING_ID';

var app = awsIot.device({
    keyPath: '../../certs/private.pem.key',
    certPath: '../../certs/certificate.pem.crt',
    caPath: '../../certs/root-ca.pem.crt',
    clientId: name,
    region: 'ap-northeast-1'
});

app.subscribe('$aws/things/' + name + '/shadow/update/accepted');

app.on('message', function(topic, payload) {
    // THIS LINE OF CODE NEVER RUNS
    console.log('got message', topic, payload.toString());
});

Device.js:

var awsIot = require('aws-iot-device-sdk');
var name = 'THING_ID';

var device = awsIot.device({
    keyPath: '../../certs/private.pem.key',
    certPath: '../../certs/certificate.pem.crt',
    caPath: '../../certs/root-ca.pem.crt',
    clientId: name,
    region: 'ap-northeast-1'
});

device.subscribe('$aws/things/' + name + '/shadow/update/delta');

device.on('message', function (topic, payload) {
    console.log('got message', topic, payload.toString());
});

// Publish state.reported every 1 second with changing temp
setInterval(function () {
    device.publish('$aws/things/' + name + '/shadow/update', JSON.stringify({
        'state': {
            'reported': {
                'actual_pool_temp': 20 + Math.random() * 10
            }
        }
    }));
}, 1000);
4

1 に答える 1