1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MenderでRaspberry PiのアプリケーションをOTAアップデートしてみる

Last updated at Posted at 2023-08-10

メカトラックス株式会社の@kiyonagaです。
Mender と Raspberry Pi を組み合わせてソフトウェアアプリケーションの OTA(Over the Air)アップデートを試してみます。

Menderとは

Menderは、オープンソースの OTA アップデートマネージャーです。
リモートでデバイスのソフトウェアをアップデートおよび管理するためのプラットフォームを提供します。
有料版では、動的なグループ化、段階的アップデート、差分更新などの高度な機能も利用可能となります。

公式ホームページ github

実行環境

・Windows PC(Windows10)
・Raspberry Pi 3 Model B
・4GPi
・slee-Pi3
・SIMカード(4GPiで使用、標準サイズを推奨)

デバイスセットアップ用
・USB-シリアル変換ケーブル
・Ethernet ケーブル

構成

アプリケーションを実行するデバイスは弊社の Pi-field(パイフィールド)を模して間欠動作させます。
block.png

Pi-field とは

Pi-field は、電源やネットワーク環境がない屋外等でもラズベリーパイを使用した環境モニタリング等が可能となる屋外稼動キットです。

外観 内部レイアウト
image.png image.png

Pi-field の詳細はこちらから

デバイスのセットアップ

今回は Pi-field 用 OS イメージを利用します。この OS イメージには 4GPi と slee-Pi3 の各ユーティリティソフトウェアがインストールされています。

Raspberry Pi のコンソールへのアクセスとネットワーク接続にはUSB-シリアル変換ケーブルと Ethernet ケーブルを使用します。

OS イメージを書き込んだ SD カードと SIM カードをスロットに挿し、Raspberry Pi を起動します。なお、4G(LTE)通信の設定はのちほど行います。

アップデートは起動後に適宜実行しておいてください。
IMG_2606.jpg
・Pi-field 用 OS イメージはこちらからダウンロード可能です。詳細は github をご参照ください
・SD カードへの OS イメージの書き込み手順についてはこちらから
・4GPi のセットアップ方法はこちらから

mender.io のアカウント作成

mender.io にアクセス後、アカウントを作成します。
https://mender.io/
Try for Free から進んでください。

今回はお試しなのでFreeプランを利用します。
https://mender.io/product/pricing

プランによる利用可能機能の違いは以下をご覧ください。
https://mender.io/product/features

アカウント登録が完了するとダッシュボードがご覧になれます。
dashboard.png

デバイスを mender.io に登録

Raspberry Pi を mender.io に登録します。
mender.io ダッシュボード上の Connect a device を押すと以下のようなポップアップが出ます。

1.GET STARTED クリック
getstarted.png


2.Device Type を選択して NEXT
devicetype.png


3.JWT_TOKEN、TENANT_TOKEN、wgetコマンドが表示される
client.png


4.JWT_TOKEN、TENANT_TOKEN、wgetコマンドを順にRaspberry Piのコンソールで実行
token.png
wget.png


5.しばらく置いておくとダッシュボードの DEVICES に登録される
name.png
※このとき Name は変更済みです


6.デバイスを選択して、Actions の Accept をクリック
device.png


7.SAVE をクリックしてデバイスの登録が完了

アプリケーションの作成

bash を使用して、Raspberry Pi のシステム時刻とCPU温度を取得し、4G(LTE)回線を介してサーバ(Google スプレッドシート)にデータを送信します。
OTA アップデートは、データの変化を見て確認します。

1.サーバの設定
適当なスプレッドシートで Google Apps Script を作成します。
シートに項目(sysdate、cpu_temp)を記載します。

Google Apps Script
function doGet(e) {
  //データを取り出す
  var sysdate = e.parameter.sysdate;
  var cpu_temp = e.parameter.cpu_temp;
  
  //現状Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();

  //1列目に日時、2列目にCPU温度 を追記
  sheet.appendRow([sysdate,cpu_temp]);
}

Google Apps Script の紹介、説明は省きます。
デプロイを忘れずに。


2. 実行スクリプトの作成(アップデートの対象)
/opt/demo に gas.sh を配置します。demo ディレクトリは事前に作成しておいてください。
取得したデータをサーバに送信後、起動アラームを設定してシャットダウンするという内容です。

gas.sh
#!/bin/bash

interval_min=5
DATE=$(date +'%Y/%m/%d %H:%M:%S')
CPU_TEMP=$(vcgencmd measure_temp | sed -e "s/temp=\(.*\)'C/\1/")

wget --timeout=10 --tries=1 -O /dev/null "https://script.google.com/macros/s/***/exec?sysdate=$DATE&cpu_temp=$CPU_TEMP"

current_min=$(date +'%M')
remainder=$((current_min % interval_min))
add_min=$((interval_min - remainder))
wakeup_datetime=$(date +'%Y%m%d %H:%M:%S' -d "now +$add_min minutes")

sleepi3alarm set "$wakeup_datetime"
sleep 60
shutdown -h now

※1. 起動アラームの設定は slee-Pi3 の機能を利用します。
※2. スクリプト中の sleep 60 は、OTA アップデート用の時間確保のために入れています。想定されるアップデートの容量によって Raspberry Pi の稼働時間を調整してください。
※3. Pi-field 実機の場合は、間欠起動の間隔を10分以上取ってください。また、起動時間が長くなるほどバッテリーを消費するのでご注意ください。


3. スクリプトの自動実行を設定
/etc/systemd/system に mender-demo.service を配置します。
起動時、4G(LTE)通信の接続確立後に gas.sh を実行する設定です。

mender-demo.service
[Unit]
Description=Demo Application
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c "while ! ip a show wwan0 | grep -q 'inet '; do sleep 1; done"
ExecStart=/usr/bin/bash /opt/demo/gas.sh

[Install]
WantedBy=multi-user.target

4.自動実行設定の有効化
以下コマンドをコンソールで実行します。

sudo systemctl enable mender-demo.service

5.4G(LTE)通信の設定
以下コマンドをコンソールで実行します。
接続名、APN、ユーザー、パスワードはご利用の SIM カードに合わせて変更してください。

sudo nmcli con add type gsm ifname "*" con-name 「接続名」 apn 「APN」 user 「ユーザー」 password 「パスワード」

詳細はgithubをご参照ください。

コマンド実行後、4GPi 基板上の青 LED が点滅すると 4G(LTE)通信の接続が確立しています。


6.動作確認
Raspberry Pi を再起動させます。
Ethernetケーブルは抜いておいてください。
しばらく放置して、だいたい5分ごとにデータが送られてきているのを確認できました。
spr (2).png

アプリケーションをアップデート

ようやく本題の OTA アップデートを行います。
基本的な操作はマネージャー(Webアプリケーション)上で行います。
あらかじめ Raspberry Pi 内の gas.sh と同じものを Windows PC に保管しておいてください。

1.サーバとスクリプトに変更を加える
Windows PC で cpu_volt の取得と送信を追加します。

Google Apps Script
function doGet(e) {
  //データを取り出す
  var sysdate = e.parameter.sysdate;
  var cpu_temp = e.parameter.cpu_temp;
  var cpu_volt = e.parameter.cpu_volt;
  
  //現状Activeになっているsheetを取得
  var sheet = SpreadsheetApp.getActiveSheet();

  //1列目に日時、2列目にCPU温度、3列目にCPU電圧を追記
  sheet.appendRow([sysdate,cpu_temp,cpu_volt]);
}
gas.sh
#!/bin/bash

interval_min=5
DATE=$(date +'%Y/%m/%d %H:%M:%S')
CPU_TEMP=$(vcgencmd measure_temp | sed -e "s/temp=\(.*\)'C/\1/")
CPU_VOLT=$(vcgencmd measure_volts | sed -e "s/volt=\(.*\)V/\1/")

wget --timeout=10 --tries=1 -O /dev/null "https://script.google.com/macros/s/***/exec?sysdate=$DATE&cpu_temp=$CPU_TEMP&cpu_volt=$CPU_VOLT"

current_min=$(date +'%M')
remainder=$((current_min % interval_min))
add_min=$((interval_min - remainder))
wakeup_datetime=$(date +'%Y%m%d %H:%M:%S' -d "now +$add_min minutes")

sleepi3alarm set "$wakeup_datetime"
sleep 60
shutdown -h now

2.アーティファクトの作成
ダッシュボードの RELEASES に移動後、画面右上の UPLOAD をクリックします。
add0.png


3.アップデート用のファイルを選択

ファイルを選択
up.png
/opt/demo へ配置する設定に変更
add1.png
問題なければ UPLOAD ARTIFACT をクリック
add2.png
※5. 4G(LTE)回線を使用するため、アップデート容量にはご注意ください。


4.アーティファクトの作成完了後、右下の Release actions から Deployment for this release を選択
add3.png


5.ダッシュボードの DEPLOYMENTS からアーティファクトの View detail をクリック
アップデートの状況が確認できます。
add4.png


6.アップデートの進捗確認
成功すると SUCCESS となります。
add5.png


7.動作確認
cpu_volt の項目が送られてくるようになりました。
check (2).png

以上で OTA アップデートのデモは終了です。
今回は1台分のアプリケーションを書き換えただけですが、複数台同時にアップデートも可能ですし、プランや設定を変更することでさらに柔軟な OTA アップデートができそうです。

最後に

Pi-field は屋外での利用を想定しており、電源やネットワークの制約下でも稼動できるように設計されています。
一方で以下のような課題もあります。

・人の手の届かない場所に設置されることもあるため、ソフトウェア変更やアップデートが困難
・間欠動作を前提としているため、遠隔ログインでアップデートなどを行う際は起動タイミングに注意が必要

Menderの導入により、ユーザはアップデート内容を登録し、アップデートの完了を待つだけです。
これにより、先述の課題が解決し、Pi-fieldのような屋外稼動機器の保守作業が効率的に行えます。

補足

1.デバイス側の Mender の設定について
基本的にはアップデートの有無確認をデバイス側からポーリングします。
ポーリング間隔やリトライ回数などの調整は以下の設定ファイルで行います。
/etc/mender/mender.conf
config.png
設定可能項目の詳細はこちらから
今回のデモでは設定値を変更していません。

2.データ収集用のサーバについて
今回の目的は OTA アップデートを試すことなので視覚化が簡単そうな Google スプレッドシートでデータを収集しました。
設定等が簡易な一方で、URL が分かれば第三者からでもデータの改ざんができてしまいます。
あくまでも簡易的な動作確認用のものとご留意ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?