2020年5月31日日曜日

PlatformIOのremote機能を使ってみた


背景

PlatformIOはArduinoなどのプログラムを開発しやくすしてくれる便利な開発環境です。
説明ページを読んでいたらremoteという機能を見かけ、試してみると便利そうな機能だったので、備忘録を兼ねて使い方を共有します。

なお、remote機能で登場するPCの種類とできることはこちらです。

登場するPC
遠くのPC: リモートagentが起動しているPC
手元のPC: コマンド操作でリモートにプログラムを送るPC

出来ること
手元のPCでremoteプログラム書き込みコマンドを実行すると、手元のPCでプログラムをビルドして、遠くのPCがビルド済みのファイルをPlatformIOのサーバーを経由して受け取り、遠くのPCに繋がっている端末にプログラムを書き込めます。

使ったもの

  • 手元のPC
    Ubuntu18.04をインストールしたノートPCを利用しました。
  • 遠くのPC
    RaspbianをインストールしたRaspberry Piを利用しました。
  • PlatformIO
    手元のPCと遠くのPCの両方にインストールしてください。
    この記事で利用したバージョンは4.3.4です。
    コマンドで操作します。
    自分はpip3でPCにインストールしたPlatformIOを利用しました。
    VSCodeにプラグインをインストールしている場合も、VSCode内でターミナルを立ち上げればこの記事の内容を実行できます。
  • ESP32開発モジュール
    遠くのPCに接続して、手元のPCからのリモートコマンドでプログラムを書き込みます。

アカウント登録

手元のPCから遠くのPCへのファイル転送にPlatformIOのサーバーを経由するため、PlatformIOに会員登録する必要があります。
コマンドかコミュニティへのログインページで登録できます。

ブラウザでの情報入力で登録

コミュニティのトップページにあるLoginボタンをクリックし、ログインページの下の方にあるRegisterボタンをクリックすると登録ページが出てくるのでここで登録できます。


コマンドで登録

下記のregisterコマンドを実行すると、ユーザ名、メールアドレス、パスワード、姓、名を問われるので、順に入力すると登録できます。
pio account register

手元のPCでログインしてauth tokenを取得

登録したIDとパスワードでログインできます。
手元のPCで下記のloginコマンドを実行してログインしてください。
pio account login

ログインできたら下記のtokenコマンドを実行してauth tokenを取得してください。
パスワードを求められます。
pio account token

このauth tokenを利用して、遠くのPCはログインせずにPlatformIOのサーバーと連携させます。

なお、パスワードを忘れてしまった場合はforgotコマンド、ログインしているアカウントを見たければshowコマンド、ログアウトしたければlogoutコマンドなどがアカウント操作のコマンドとして用意されています。

遠くのPCでauth tokenを利用してagentを起動

auth tokenをPLATFORMIO_AUTH_TOKENという環境変数に格納しつつagent startコマンドを実行することで、ログインしなくてもauth tokenを発行したアカウントとしてPlatformIOのサーバーと連携するagentを動かせます。
プログラムは手元のPCからビルドして送信する仕組みなので、下記のコマンドはPlatformIOのプロジェクトで実行する必要はありません。どのフォルダで実行しても良いです。
(下記のコマンドは見やすくするためにauth tokenを短めにしていますが、自分が確認したauth tokenは100桁近くありました。)
PLATFORMIO_AUTH_TOKEN=XXXXXX pio remote agent start

agentの名前には実行するPCの名前が割り当てられますが、-nオプションで名前を付けることも可能です。
PLATFORMIO_AUTH_TOKEN=XXXXXX pio remote agent start -n myRasPi

遠くのPCからログアウトしてもagentを動かし続けたい場合はtmuxを利用したり、rc.localなどに起動時に実行するjobとして記述したりしてください。

手元のPCでagentを確認

agent listコマンドでアカウントが認識できるagentの一覧を表示できます。
pio remote agent list


遠くのPCでagentの起動に成功していれば、表示されるはずです。

ちなみに、同じ名前のagentが存在する場合は、名前は同じですがIDが異なるものが表示されます。


手元のPCから遠くのPCのagentに対してプログラムを書き込み

手元のPCでリモートのPCに接続されているESP32開発ボードにプログラムを書き込み書き込みます。
今回は起動時間を1秒ごとに送信するプログラムを書き込みます。

platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
src/main.cpp
#include <Arduino.h>

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.println(millis());
delay(1000);
}

remote runコマンドを利用して遠くのPCに接続されたESP32開発ボードにプログラムを書き込みます。
pio remote run -t upload

上記の書き方だと認識している全てのagentに対してupload処理を行います。
名前かIDを指定して特定のagentにのみupload処理を行うこともできます。
pio remote --agent [名前かID] run -t upload

agentは複数指定も可能です。
pio remote --agent [名前かID] --agent [名前かID] run -t upload

remote deviceコマンド使うことで、手元のPCで出力を遠くのPCに繋がったESP32開発ボードの出力を確認できます。
pio remote device monitor


remoteコマンドを利用して書き込みと動作確認ができました。

tokenの扱いは注意が必要

pio agent tokenコマンドで取得したtokenはremoteコマンドが制限なしに利用できるようなので、tokenが悪意あるユーザーに渡った場合、remote runのuploadでプログラムが書き換えられたりする可能性があります。

agentの起動のみを可能にする制限などがあれば良いのですが、今の所無さそうなので、誰でも見れる場所に置くのは止めたほうが良いと思います。

まとめ

PlatformIOのremote機能を利用して、遠くのPCに繋がった開発ボードに手元のPCからプログラムを書き込めました。

tokenがあれば書き込み要求ができてしまうので扱いに注意が必要ですが、開発時の一時的なプログラム書き込みに利用すると手間が減る場面がありそうです。

参考

PIO Remote
PIO Remote Agent
PIO Remote Run
PIO Remote Device

0 件のコメント :