Xojo で スタンドアローン Web アプリを RaspberryPi で動かす


Xojo を cgi 動作させる場合の問題点

今まで Xojo を Web アプリ作成ツールとして使ってきました。
Apache を Ubuntu Linux PC サーバや RaspberryPi で動かしたうえで、Xojo アプリケーションを cgi として登録するやりかたです。

「Xojo で Web アプリ Tips ( Web1.0 ) : cgi として動かすノウハウ」
https://qiita.com/nanbuwks/items/b73472ac210a9c873807#cgi-%E3%81%A8%E3%81%97%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%99%E3%83%8E%E3%82%A6%E3%83%8F%E3%82%A6

しかしながら様々な問題があります。

  • Xojo 2020 r1 以降は cgi としてのビルドができなくなっている。
  • 日本語名での cgi 動作ができない
  • 謎の不具合

日本語名での cgi 動作ができない問題は以下で解説しています。
「Xojo で Web アプリ Tips ( Web1.0 ) : アプリ名の制限」
https://qiita.com/nanbuwks/items/b73472ac210a9c873807#%E3%82%A2%E3%83%97%E3%83%AA%E5%90%8D%E3%81%AE%E5%88%B6%E9%99%90

謎の不具合というのは、

「Xojo で Web アプリ Tips ( Web1.0 ) : トラブルシューティング」

のようなことが度々発生したり、Webアプリで timer を発動したら他のスレッドが停止したりということが起こっていた。

これらをの問題を、cgi 動作で解決するのは不可能と判断し、cgi 動作の代わりにスタンドアローンWebアプリとして動かすことにした。今回は例として RaspberryPi 上で動かし、説明する。

スタンドアローン Web アプリとは

サーバとなるマシンで、あらかじめビルドした Xojo Web アプリを実行しておく。
そうすると指定の待ち受けポートが開き、Xojo Web アプリは Webサーバとして動作する。

複数の Xojo Web アプリを同一のサーバマシンで動かすには、ポートを変えて動かすとよいみたいだ。

環境

  • Xojo 2019 r2
  • Raspberry Pi 3

作成方法

XojoのBuild Settins で設定します。

  • Linux をチェックし、アーキテクチャを ARM 32-bit を選択。
  • Shared で、 Deployment Type を Stand Alone に変更。

「Build」すると、ファイルが生成されます。この 1 つ上の階層のアプリケーション名フォルダごとコピーするのが良いでしょう。

RappberryPiに転送して、設定します。


$ cd EntryBlood
$ sudo chmod 555 EntryBlood
$ ls -alh
total 3.8M
drwxr-xr-x 4 www-data www-data  16K Dec 25 07:25  .
drwxr-xr-x 8 www-data www-data  16K Jan  1  1970  ..
-r-xr-xr-x 1 www-data www-data 3.7M May 13  2021  EntryBlood
drwxr-xr-x 2 www-data www-data  16K Dec 25 07:25 'EntryBlood Libs'
drwxr-xr-x 3 www-data www-data  16K Dec 25 07:25 'EntryBlood Resources'

以下で起動します。


$  sudo ./EntryBlood --port=8080

sudo は無くてもOKですが、後で自動起動で設定することを考えて root での動作確認をしてみます。

起動オプションなどは以下で参照できます。

ブラウザで、http://(RasbperryPiのIPアドレス):8080 として開きます。

RaspberryPi 上で自動起動を設定

問題ないようであれば、RasbperryPiが起動したら自動で起動するように設定します。

/etc/rc.local に書くのですが、今回は USB メモリにWebアプリファイルを配置して、USBメモリごと差し替えるように工夫しました。

.
.
.
 sleep 45

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

python3 /home/pi/LCDmessage.py $_IP
mount -o exec,uid=33,gid=33 /dev/sda1 /mnt
/mnt/trans.sh & > /dev/null

exit 0

上記で、

  • LANが安定するまで待つ
  • IPアドレスを取得
  • LCDにIPアドレスを出力
  • USBメモリを www-data 権限でマウント
  • USBメモリ中の初期化スクリプト「trans.sh」を実行

USBメモリ中には、trans.sh と Webアプリプログラムが収録されているフォルダが入っています。
trans.sh 内部で、Xojo の Web アプリを実行しています。

/mnt/EntryBlood/EntryBlood --port=8080 &

これで、起動時に RaspberryPi 上で Webアプリが動作するようになります。