MQTTトピックでデバイスシャドウを更新するとき、正しくないJSONだと更新されずにハマった話

正しくないJSONを使うとデバイスシャドウに反映されません。正しくないJSONの例と反映されなかったことを確認する方法を書きました。
2020.04.03

IoT Coreのテスト画面でデバイスシャドウを更新して動作確認することがあります。 このとき「あれ? データをPublishしたけど反映されないぞ??」とハマりました。

結論としては、正しいJSONじゃなかったというオチです。

デバイスシャドウの様子

次のデバイスがあり、デバイスシャドウ(シャドウステータス)は空っぽの状態です。

デバイスシャドウの様子(作成直後)

デバイスシャドウを更新する(正しいJSON)

正しいJSONの場合は、問題なく更新できます。

  • トピック: $aws/things/device_test_1234/shadow/update
  • データ: 下記
{
    "state" : {
        "reported" : {
            "color" : "red",
            "power" : "on"
         }
     }
}

デバイスシャドウの更新に成功した

正しくないJSONだと更新されない

例えば下記です。JSONデータをPythonコードからコピペした際にやらかしました……。

  • シングルクォーテーション「'」を使っている
  • 余計なカンマ「,」がある

シングルクォーテーションを使っている例

{
    'state' : {
        'reported' : {
            'color' : 'green',
            'power' : 'on'
         }
     }
}

余計なカンマを使っている例

{
    "state" : {
        "reported" : {
            "color" : "blue",
            "power" : "on",
         }
     }
}

デバイスシャドウの更新失敗をSubscribeして確認しよう

デバイスシャドウは更新失敗時にも特定のトピックにPublishしてくれるので、そのトピックをSubscribeしておくと更新失敗が分かります。

  • トピック: $aws/things/device_test_1234/shadow/update/rejected

デバイスシャドウの更新に失敗した

{
  "code": 400,
  "message": "Payload contains invalid json"
}

さいごに

正しくないJSONだった事に気づくまで時間がかかりました。手動テストするときは、あらかじめ更新失敗時のトピックをSubscribeしておくと良いですね。

参考