Translate

2015年6月9日火曜日

IBM IoT Foundation Trial版上のPublishデータをJavaScriptで取得してグラフ表示する


IBM IoT Foundation Traial版にようやくArdinoのセンサデータを常時送信できるようになったので、データを使う方を考えないと..

とりあえずいろいろ分析とかするより、まずカッコイイグラフで表示させてやろうか..




で検索の結果、"かっこいいグラフ"は書籍「インタラクティブデータビジュアライゼーション」

でも紹介されている

D3 Data-Driven Documents
http://d3js.org/

と、D3を使って水位表示によさげな

D3 Liquid Fill Gauge
http://bl.ocks.org/brattonc/5e5ce9beee483220e2f6

を使うことにした。


D3サイトから d3.min.js を、Liquid Full Gaugeサイトからは liquidFullGauge.js をダウンロード(もしくはコピペ)してローカルへ配置する。

JSONデータをオブジェクト化する $.parseJSON() を使いたかったので、JQueryもダウンロードしてローカルへ配置した。

Paho
https://eclipse.org/paho/

の Java client and utilities からJavaScriptライブラリをダウンロードしてローカル配置した。

jQuery
https://jquery.com/


以下、作成したindex,html ファイル。ライブラリのパスは、各自の環境に合わせて変更すること。

<注意>
以下のHTMLだとAPI Key とAuth Tokenが全世界にバレバレになるので、インターネット上のHTTPサーバには決して載せないこと。
あくまで、ローカルPCからダイレクトにブラウザで実行して見るか、FW設定で1883を開けてイントラのHTTPサーバ上にのせるとかで対処のこと(inputタグで入力させる方法もある)。

<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8">
    <title>Water Level</title>
    <script src="d3/d3.min.js" language="JavaScript"></script>
    <script src="liquidFillGauge.js" language="JavaScript"></script>
    <script src="paho/mqttws31.js" language="JavaScript"></script>
    <script src="jquery/jquery-1.11.3.min.js" language="JavaScript"></script>
    <style>
        .liquidFillGaugeText { font-family: Helvetica; font-weight: bold; }
    </style>
</head>
<body>

<svg id="fillgauge" width="19%" height="200"></svg>

<script language="JavaScript">



// MQTTブローカ(IBM IoT Foundation Trial)
var hostname = "組織ID.messaging.internetofthings.ibmcloud.com";
var port = 1883;  // ポート
var client_id = "a:組織ID:water"; // a:組織ID:アプリID(自由..らしい)
var user_name = "a-組織ID-xxxxxxxx";  // API Key生成時の"Key"
var pass = "xxxxxxxxxxxxxxxxxx";  // API Key生成時の"Auth Token"
//購読トピック指定
var topic = "iot-2/type/+/id/デバイスID/evt/+/fmt/json";


// MQTTブローカクライアント
client = new Paho.MQTT.Client(hostname, port, client_id);

// コールバック時間数を定義
client.onConnectionLost = onConnectionLost; // 接続喪失時
client.onMessageArrived = onMessageArrived; // subscribe該当データが到着時

// MQTTブローカへ接続(認証あり)
client.connect({onSuccess:onConnect, userName: user_name, password: pass});

// 接続時
function onConnect() {
  console.log("onConnect");

  // 購読対象トピックを渡してSubscribe開始
  client.subscribe(topic);
}

// 接続喪失時
function onConnectionLost(responseObject) {
  if (responseObject.errorCode !== 0) {
    console.log("onConnectionLost:"+responseObject.errorMessage);
  }
}

// subscribe指定したトピック該当データが到着時
function onMessageArrived(message) {
  console.log("onMessageArrived:"+message.payloadString);
  // 水位データをメッセージから抽出
  var waterLevel = Number($.parseJSON(message.payloadString).d.waterLevel);

  // グラフ設定(共通)
  var config = liquidFillGaugeDefaultSettings();
  config.circleThickness = 0.1;
  config.circleFillGap = 0.2;
  config.textVertPosition = 0.8;
  config.waveAnimateTime = 2000;
  config.waveHeight = 0.3;
  config.waveCount = 1;
  config.maxValue = 171;  // 満水時上限を指定する
  config.displayPercent = false;

  // 30以下で赤表示
  if(waterLevel<=30){
    config.displayPercent = false;
    config.circleColor = "#FF7777";
    config.textColor = "#FF4444";
    config.waveTextColor = "#FFAAAA";
    config.waveColor = "#FFDDDD";
  }

  // グラフ表示
  loadLiquidFillGauge("fillgauge", waterLevel, config);
}
</script>
</body>
</html>


組織IDは、IBM IoT FoundationのTrial版を登録した際に決まる文字列。

ドキュメントだと認証ありだと8883か443とか書いてあったので、ずっとそっちを指定していてはまってしまった。1883にしたら動いた

認証は IBM IoT Foundation コンソール上で API Key を生成して API KeyAuth Token (一度しか確認できない) をメモっておく。

関数onMessageArrived()の引数messageは、 Paho.MQTT.Message クラスオブジェクトで、Stringかバイトでしか受け取れない。ので、jQueryを使ってStringになっているJSON文字列を変換させて使用している。


Class Paho.MQTT.Message リファレンス
http://www.eclipse.org/paho/files/jsdoc/symbols/Paho.MQTT.Message.html


変数topic"+"はワイルドカード指定をあらわす。
topicの文字列をうまく書き換えてやれば、ほしいデータをsubscribeすることができる。

実際に表示させると以下のようになる。



ぬふー...このペースじゃ全然終わらんぞ..

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...