測位したcm級GPSのRTKデータをM5StackのSDカードへログするのですが、後でPCでアクセスするのにSDカードをはずしたり転送するのが面倒なので、M5StackのSDカードを抜かないで、ファイルをそのままレンタルサーバーにアップロードするプログラムを見つけたので、実験したら首尾よく動作できました。
●動機
従来からラズパイ、マイコンを使ってHTTPサーバーを自前で構築してそこへ、データを送信してログする方法
は、多く紹介されてます。しかし、自前のHTTPサーバーを維持管理するのは大変なので、商用サーバーを
使ってみたいと思い検索してみました。
■注意(まだ信頼性確保できてませんので、参考までに)
0)未だデバッグ中ですが、5回に1回くらい送信できてない現象がでます。2回目で送信できたりばらつきがあります。サーバーのせいなのか、プログラムのせいか不明ですが、大事なデータはSDから消さないほうがいいです。デバッグではまっているので、ご関心のある方で本プログラムを完成していただければ助かります。
1)シリアル通信のように、SDログ無しで直接転送できるかどうかは、後日実験してみますが、大事な測定データなのでSDカードにログしておいたほうが安心です。
2)M5StickC,M5AtomなどSDカードがない場合は、SPIFFSに保存してあるファイルを転送することも可能です。サンプルプログラムはこれです。未だデバッグ中ですが、TeraTermですべて操作して動作できます。サーバーは自分で用意してください。https://gist.github.com/dj1711572002/31f73d5913ce249b464f583f4183c4d5
ご関心のある方で本プログラムを完成していただければ助かります。
■教えていただいたMSR合同会社様へ感謝
M5StickCのサンプルプログラムは下記記事にありました
「M5StickCでできること 〜SDカードのファイルをWebサーバーに送信する」
1)やっていること
HTTPのPOST命令を使って、SD内のファイルのデータをレンタルサーバーへ転送します。
2)仕掛け
短いPHPプログラムをレンタルサーバーへ設置して、ファイル格納フォルダも作成しておくと
そこに、M5StickCから送信したデータが入ったファイルを作ってくれます。
ファイル名は、受信開始時のタイムスタンプが名前になってますので、
SDカードのファイル名ではありません。
3)自分がやった変更点
このPgmは、SDをイニシャライズして新ファイルを一個だけ作ってそれを転送する仕様だった。
0)M5StickC用だったので、<M5Stack.h>に変更しました。LCD表示が逆さになるだけの違いです。
1)通信速度測定のため、サイズの大きなTXTファイルを作成して、時間計測を追加しました。
2)書き込み速度を向上させるために、転送中のPC表示、LCD表示はコメントアウトしました。
■レンタルサーバーは、Lolipopエコノミー月100円を試した
大事なコンテンツが入っている本ブログサーバーは、安全上使わないことにして、
新たに、月100円のLolipopサーバーエコノミーを新規契約して、(10日間お試しがあるから動作確認できます)20GBあるので、SDファイルのバックアップなら20GBで問題ないと思います。
■使える速度がでるか確認実験
プログラムで、529kBのファイルを作成してそれを転送して時間計測
<USBシリアルで115200bpsでファイルをPCへ転送した場合の時間を基準に比較>
サーバーへの回線速度3G格安データSIMのPocketWifiの場合
サーバーへの回線速度光回線で1gbpsでるFTTHを使った場合
自分の普段使いのサーバーとLolipopサーバの比較
結果1:Lolipopサーバーでも9.5KB/secと他社サーバーと同等の速度がでている
結果2:光回線だとUSBシリアル115200bpsより速く転送できる
結果3:PocketWifiでもUSBシリアル115200bpsより10%程度遅いだけで転送できる
結果4:RTK測定ログ時間の半分以下で転送できるので、一回ログしたら即
サーバーへアップロードすればSDカードの中身に関係なくサーバーがログファイル置き場になって、PCからFTPダウンロードできる
■最大ファイル転送容量
=>8MBまで確認、時間かければいくらでもいけそうですが、我慢できなければ、SDカード抜いてPCへ挿して読めば済みます。
=>ボタン押し一発でアップロードしてくれる点がメリットです。
時間がかかるので、TXTファイルとして常識的な容量数十MBくらいはできそうです。
TXTファイルをSDカードに作成する時間も転送時間の1/7程度かかります。
1時間かければ、45MB近く転送できると思います。
LolipopをFFFTPで見に行くと、data_filesフォルダに転送したがファイル出来てました。
■手順
①レンタルサーバー選びと攻撃に備えた管理
自分の手持ちサーバーは使わないほうが安全です。万一、悪意のあるアクセスをされた場合
サーバーが壊されてしまうかもしれませんので、空っぽで攻撃されても痛くもかゆくもないサーバを用意して使います。大事なデータなら、アップロードしたらすぐPCにダウンロードしてサーバー上から消してしまいましょう。私もブログで使っているサーバー会社は使わないで、Lolipopを新規に作りました。Lolipopは、パーミッションが自動的についていたので何もしなくても
M5Stackからファイル書き込みができましたが、サーバー会社によってはセキュリティが固くて、ファイルアップロードが動作しない会社があります。
②レンタルサーバーへファイルをアップロードする操作の確認
FTPソフトを設定して、サーバーにフォルダーを作成して、PHPも設置しますので
サーバーへのファイルの置き方が判っていないとできません。
FFFTPの学習してください。下のリンクは、FFFTPの使い方です。
https://techacademy.jp/magazine/1670
③MSR合同会社様の記事内のPHPファイルを、FFFTPを使って、アップロードします。フォルダー data_files も同じフォルダー内に設置します。
■プログラムの準備
MSR合同会社様の記事のPgmは、M5StickC用で2個ありますが、
一番下の大容量版をコピペしてArduinoIDEでコンパイルします。
M5Stackで使うために、変更点を赤字でいれました。
原作pgmは、SDのファイルを毎回消してますが、私は、大容量のファイルを作って、時間計測するために改造しましたのでGISTでご覧ください。
https://gist.github.com/dj1711572002/7221088305b4134c12b292528fbd14de
プログラムを起動すると590KBのTXTファイルをSD上に新規作成します。そのファイルを転送する時間を測定して転送速度測定しました。
実用的なプログラムにするには、M5StackのSDファイル部分を自分の目的に合わせて変更します。
本プログラムは、サーバー上のファイル名はタイムスタンプしか付きませんので、SDファイル上のファイル名が反映されないので、ファイル内のデータでどのような場合のデータだったかわかるようにしておく必要があります。私の使い方では、GNSS-RTKのデータを書き込むので、正確な時間データ毎行に残っているのでデータが何かわからなくなることはありません。
■結果
このプログラムを走らせると、2分弱待つと、アップロード完了します。
FFFTPでdata_filesフォルダを開くとタイムスタンプ名のTXTファイルが出来上がてますので、開くと数値が1から順番の90000まで並んでます。
●以後
面白くなってきたので、M5AtomのSDカード(ATOMIC)をつけて、サーバーへアップロードさせます。応用がいろいろあるので、次回実用例をつくたら記事投稿します。