ラズパイのDHCPの結果を知りたいのでMQTTゲートウェイのFujiを使った話


## Motivation

私の手持ちのラズパイはWiFiで起動時にDHCPでIPアドレス決めるのですが、時々サーバー運用テストの都合などで複数のDHCPサーバーが立っていることがあるのと、環境によってはモバイルルーターを使ってのデモや動作確認でDHCPサーバーからリースの情報取れないことがままあるのでMQTTで自己申告させようと思いました。

（追記：avahi-daemon使えばいいのでは、と、気づきましたがこのまま置いておきます。参考になる記事がありました＞　http://qiita.com/kasei-san/items/087e5b33207c214c8db6 ）

MQTTゲートウェイの<a href="https://github.com/shiguredo/fuji/">Fuji</a>を使おうと思ったのは、<a href="https://github.com/shirou/gopsutil">gopsutil</a>の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)'
```