M5Stackを使い、ZED-F9P/M5F9Pの測位データをGoogle Driveにアップロードする方法(その1)

地盤の動きや水位などをセンチメータ精度で測定し、異常があった場合に関係者にメールを送るといったシステムを作る場合、測位データをクラウドのサーバにアップし、クラウド上で判定・通知処理を行うようにすると、アルゴリズムの変更やメール、SNSなどの配信処理や表示等、柔軟、迅速に対応できます。

今回、測位データをGoogle Driveにアップロードする方法を試しました。

Google Driveにアップロードする際に問題になるのが認証手続きで、M5Stack等のIOT機器の電源をオンした後、ユーザのスマホ等での操作をしなくてもアップロードできる必要があります。
そうしておかないと、IOT機器の停電後の自動復帰ができなくなります。

そのような認証手続きとして、Google Driveでは次の2通りの方法があります。
1.サービスアカウントを作成する方法
2.Google Apps Scriptを使う方法

このうち、サービスアカウントを作成する方法を試してみたところ、アップロードは問題なくできるのですが、Google Driveに保存されたファイルはサービスアカウントのMy Driveに保存され、そのファイルはユーザアカウントで削除ができませんでした。
何か方法があるのかもしれませんが、保存したファイルの扱いに不便さがあるようなので、この方法でなく、Google Apps Scriptを使う方法にしました。

1.構成

構成は次の図のとおりで、装置としてはZED-F9P/M5F9PをM5Stackに装着したGNSS-RTK受信機とアップロード用のM5Stack、およびインターネットに接続されたWifiルータで構成されています。

構成図

RTK受信機のM5Stackで測位したデータはWifiルータを通してTCP通信でアップロード用のM5Stackに転送され、そのデータはHTTPのPOSTによりGoogle Driveのサーバにアップロードされ、Google DriveのGoogle Apps Scriptで書かれたプログラムにより、POSTされたデータを指定のフォルダに格納するようになっています。

今回の実装で測位用とアップロード用と別々のM5Stackに分けたのは、測位用のM5StackのRAM容量が不足し、アップロードの機能を追加するには大幅なファームウェアの変更が必要となるためです。
ただ、分けた事により、測位用のM5Stackは何も変更せず、現在使用中のまま、新たにGoogle Driveへのアップロードが可能になります。
また、アップロード用のM5Stackは測位データだけでなく別の各種のデータや画像を送る事にも利用可能です。

アップロードに必要な設定は、Google Driveの設定とアップロード用M5Stackの設定となります。

2.Google Driveの設定

Google Driveでの設定は次のとおりです。

最初にGoogle Driveにログインします。
ログイン後、”+新規”ボタン → ”その他”とクリックすると、次の画面が表示されます。
この右下の選択画面にある”Google Apps Script”をクリックします。

Google Drive設定1

次の画面が表示されます。

この右側の"function myFunction(){}の3行を次の内容に書き換えます。
書き換えはコピーペーストで行なって下さい。

// Post data
// filename=xxx&folder=xxx&data=xxxx
//
function doPost(e) {
  //var data = e.parameters.data;
  var data = Utilities.base64Decode(e.parameters.data);
  var fileName = e.parameters.filename;
  console.log("filename=%s",fileName);
  if (fileName == null || fileName == "" ) {
    fileName = Utilities.formatDate(new Date(), "GMT+9", "yyyyMMdd_HHmmss") + ".txt";
  }
  var folderName = e.parameters.folder;
  if ( folderName == null || folderName == "") folderName = "m5f9p";
  var mimetype = e.parameters.mimetype;
  var blob = Utilities.newBlob(data, mimetype, fileName );
  
     // Save data to Google Drive
  var folder, folders = DriveApp.getFoldersByName(folderName);
  if (folders.hasNext()) {
    folder = folders.next();
  } else {
    folder = DriveApp.createFolder(folderName);
  }
  var file = folder.createFile(blob); 
  return ContentService.createTextOutput('Success')
}

書き換え後、次の画面になればOKです。
次に、メニュの欄で、フロッピーディスクアイコンをクリックし、入力内容を保存します。

次に青色の”デプロイ”ボタンを押し、表示されたメニュのうち、”新しいデプロイ”をクリックします。
次の画面が表示されます。

”種類の選択”の右側の歯車マークをクリックし、表示されたリストから”ウェブアプリ”をクリックします。
次の画面が表示されます。
この画面では”アクセスできるユーザ”は”全員”に変更します

”デプロイ”ボタンをクリックすると次の画面が表示されます。

”アクセスを承認”ボタンを押すと次の画面が表示されます。

表示されているアカウントをクリックします。
次の画面が表示されます。

”詳細”をクリックします。
次の画面が追加されます。

”無題のプロジェクト(安全ではないページ)に移動”をクリックします。
次の画面が表示されます。

”許可”をクリックします。
次の画面が表示されます。

この画面で、”ウェブアプリ”の欄のURLはあとで必要になりますので、”コピー”を押してクリップボードにコピーしておきます。
以上でGoogle Driveの設定は完了です。

3.アップロード用M5Stackの設定

アップロード用のM5Stackで行うのは、ファームウェアの書き込みとINIファイルの設定です。

ファームウェアの書き込み

Windowsのパソコンとアップロード用のM5StackをUSBで接続し、COMポート番号をデバイスマネージャーで調べて下さい。
ファームウェアはm5upload_FW_v1_0_0.zipをダウンロードし、解凍して下さい。
コマンドプロンプトを開き、解凍したフォルダに移動した後、
writeFW COMn
を実行して下さい。nはデバイスマネージャーで調べたポート番号を指定して下さい。

INIファイルの設定

マイクロSDカードを用意し、フォルダとして”m5upload"を作成して下さい。
作成したフォルダに次の内容をコピーした”m5upload.ini"という名称のファイルを作成して下さい。

; M5UPLOAD INI file

; Wifi -------------------------------------------
[wifi1]
ssid = xxxxxxx
password = xxxxxxxx

; データサーバ
[data]
ip = xxxxxxx
port = 10000

;Google Apps Scirpt
[gas]
url = https://script.google.com/macros/s/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/exec

; アップロード
[upload]
folder = m5upload
period = 5 ;分単位

コピーした上記の内容で、xxxxxxの文字の部分を実際の環境に合わせて修正して下さい。

[data]項目のipは測位用M5StackのIPアドレスです。
測位用のM5Stackとアップロード用のM5Stackは同じWifiルータに接続し、同じネットワーク内にあるようにして下さい。

[gas]項目のurlはGoogle Driveの設定で取得したURLです。

[upload]のfolderはGoogle Driveにアップロードしたファイルを格納するフォルダ名称です。
periodはアップロードする時間間隔で分単位で指定して下さい。

4.使用方法

測位用のM5Stackでは通常の測位を行っておき、アップロード用のM5Stackを起動し、Wifiルータに接続します。

Wifiルータに接続できると、アップロード用のM5Stackでは測位用のM5Stackからのデータを受信し、マイクロSDカードにデータを保存します。
保存開始からの時間が上記のINIファイルで設定した時間間隔(period)になると、Google Driveにアップロードします。

Google Driveに保存されたファイル名は gps_YYYYMMDD_hhmmss.log となっています。
YYYYMMDD_hhmmss の日時は日本標準時です。

保存及びアップロードを停止するにはアップロード用M5Stackの”Save”ボタンを押します。
再度”Save”ボタンを押すと保存とアップロードを再開します。

次の画像は動作画面で、左側のM5Stackがアップロード用です。
画面に表示されている数値は次のとおりです。
Num files to upload: アップロードが終わっていないファイル数。
Num times saved:   マイクロSDカードに保存した回数で約2KB毎に保存。
Num files uploaded: アップロードされたファイル数。

5.ソースコード

ソースコードはm5upload_src_v1_0_0.zipをダウンロードして下さい。
開発環境はArduino IDEです。

付記

データの取得方法とファイルの自動削除の機能を追加しました。
M5Stackを使い、ZED-F9P/M5F9Pの測位データをGoogle Driveにアップロードする方法(その2)」を御覧ください。