Motivation
私の手持ちのラズパイはWiFiで起動時にDHCPでIPアドレス決めるのですが、時々サーバー運用テストの都合などで複数のDHCPサーバーが立っていることがあるのと、環境によってはモバイルルーターを使ってのデモや動作確認でDHCPサーバーからリースの情報取れないことがままあるのでMQTTで自己申告させようと思いました。
(追記:avahi-daemon使えばいいのでは、と、気づきましたがこのまま置いておきます。参考になる記事がありました> http://qiita.com/kasei-san/items/087e5b33207c214c8db6 )
MQTTゲートウェイのFujiを使おうと思ったのは、gopsutilのstatusのリポート機能を使えば、起動後は負荷監視もできるんじゃ、というスケベ根性です。
環境
- Raspberry Pi 2+ (piユーザーのようなsudo可能なユーザーアカウントが使えると想定しています)
- OS: Raspbian (uname -aの結果:Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l GNU/Linux )
- Fuji-gw: バージョン 0.2.3
- 今回はMQTTブローカーに送られてきた情報を読むためにmqttcli ( https://github.com/shirou/mqttcli )を使っています
設定に必要な情報
- MQTTブローカー: 自分でmosquitto立てましたが、登録すれば無料でも使えるsango.shiguredo.jpのサービスを使うのもいいと思います
- ゲートウェイ名:ユニークな名前(自分にとっておぼえやすい名前の最後に-dhcpfinderとかつけると他と衝突しないと思います)
- ユーザー名:認証が必要な場合(例えばsangoサービスを利用する場合必要になります)
- パスワード:認証が必要な場合(これもsangoの場合必要になります)
- ダミーデバイスのPayload:これを適当な値に初期化しておきます。今回はHelloworldとしておきました
Fujiをインストールします
githubで最新版のパッケージをダウンロードしてきます。今回は0.2.3のバージョンで https://github.com/shiguredo/fuji/releases のページからRaspberry Pi2用のパッケージfuji-gw_0.2.3_raspi2_arm7.deb
をダウンロードしてきました。
ダウンロードしてきたパッケージファイルをインストールします。
sudo dpkg -i fuji-gw_0.2.3_raspi2_arm7.deb
すると、実行可能なバイナリが/usr/local/bin/fuji-gw に保存され、デフォルトの設定ファイルが/etc/fuji-gw/config.ini に作られます。
設定ファイル雛形を作ります
デフォルトの設定ファイルを参考にして、たとえば /etc/fuji-gw/initial.ini という名前で次のような内容のファイルを作ります。認証が不要なブローカーの場合には、ユーザー名、パスワードの行はなくてもかまいません。
註:[status]以後はgopsutilを使ってCPUの負荷やメモリの利用状況を送信するようにしています。
[gateway]
name = ゲートウェイ名
max_retry_count = 7
retry_interval = 3 # sec
[broker "br/1"]
host = MQTTブローカーのホスト名
port = 1883
user = ユーザー名
password = パスワード
retry_interval = 10
topic_prefix = ocao
[device "dora/dummy"]
broker = br
qos = 0
interval = 300
payload = Helloworld
subscribe = true
[status]
broker = mosq
interval = 300
[status "cpu"]
cpu_times = user, system, idle, nice, iowait, irq, softirq, guest
[status "memory"]
virtual_memory = total, available, percent, used, free
起動時にIPアドレスをpayloadに埋め込む設定をする
/etc/rc.localに以下の設定を追加します。
ごちゃごちゃしたスクリプトですが、要するにFujiの設定ファイルで、発信する情報(payload)の部分を書き換えてからFujiを起動しているだけです。
なお、起動時にbackgroundで起動しないと、シリアルケーブルでつなごうとしたときにコンソールが表示されない、という問題が発生しますのでご注意を。
/bin/hostname -I > /tmp/__hostname_i
export _IP=`awk '{print $1}' /tmp/__hostname_i`
/usr/bin/perl -p -e "s/payload = Helloworld/payload = $_IP/ ;" /etc/fuji-gw/initial.ini > /etc/fuji-gw/ip.ini
/usr/local/bin/fuji-gw -c /etc/fuji-gw/ip.ini > /dev/null 2>&1 &
ラズベリーパイを再起動する
最初はコマンドラインから。以後は電源をつなぐだけで起動します。
sudo /sbin/shutdown -r -t 30 now
IPアドレスがpublishされてくるのを監視
mosquittto_subを使って、MQTTブローカーへ送信されてくるIPアドレスの情報を見てみます。
このとき、トピックはワイルドカードを使います。
$ mqttcli sub -u 認証用ユーザー名 -P 認証用パスワード -t "トピックのプレフィックス/ゲートウェイ名/#"
実行結果
192.168.13.2
CPUの使用率を見てみよう
トピックとしてはゲートウェイ名以降を詳しく指定します
$ mosquitto_sub -h ブローカーサーバーホスト名 -u 認証用ユーザー名 -P 認証用パスワード -t 'プレフィックス/$SYS/gateway/ゲートウェイ名/cpu/cpu_times/(user|system|idle|nice|iowait|irq|softirq|guest)'