Raspberry Piでキオスク端末を開発するときにやった事

# 概要
社内プロダクト開発で、安価なキオスク端末を作成することになり人気のラズパイを使って開発を行いました。
社内プロダクトということで、自分のスキルセットと最近の技術動向を考慮しつつ自由に機材を選定できました。
気を付けたのは、部材の入手性の良さと価格です。
ラズパイは安価で、人気があるため長期間入手できるのが良いですね。
キオスク端末は、ラズパイに電源が入るとChromiumが自動起動して、特定のページを表示するようなシステムを想定しています。

# Raspbian
OSには、公式標準OSであるRaspbianを使用しました。
ラズパイは、Raspbian以外にも多くのOSを選択できますが、情報の入手しやすさを考慮して、Raspbianを選択しました。
電源を入れたら素早く起動して、Webページを表示してくれれば良いので、色々とサービスを止めたりしてカスタマイズできそうですが、今のところは、不要なソフトをアンインストールする程度のことしかしていません。

# キオスク端末化処理
### 端末起動時に、プログラムを自動起動させる
ラズパイでは、起動時にプログラムを自動起動させる方法が複数あるみたいですが、autostartを使いました。
ブラウザを起動する処理は、node.jsを使っています。
cpuinfoに、ラズパイの固有番号(シリアル)が記述されているので、ブラウザ起動時にURLパラメーターとして渡してやります。
Webページは、ログイン認証が掛かっていますが、個体識別を行う要件があるため、このようにしています。
個体識別の必要がなければ、autostartファイルで、直接ブラウザを起動した方が、速く起動します。

```bash:ターミナル
vi ~/.config/lxsession/LXDE-pi/autostart
```

```bash:autostart
@unclutter -idle 0.1 -root
@node /home/pi/browserexec/browserexec.js
```

```javascript:browserexec.js
const fs = require('fs');

fs.readFile('/proc/cpuinfo', 'utf8', function (err, text) {
    const line = /^(Serial)+[\s:0-9a-f]+\n/m.exec(text);
    const serial = line[0].substring(line[0].length-17).trim();

    const execSync = require('child_process').execSync;
    const result =  execSync('chromium-browser --noerrdialogs --kiosk https://testsite.net/?serial=' + serial);
});
```
### マウスポインタを消す
タッチパネルディスプレイを使っているためマウスカーソルを消します。
表示されなくなる訳でなくタッチした瞬間は表示され時間が経つと消える動作になります。
消えるまでの時間は、指定できます。
#### unclutterをインストールします。

```bash:ターミナル
sudo apt-get install unclutter
```
#### /etc/initab を編集

```bash:/etc/initab
#1:2345:respawn:/sbin/getty 115200 tty1
1:2345:respawn:/bin/login -f pi tty1 >/dev/tty1 </dev/tty1 2>&1
```
#### /etc/rc.local の exit 0 の前に次の行を追加

```bash:/etc/rc.local
su -l pi -c startx
```
### 左右スワイプでのヒストリーバック・フォワードを抑止
デフォルトのChromiumブラウザの設定では、ジェスチャーが有効になっていて、左右スワイプで、ページ履歴を移動できます。
キオスク端末は、SPAなので、履歴の移動を禁止する必要があります。
chrome://flags/#overscroll-history-navigation
へアクセスして、「オーバースクロール時の履歴表示」を無効にします。

### SDカードをROM化する
SDカードの有効書き込み回数は、他の媒体に比べると少なく長期運用すると破損する恐れがあります。
キオスク端末は、ローカルに情報を保存する必要が無いためROM化して、長寿命化処理を行います。
加えて、キオスク端末は家電のように、いきなり電源をオフされる運用を想定しているためROM化しないとOSが破損する可能性があります。
overlayfsは、ファイルシステムへの変更をRAMディスクで保持します。
ROM化しても見た目の動きの違いはありませんが、当然ながらRAMに保存されたデータは、再起動すると消えてしまいます。
#### overlayfsのインストール

```bash:ターミナル
cd /home/pi
sudo bash
apt-get install git rsync gawk busybox bindfs
dphys-swapfile swapoff
dphys-swapfile uninstall
update-rc.d dphys-swapfile disable
systemctl disable dphys-swapfile
git clone https://github.com/josepsanzcamp/root-ro.git
rsync -va root-ro/etc/initramfs-tools/* /etc/initramfs-tools/
mkinitramfs -o /boot/initrd.gz
echo initramfs initrd.gz >> /boot/config.txt
reboot
```
#### 書き込み可能に切り替えるスクリプト

```bash:wok.sh
#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    sudo mount -o remount,rw /dev/mmcblk0p1
    sudo grep -v initramfs /mnt/boot-ro/config.txt >/tmp/config.txt
    sudo cp /tmp/config.txt /mnt/boot-ro/config.txt
    sudo reboot
else
    echo Already write enabled
fi
```
#### 書込み禁止に切り替えるスクリプト

```bash:wng.sh
#!/bin/sh

if [ -e /mnt/boot-ro/config.txt ]; then
    echo Already write protected
else
    sudo grep -v initramfs /boot/config.txt >/tmp/config.txt
    sudo echo initramfs initrd.gz >> /tmp/config.txt
    sudo cp /tmp/config.txt /boot/config.txt
    sudo reboot
fi
```