Arduino互換ボードとconect+をWeb APIでつなげてみた! | conect+ - Part 3

Arduino互換ボードとconect+をWeb APIでつなげてみた!

Arduino互換ボードとconect+をWeb APIでつなげてみた!

 

第二回ではconect+での設定までを行いました。

今回はArduino互換ボード側のプログラミングを行っていきます。

 

ボード側プログラミング

■サーバー証明書の取得

HTTPSWeb APIにアクセスした際に、接続先がconect+のサーバーかどうか確認するため、クライアント(ボード)側にルート証明書が必要になります。

今回は、開発用パソコンの中にある証明書を取得して、ボードで使用します。

Chromeを例に手順を説明します。

 

①ブラウザで「https://api.conect.plus/」にアクセスします。

②アドレス欄の鍵マークをクリックし、「証明書」を選択します。

 

③下記のようなダイアログが表示されるので、詳細タブを選択し、「ファイルにコピー」をクリックします。

 

④証明書のエクスポートウィザードが起動します。「次へ」をクリックしてください。

 

⑤「Base 64 encoded X.509(.CER)」を選択し、「次へ」をクリックしてください。

 

⑥ファイルの保存先を指定して、「次へ」をクリックしてください。

 

⑦完了をクリックしてください。証明書が出力されます。

 

■プログラム

ルート証明書を取得できたら、次にプログラミングを行います。

Arduino IDE上で、以下のようなコードを実装します。

 

#include <WiFi.h>
#include <HTTPClient.h>
#include <time.h>
const char* ssid = "SSID ";
const char* password = "PASSWORD";
const char* root_ca = \
                     "-----BEGIN CERTIFICATE-----\n" \
                     "MIIFZTCCBE2gAwIBAgIQDixaIIKJJdtB+UIs0ldeoTANBgkqhkiG9w0BAQsFADBG\n" \
                     "MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRUwEwYDVQQLEwxTZXJ2ZXIg\n" \
                     "Q0EgMUIxDzANBgNVBAMTBkFtYXpvbjAeFw0xODA5MTUwMDAwMDBaFw0xOTEwMTUx\n" \
                    "MjAwMDBaMBoxGDAWBgNVBAMTD2FwaS5jb25lY3QucGx1czCCASIwDQYJKoZIhvcN\n" \
                     "AQEBBQADggEPADCCAQoCggEBANglfDUXK8cdi7c2yjTHb34V7g1pZQvmKzrlY2Gs\n" \
                     "70hQjZVm5Ek163X733gzk33Qv631OCEnhZtbuGJQ7dd+1uPUJLvVJZHDQrdFI4Lp\n" \
                     "pm/G08x/K8koywFf2JKQkw0V5S0013j/tBHW2tWrPuvKkXaNpayNqqCRHHdEPik/\n" \
                     "QOui6W8KQ3VdxQ9G5zloepuG7EiUTw9HO+uP6GczXa5lbxbOxdTMaIp3knOUoGA5\n" \
                     "2dyv2PIf8UJhFCJ2z7bJBtkk5f7kugRf2Pd/ZMW8J32f7QkNFjTY9lt4pWovDHiX\n" \
                     "+HXzal85hjuR5BemPk8S9wb7YHO7bUlveReJi7X9s9/y69cCAwEAAaOCAnkwggJ1\n" \
                     "MB8GA1UdIwQYMBaAFFmkZgZSoHuVkjyjlAcnlnRb+T3QMB0GA1UdDgQWBBQNDGMK\n" \
                     "aiAU5QSI2h+4c5AyyPq5kzAaBgNVHREEEzARgg9hcGkuY29uZWN0LnBsdXMwDgYD\n" \
                     "VR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjA7BgNV\n" \
                     "HR8ENDAyMDCgLqAshipodHRwOi8vY3JsLnNjYTFiLmFtYXpvbnRydXN0LmNvbS9z\n" \
                     "Y2ExYi5jcmwwIAYDVR0gBBkwFzALBglghkgBhv1sAQIwCAYGZ4EMAQIBMHUGCCsG\n" \
                     "AQUFBwEBBGkwZzAtBggrBgEFBQcwAYYhaHR0cDovL29jc3Auc2NhMWIuYW1hem9u\n" \
                     "dHJ1c3QuY29tMDYGCCsGAQUFBzAChipodHRwOi8vY3J0LnNjYTFiLmFtYXpvbnRy\n" \
                     "dXN0LmNvbS9zY2ExYi5jcnQwDAYDVR0TAQH/BAIwADCCAQIGCisGAQQB1nkCBAIE\n" \
                     "gfMEgfAA7gB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7IDdwQAAABZdqj\n" \
                     "zmYAAAQDAEYwRAIgIFpoByHZImSkfYRGuCR84KNS6CWwH1A4RET4uso1lD0CIFrZ\n" \
                     "onblq2xKbk5uSz+bPNSutm7JXflz15X/F/WoH3GSAHUAh3W/51l8+IxDmV+9827/\n" \
                     "Vo1HVjb/SrVgwbTq/16ggw8AAAFl2qPPTAAABAMARjBEAiBTicLRGfJCVyISxE4R\n" \
                     "4KdZaoR1NRXOOmbqXJk7JAwLvgIgD44N4uuEh/ihpULn9v492RBeenbqOT/plMXD\n" \
                     "Z1rd2QswDQYJKoZIhvcNAQELBQADggEBACOnPLGoKHJIqf9RmIXJ4aBBL0KGe5Ws\n" \
                     "0ro0QneesZthr/7KVfEtTM80Er3etpI+WMPodtWTWQRP5jqHMOb/LeDoHw/hXjlH\n" \
                     "bQhHA1iQs6I6Hg2MSVMYYirpLpnyFMd8CZgqtICwfc1AOp4A6ts9b/7NtgjeIzCr\n" \
                     "K6llHJCf5xsaEIOct6V9cW/aQd86zy28b+/7YNCgYlYtLsBHGqcWiONRpKvDZAu4\n" \
                     "+Y0Mt8l4npggbzkQOBpGJoLZWXCIYhPY2AZKjTFBanuGrCwyECzAWsaEaESk41cL\n" \
                     "fmdHhlLSYOT/1JODzStpr7OYLKG70ewH/eZwiuMyeEHlVzwLhi5wkUQ=\n" \
                     "-----END CERTIFICATE-----\n";

void setup()
{
    // シリアル通信の初期化処理
    Serial.begin(115200);
    delay(1000);

    // WiFiの初期化処理
    WiFi.begin(ssid, password);

    // WiFi接続待ち処理
    while (WiFi.status() != WL_CONNECTED)
    {
        delay(1000);
        Serial.println("Connecting to WiFi..");
    }
    Serial.println("Connected to the WiFi network");

    // 時刻同期処理
    configTime( 0, 0, "ntp.nict.jp");
    delay(1000);
}

void loop()
{
    time_t t;
    struct tm *tm;
    char time_data[20];
    char send_data[256];
    int senser_val = 0;
    float volt = 0.0;
    float temp = 0.0;

    // WiFi接続確認
    if ((WiFi.status() == WL_CONNECTED))
    {
        // Web API処理
        HTTPClient http;

        // URLの設定
        http.begin("https://api.conect.plus/v1/XXXXXXXXXXXXXXXXXXXXX/data", root_ca);

        //content-typeの設定(JSON)
        http.addHeader("Content-Type", "application/json");

        // 現在時刻を取得(UTC)
        t = time(NULL);
        tm = localtime(&t);
        sprintf(time_data, "%04d-%02d-%02d %02d:%02d:%02d",
            tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
            tm->tm_hour, tm->tm_min, tm->tm_sec);

        // ADC Ch0から温度センサーの出力電圧を取得
        senser_val = analogRead(A0);
        volt = ((float)senser_val / 4096.0) * 5.0;
        temp = (volt - 0.5) * 100.0;

        // 送信データ生成
        sprintf(send_data, "{\"deviceName\": \"ROOM01 Monitor\",\"key\": \"temperature\","\
                "\"sensingAt\": \"%s\"," \
                "\"value1\": %.1f}", time_data, temp);
        Serial.println(send_data);

        // Web API呼び出し(POST)
        int httpCode = http.POST(send_data);

        // ステータスの確認
        if (httpCode > 0)
        {
            String payload = http.getString();
            Serial.println(httpCode);
            Serial.println(payload);
        }
        else
        {
            Serial.println("Error on HTTP request");
        }

        // リソースの解放
        http.end();
    }

    delay(10000);
}

 

 

※プログラムの解説

・変数ssidpasswordに、実行環境の無線LAN情報を設定してください

・変数root_caに、前章で取得したルート証明書をテキストエディタで開き、転記します。

・関数setup()は、起動時に一回呼ばれます。ここで、必要な初期化処理を行っていきます。

 今回は、以下の処理を行っています。

            シリアル通信の初期化処理(デバッグ出力用)

            WiFi接続処理

            WiFi接続完了待ち処理

            時刻同期処理(ntpサーバーに時刻を問合せ、ボードに設定します)

・関数loop()は、その名の通り、ボードが起動している間、繰り返し呼び出される処理です。

 ここで、実現したい処理を記述します。

 今回は、以下の処理を行っています。

            WiFiの接続確認

            Web APIとしてアクセスするURLの設定(Web API設定で確認したURLを設定)

            Content-Typeの設定(Conect+Web APIでは、データはJSON形式なので、JSONを指定)

            現在時刻を取得(タイムゾーンはUTCです)

            ADCCh0から、温度センサーの出力電圧を取得して、温度(℃)に変換

            送信データを作成

                        deviceName: デバイス名を指定。今回は、"ROOM01 Monitor"としています。

                        key : conect+ のセンサー設定で登録したキー” temperature”を指定しています。

                        sensingAt : 計測日時をUTCで指定します。

                        value1 :温度センサーで計測した値を指定しています(小数点一桁まで)。

            Web API呼び出し(POST

            リソースの解放

  ※温度センサーの出力電圧は0℃の時0.5Vで、1℃ごとに10mV上がります。また、ADCの分解能は12bitです。

 

次回はプログラムを動かして、動作確認を行います。

4

 

 

 

c+

今後ともconect+をよろしくお願い致します。

Connecting great Designs with great Technologies.

 


事業提携のご相談などお気軽にどうぞ!

 

相談する(無料)

 

 

無料でIoTアプリをつくる