前回までは、python版のpaho-mqttライブラリを使ってきたが、pahoにはAndroid版もあるので、Androidのセンサ値をモニタするプロトタイプを作ってみる。
プロトタイプのコードは github fnishio/mqtt-sampleのSensorSampleを参照。
Androidセンサ値のモニタ
- Android側
- Lightセンサーの値をMQTT eventとして定期的にpublishする。
- サービス側
- センサー値のeventをWebSocketに出力する。
- ブラウザからWebSocketに接続してセンサー値をモニタリングする。
Android側
MQTT Brokerにつなぐ
Android版のpahoライブラリを使ってMQTT Brokerに接続する。
MyMqttClient(Context context) {
mClient = new MqttAndroidClient(context, MyMqttConfig.ENDPOINT_URL, MyMqttConfig.CLIENT_ID);
}
public void connect() {
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(MyMqttConfig.USER);
options.setPassword(MyMqttConfig.PASSWORD.toCharArray());
try {
mClient.connect(options, null, new IMqttActionListener() {
@Override
public void onSuccess(IMqttToken mqttToken) {
// ...
}
@Override
public void onFailure(IMqttToken arg0, Throwable arg1) {
// ...
}
});
} catch (MqttSecurityException e) {
// do nothing.
} catch (MqttException e) {
// do nothing.
}
}
Event Publish
SensorEventListenerのonSensorChanged()でセンサー値を監視してトピックiot-2/evt/sensor/fmt/json
にpublishする。
@Override
public final void onSensorChanged(SensorEvent event) {
float value = event.values[0];
mClient.publish("sensor", "light", value);
}
サービス側
サービス側は、2つのフローを実装する。
(1) センサー値のイベントをWebSocketに送信するフロー
(2) WebSocketの値を監視するWebページをブラウザに送るフロー
Event Subscirbe
MQTT Deviceから送信されるトピックiot-2/evt/sensor/fmt/json
の
センサー値イベントを
受け取って、WebSocket に送信するデータに整形する。
Monitoring
/sensor
にHTTP GETされたら以下のhtmlをブラウザに返す。htmlの処理内容は、WebSocket /ws/sensor
につないでセンサ値を取得し、ブラウザ上のセンサー値表示を更新する。
このテンプレートをNode-REDのSensor Valueノードに設定する。
<head>
<title>Sensor</title>
<script type="text/javascript">
var wsUri = "ws://{{req.headers.host}}/ws/sensor";
var ws = new WebSocket(wsUri);
ws.onmessage = function(ev) {
var payload = JSON.parse(ev.data);
var device = document.getElementById('device');
device.textContent = payload.deviceId;
var sensor = document.getElementById('sensor');
sensor.textContent = payload.light;
}
</script>
</head>
<body>
<div>Sensor Monitor:</div>
<div>
Id: <span id="device">xxx</span>
Value:<span id="sensor">00</span>
</div>
</body>
実行
Android上でアプリを実行するとLightセンサーの値を定期的にpublishする。
ブラウザからhttp://[server address]/sensor
にアクセスすると、publishされているセンサ値をモニタすることができる。