はじめに
案件でラズパイを使ってBluetooth通信させたりセンサー付けて環境情報取ったりする機会が多くなってきたので備忘録としてラズパイ関連の記事を書いていこうと思います。
まずは導入編としてラズパイ上にWebサーバーを立ち上げてPCブラウザからアクセスしてHelloWorld!と表示させるまでの手順です。ラズパイ用の標準OSであるRaspbianのインストールからサーバーのセットアップまで書きました。
用意するもの
- Raspberry Pi 3 Model B(またはB+)
- SDカード(8GB以上あると安心)
- 操作用PC(ここではMacを想定)
ラズパイの初期設定
Raspbianのインストール
RaspbianのサイトからRASPBIAN STRETCH LITEのイメージをダウンロードします(GUIは不要なのでここでは軽量版を使います)。
PCにSDカードを挿してイメージを書き込みます。
diskutil list
sudo diskutil unmountDisk /dev/disk2
sudo dd bs=1m if=/path/to/img of=/dev/disk2
SSHの有効化
デフォルトだとSSHが使えないので使えるようにしておきます。
操作用PCにSDカードのbootボリュームをマウントしてSSH有効化ファイルを作ります。
cd /Volumes/boot
touch ssh
ラズパイのセットアップ
ラズパイにSDカードを挿して有線LAN、電源をつなぎます。
操作用PCでラズパイのIPを調べます。
ラズパイのMACアドレスはb8:27:ebで始まるようです。
arp -a | grep b8:27:eb
上記で出てきたIPアドレスにSSHで接続できればOKです。
ssh pi@172.17.1.113
# 初期パスワードはraspberryです。
Raspbianの初期設定
※以降のコマンドはrootに切り替えてから行う想定で書いています。
ミドルウェアの更新および必要なミドルウェアを適当にインストールします。
apt-get update
apt-get upgrade -y --fix-missing
apt-get install vim git -y
Wi-Fiに繋ぎたい場合はraspi-configの2 Network OptionsでSSID等の登録ができます。
raspi-config
DHCPでIPが変わると面倒なのでIPを固定します。
# 例
cat << EOS >> /etc/dhcpcd.conf
interface wlan0
static ip_address=172.17.1.113/16
static routers=172.17.0.1
EOS
HelloWorld!する
Node.jsとnpmのインストール
まずはaptでインストールします。
apt-get install nodejs npm -y
npmのアップデート。
npm i -g npm
Node.jsのバージョン管理としてnを使います。
npm i -g n
Stableバージョンに切り替え。
n stable
apt管理のNode.jsとnpmを削除
apt-get purge nodejs npm -y
モジュールの初期設定
npmの初期化とExpressのインストール。
mkdir -p /usr/local/src/helloworld
cd /usr/local/src/helloworld
npm init -f
npm i express
HelloWorld!プログラムを書きます。
// index.js
const app = require('express')();
app.get('/', (req, res) => res.send('HelloWorld!'));
app.listen(80);
Webサーバーの起動。
node .
ブラウザからアクセスしてHelloWorld!が表示されればOK。
プロセスの永続化
Webサーバーのプロセスを常駐させたい場合はNode.jsで書かれたforeverというライブラリを使うと楽です。
グローバルインストール。
npm i -g forever
プロセスの起動。
forever start /usr/local/src/helloworld/index.js
以下のようなシェルスクリプト書いてcrontabに登録しておけばプロセス監視もできます。
#!/bin/bash
process_name=/usr/local/src/helloworld/index.js
check_process_log=/var/log/check-process.log
app_log=/var/log/node/helloworld.log
process_running=$(forever list | grep ${process_name} | wc -l)
if [ ${process_running} = 0 ]; then
forever -l ${app_log} -o ${app_log} -e ${app_log} -a start ${process_name} > /dev/null 2>&1
echo "[$(date +%FT%T%:z)] ${process_name} has started." >> ${check_process_log} 2>&1
else
echo "[$(date +%FT%T%:z)] ${process_name} is already running." >> ${check_process_log} 2>&1
fi
おわりに
ラズパイのセットアップからブラウザでHelloWorld!表示までできたので次回はBluetooth使って色々やって見たいと思います。
以上