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 件のコメント:

o1-previewにナップサック問題を解かせてみた

Azure環境上にあるo1-previewを使って、以下のナップサック問題を解かせてみました。   ナップサック問題とは、ナップサックにものを入れるときどれを何個入れればいいかを計算する問題です。数学では数理最適化手法を使う際の例でよく出てきます。 Azure OpenAI Se...