10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

IBM Bluemix で IoT (3) - Androidのセンサ値をモニタする

Posted at

前回までは、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.java
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する。

SensorActivity.java
@Override
public final void onSensorChanged(SensorEvent event) {
    float value = event.values[0];
    mClient.publish("sensor", "light", value);
}

サービス側

サービス側は、2つのフローを実装する。

(1) センサー値のイベントをWebSocketに送信するフロー
websocket.png

(2) WebSocketの値を監視するWebページをブラウザに送るフロー
monitor_page.png

Event Subscirbe

MQTT Deviceから送信されるトピックiot-2/evt/sensor/fmt/json
センサー値イベントを
受け取って、WebSocket に送信するデータに整形する。

ws_format.png

WebSocket /ws/sensorにデータを送る。
ws_out.png

Monitoring

/sensorにHTTP GETされたら以下のhtmlをブラウザに返す。htmlの処理内容は、WebSocket /ws/sensorにつないでセンサ値を取得し、ブラウザ上のセンサー値表示を更新する。
このテンプレートをNode-REDのSensor Valueノードに設定する。

monitor_template.html
<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されているセンサ値をモニタすることができる。
monitor_html.png

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?