AWS IoTを使用してRaspberry PiとのMQTT通信をC言語で動作させる


概要

今更ですがAWS IoTとraspberry pi間のMQTTの検証をしてみました
MQTT通信は非力なデバイスが少ないリソースで通信できるためhttp通信同様にスタンダードになりつつある。と考えていますので少しは知っておいたほうがよいという意図です

動作させる内容は、AWS IoTを使用してraspberry pi との間で MQTTのパブリッシュとサブスクライブの動作確認とします。
しかし、ここまでは先人の方々の情報を利用させていただくことにより容易に実現できますので、
今回は、raspberry pi 側はC言語で動作させることにしました

イメージ

検証方法

  • AWS IoT のウィザードを使用して一旦python環境で動作させます
  • pythonで動作が確認できたら、AWS IoT Embedded C SDK を使用してC言語で動作させます

AWS IoT のウィザードを使用して一旦python環境で動作させます

ここを参考にさせていただきました

  • サービスのリストの変更があり「AWS IoT」ではなく「IoT Core」を選択してください

AWS IoT Embedded C SDK を使用してC言語で動作させます

AWSドキュメント(AWS IoT Embedded C SDK の使用)の手順通りにすすめる
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-embedded-c-sdk.html

(補足説明)
- カレントディレクトリ/rootから、 git clone https://github.com/aws/aws-iot-device-sdk-embedded-C.git -b release を実行しました
- certにはpythonで動作させたときに作成された証明書を使用しました
- external_libs/mbedTLS/ 配下には https://github.com/ARMmbed/mbedtls のファイルをコピーしました
- Policyはpythonで動作させたときに作成された内容を一部修正しました
- サンプルプログラムは ~/aws-iot-device-sdk-embedded-C/samples/linux/subscribe_publish_sample を使用しました。カレントディレクトリを合わせて make を実行すれば 実行ファイルが作成できます。
- aws_iot_config.h  を設定することを忘れずに。

Policy(変更前)

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/sdk/test/java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/sdk/test/Python",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/topic_1",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topic/topic_2"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/sdk/test/java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/sdk/test/Python",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/topic_1",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:topicfilter/topic_2"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Connect"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/sdk-java",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/basicPubSub",
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:client/sdk-nodejs-*"
      ]
    }
  ]
}

Policy(変更後)
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iot:*"
      ],
      "Resource": [
        "arn:aws:iot:ap-northeast-1:xxxxxxxx:*"
      ]
    }
  ]
}

参考にさせていただいた情報

http://blog.akanumahiroaki.com/entry/2017/07/01/160000
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-embedded-c-sdk.html
https://github.com/aws/aws-iot-device-sdk-embedded-C/issues/85
https://github.com/aws/aws-iot-device-sdk-embedded-C/issues/183