見出し画像

【GASでIoT】GASで「ラズパイ Pico W」から、Googleスプレッドシートへ の読み書きにトライ!(その5~HTTPSクライアントのサンプルコードを試す~)

エクセルのクラウド版ともいうべき、Googleスプレッドシートに対し「ラズベリーパイ Pico W」使って読み書きする、「お手軽IoT」の実装にトライする記事です。


手元環境では「MicroPython」を使ったプログラムが上手く実装できなかったため、「C」言語で「Arduino IDE」を使ったプログラミングを進める事にしました。

環境構築ができたところで、読み書きに使う、スプレッドシートとGASも用意しました。

今回は「Arduino IDE」で使う「ボードマネージャ」に付属のサンプル・スケッチ(プログラム)を使って、「HTTPS」へのアクセスを試してみます。

この記事は、一介のアマチュアが、断片的な手がかりを寄せ集め、試行錯誤しならがら行った記録です。

失念による「手順の記載もれ」、たまたま上手くできた条件を見逃している「前提条件の未記載」、誤認や理解の浅さによる「誤り」を含んでいる可能性が大いにあります。

うまく再現できない場合があることをご了承頂き、自己責任、自己解決を前提にお読み頂くことをお願いします。


「ラズベリーパイ Pico W」を使ったアクセスの方針


マイコンを使ったネット環境へのアクセスでは、イフト(IFTTT)などの便利なサービスがよく使われています。

これらのサービスは、データの橋渡しを行うものですが、これを利用すると、通信が簡便な「HTTP」で始まるサイトでデータを受けた後、目的とするGoogleスプレッドシート(「HTTPS」で始まるサイト)にデータを中継することができそうです。

しかし、システムの形をシンプルにするため、今回はこうしたサービスは使わずに、「PicoW」からスプレッドシートへアクセスする方針にしたいと思います。

また、スプレッドシートにアクセスするためのAPI(ネット上の通信サービス)も使わない方針とします。

「PicoW」からこうしたAPIを使ってアクセスするためには、APIを(Googleログインなしに)「誰でも使える」モードにしておく必要があります。これは安全上の不安がありますので、こうした手段は使わない前提で考えたいと思います。

「Arduino IDE」のサンプルプログラム~クライアントでのHTTPSアクセス~


では早速、HTTPS://~で始まるサイトへの、「ラズベリーパイPicoW」からのアクセスを試してみましょう。

実は、「PicoW」を使ったネット通信については、調べた感じでは、公開されている多くの情報が、ラズベリーパイ側を「サーバ」として通信するもので、「クライアント」として、特定のURLにアクセスする情報はあまり多くありません。

HTTP://~ではなく、HTTPS://~へのアクセス例は更に少なく、参考になるプログラムの例がなかなか見つかりませんでした。GoogleスプレッドシートにアクセスするためにはHTTPS://~へのアクセスは必須ですので困ったことです。

ところがそんな希少なHTTPS://~へアクセスするプログラム例が、「Arduino IDE」のサンプルプログラムにはあるのです。

以下、Pico用のボードマネージャを導入している事が前提ですので、まだの場合は済ませておいてください。参考記事はこちらです。

サンプル・プログラムの利用


「Arduino IDE」から、「ファイル」⇒「スケッチ例」を開くと、サンプルプログラムを表示されます。

Pico用のボードマネージャをインストールしていれば、「Raspberry Pi Pico Wのスケッチ例」というカテゴリが表示され、ここに「HTTPClient」というグループが見つかるはずです。

ここにある、「BasicHttpsClient」というサンプルを流用します。これを選択し、適当な名称で保存してください。

スケッチ(プログラム)の内容は、以下のGIT(プログラム情報などの保存サイト)のサイトでも、「BasicHttpsClient.ino」として公開されています。


プログラムの修正

このプログラムを利用するには、WiFiのSSIDなどを打ち替える必要があります。

以下の冒頭部分をご覧ください。

/**
   BasicHTTPSClient.ino

    Created on: 20.08.2018

*/


#include <Arduino.h>
#include <WiFi.h>
#include <HTTPClient.h>


★WiFiのSSIDとパスワードを打ち替える★

 #ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK "your-password"
#endif

・・・以下略・・・

上の最後の方に、"your-ssid"と "your-password"とある部分を、各自利用しているWiFiのSSIDとパスワードに打ち替えてください。

これで自分の環境でプログラムが使える様になります。

サンプル・プログラムの優れた点1

このサンプル・プログラムは、シンプルに、「HTTPSで始まるサイトにアクセスして、レスポンスを受け取る」という機能だけを実装しています。

余計な記述がないので、「通信してレスポンスを受け取る」部分を他のプログラムに引用しやすいのです。

キーとなる部分は以下の3行です。★のコメント部を参照ください。

・・・前略・・・ 


void loop() {

★ここで、特定のURLにアクセス★
    if (https.begin("https://jigsaw.w3.org/HTTP/connection.html")) {  // HTTPS

・・・略・・・ 

★ここで、レスポンスを受け取る★
          String payload = https.getString();

★ここで、受けたレスポンスをモニターに表示する★
          Serial.println(payload);
・・・略・・・ 
}

アクセスするURLを書き換えたり、受け取ったレスポンスを処理する場合に、余計な機能が元のプログラムにないので、非常に引用し易くなっています。

サンプル・プログラムの優れた点2


また、アクセスのプロセスが、かなり細かくアナウンスする記述も含まれている点も大変有難い部分です。

たとえば、HTTPSへのアクセスでは、後述するSSL認証が不可欠ですが、この認証状況についてのアナウンスが以下の様に記述されています。

・・・前略・・・ 
  
    switch (cnt) {

★SSL認証に失敗した場合のアナウンス★
      case 0:
        Serial.println("[HTTPS] using insecure SSL, not validating certificate");
        https.setInsecure(); // Note this is unsafe against MITM attacks
        cnt++;
        break;

★SSL認証に成功した場合のアナウンス★
      case 1:
        Serial.println("[HTTPS] using secure SSL, validating certificate");
        https.setCACert(jigsaw_cert);
        cnt++;
        break;
      default:

★SSL認証が設定されていない場合のアナウンス★
        Serial.println("[HTTPS] not setting any SSL verification settings, will fail");
        cnt = 0;
    }

・・・後略・・・ 

アクセス段階の理解に大いに役立つでしょう。

サンプル・プログラムの優れた点3

HTTPSへの接続には、SSL認証というプロセスを経る必要があります。

このプロセスは、クライアント側で「ルート認証」という長いパスワードを用意しておいて、これをサーバ側に提示するプロセスです。

OSのある他のRaspberryPiシリーズではユーザは意識しないで済むプロセスですが、「PicoW」の様なマイコンでは、「ルート認証」を、アクセスするサイトに応じて、プログラム内に記述しなければなりません。

サンプル・プログラムは、この「ルート認証」を、非常に記述しやすい形で表現されています。

・・・前略・・・

const char *jigsaw_cert = R"EOF(
-----BEGIN CERTIFICATE-----
MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw
CQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU
MBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw
MDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp
Y2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA
A4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yB

・・・

h6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4
7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J
ZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef
MgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/
Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT
6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ
0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm
2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb
bP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c
-----END CERTIFICATE-----
)EOF";

・・・後略・・・ 


ユーザは、ルート認証を調べてコピーし、「-----BEGIN CERTIFICATE-----」から「-----END CERTIFICATE-----」の間を書き換えれば済む様になっています。

これも非常に便利な点です。

サンプル・プログラムのアクセス用に用意されているサイト

このサンプル・プログラムのアクセス用に用意されているサイトは、以下の様なものです。


ここにアクセスすると、上記サイトの内容をテキストとして受け取れるはずなので、それを試してみよう、というのがこのプログラムです。

テキストはタグ付きテキスト、いわゆるHTML文書として受け取れます。ブラウザがあれば、上記の様に文字が装飾されて見えますが、今回は、テキストのままで表示されるはずです。


サンプル・プログラムの書き込みと実行


WiFiのSSIDとパスワードを書き換えたら、早速PicoWに書き込んでみましょう。(プログラムの保存を先に忘れずに)

まず、USBでPicoWをPCに接続します。

ArduinoIDEでは、ボードマネージャを「Raspberry Pi Pico W」を選びます。

また、「ツール」メニューで、ポート接続を確認します。(ポート番号は各自の環境で違います。

新品のマイコンでは、「WF2ボード」などと表示されますが、気にせず進めてください。次回からポート番号が表示されます。

ヘッダ部分の⇒アイコンを押して、書き込みを始めます。

じっと待ちます。

・・・・

・・・

かなりかかりますが、書き込みまで終了したら、自動的にコードが実行されます。

「ツール」から「シリアルモニタ」を表示します。

何回かのアクセスエラーの後、以下の様にHTMLテキストが表示されれば成功です!

ラズベリーパイPicoWで、HTTPSへアクセスできました!

ボードマネージャとプログラムの組み合わせが適切でない場合、プログラムは稼働しない事があります。
この場合でもコンパイルまでは何のエラーもなく進むので注意ください。

Earle F. Philhower, III 氏に感謝

このボードマネージャとプログラムは、Earle F. Philhower, III氏が作成して公開しています。


earlephilhower (Earle F. Philhower, III) · GitHub



ラズベリーパイ Pico用のボードマネージャは、「RP2040」というキーワードで検索すると「Arduino MBed・・・」「Raspberry Pi Pico/Rp2040・・・」というボードマネージャが見つかりますが、後者の方です。

素晴らしいツールを提供いただいた氏に感謝いたします。

さて、次の記事では、このコードを修正してGASやスプレッドシートへのアクセスする方法をご紹介します。


この記事が気に入ったらサポートをしてみませんか?