システムの概要
Edisonに光センサーとLEDを繋ぎ、光センサーのセンサー値が小さくなったら(つまり暗くなったら)、LEDが点灯するといった単純なシステム。ただし、光センサーの値を元にLEDを点灯を制御するアプリはクラウド環境であるBluemix上に作成する。EdisonとBluemix上のアプリとのデータのやり取りはMQTTを利用する。
1. [Edison] Node.jsプログラムが光センサーの値を取得し、MQTTでIoT Foundation(クラウド上のMQTT Broker)に送信(Publish)
2. [Bulemix] Node-REDで作成したProgramがIoT Foundationより光センサーデータを取得し(Subscribe)、暗い場合はLEDをONにするコマンドをIoT Foundationに送信(Publish)
3. [Edison] Node.jsプログラムが、IoT Foundationに送信されたコマンドを取得し(Subscribe)し、LEDを点灯
準備事項
1. 必要なもの
* Intel Edison
* Intel Edison Kit for Arduino
* Grove starter kit (光センサとLEDを使用)
2. 事前準備
* Bluemixのフリーアカウント取得
* Edisonのセットアップ(Get Started GuideのStep1~5まで実施)
* 光センサ(アナログ入力 A0), LEDの設置(GPIO 13ピン))
作成の流れ
- EdisonのMACアドレスの確認
- Bluemix上でアプリケーションの雛形作成
- IoT FoundationにDevice(Edison)を登録
- Edison用Node.jsプログラムの作成
- Bluemixで稼動する制御プログラム作成(Node-RED)
1. EdisonのMACアドレス確認
今回はEdisonとBluemix上の制御アプリケーションとのデータのやり取りはMQTTで行う。MQTTで通信を行うためには、デバイスとアプリケーションを仲介するMQTT Brokerが必要であり、クラウド環境で利用可能なMQTT BrokerであるIoT Foundationを使用する。
IoT Foundationを利用するためには、DeviceをIoT Foundationに登録する必要があり、今回はEdisonからWifiで接続するため、ifconfigコマンドでwlan0のMACアドレスを確認する。
PuttyやTeraTerm、もしくはIntel XDK IoT Edition等でEdisonにシリアル接続し、ifconfigを実行し、赤枠のHWaddrの「:」をとったもの(上記の例だと、784b87a00ebf)をDeviceIdとして登録する。
2. Bluemix上でアプリケーションの雛形作成
光センサーの値を元にLEDを点灯を制御するアプリは、BluemixのNode-REDを用いて作成する。また、IoT Foundationに送信されたセンサーデータをNode-REDアプリで取得するためには、Node-REDアプリとIoT Foundationの紐付けが必要となる。そこで、下記のステップで、Node-REDアプリケーションの雛形を作成し、IoT Foundationとの紐付けを行う。
1. Node-RED StarterにてNode-REDアプリの作成
2. Internet of Thingsサービスのバインド
2.1 Node-RED StarterにてNode-REDアプリの作成
ボイラープレートより、Node-RED Starterを選択し、アプリ名を設定し、Node-REDアプリケーションを作成する。
ステージング完了後、アプリケーションのダッシュボードに表示されているURLをクリックし、Node-RED Flow Editorが表示されることを確認。
2.2 Internet of Thingsサービスのバインド
カタログの一番下にあるInternet of Thingsサービスをクリックし、次の画面でNode-REDアプリにバインドする。
3. IoT FoundationにDevice(Edison)を登録
アプリケーションのダッシュボードより、Internet of Thingsを選択し、IoT foundationのダッシュボードを開く。
ダッシュボードにて、デバイスタブを選択し、デバイスの追加を行う。デバイスタイプの作成時の「名前」は任意の名前でOK。
その後の画面は、特に何も設定せずに「次へ」を押して進める。
認証情報が表示されるので、メモする。以上でIoT Foundationへのデバイスの登録は完了。
4. Edison用Node.jsプログラムの作成
Edisonに繋いだ光センサーの値を取得し、IoT FoundationにMQTT Publishするプログラムを作成する。また、このプログラムでは、Node-REDアプリがIoT FoundationにPublishしたLEDを点灯するためのコマンドをSubscribeする。
4.1. 必要なLibrary
MQTT.jsはpackage.jsonのDependencyに記載。MraaはEdisonの初期セットアップ時にEdison内に配置される。
4.2. 開発方法
Node.js プログラムは、最終的にはedison上にUploadして動かす。主な開発方法は、下記の三種類。
- Edison上でvi Editorで開発
- PC上のIntel XDK IoT Edisonで開発し、EdisonにUpload
- PC上のテキストEditorで開発し、GitHubにPushし、Edison上からGit Cloneする
作成時は、Intel XDK IoT Edisionを使用した。使用方法はこちらのIntel® XDK IoT Edition Getting Started Guideを参照。
4.3. Node.js プログラム
1. プログラムの流れ
- IoT Foundationにデバイスを登録した際に得られる情報を元に、接続先のIoT FoundationのURLや接続の際に必要なCredential情報を整形
- MQTT.jsを用いて、IoT Foundationに接続
- 接続確立後、Mraaで取得した光センサーの値を一定間隔でPublish
- 平行してLED点灯コマンドをSubscribeし、LEDをOn/Offする
2. ポイント
- MQTT Brokerのアドレス
- mqtt://' + <組織ID> + '.messaging.internetofthings.ibmcloud.com:1883
- Topicは下記のFormat設定。下記の設定は、Node-REDアプリケーション構築の際に使用する。
- PublishするTopicは、iot-2/evt/Event名/fmt/json
- SubscribeするTopicはiot-2/cmd/Command名/fmt/json
- PublishするMessageはJSONで下記の形式
- {"d": {}}
- {"d": {"brightness": <光センサー値>}}とした
- LEDをOn/Offするコマンド(Subscribeデータ)は、下記とした
- {"LED": "on"}
- {"LED": "off"}
3. Sampleプログラム
試す場合は、GitHubに公開しているので(Edison_to_IoTFoundation_Node)、Git Cloneをして導入。導入方法は、たとえば下記のようにする。
- PC上にGit Cloneして、Intel XDK IoT EditionにImportし、BuildしてEdison上にUploadして実行
- Edison上で直接Git Cloneして実行。その際、
npm install
を実行してMQTT.js等をセットアップした後に、node main.js
でプログラムを実行。EdisonへのGitの導入はこちらを参照。
/*jslint node:true, vars:true, bitwise:true, unparam:true */
/*jshint unused:true */
// Leave the above lines for propper jshinting
//Type Node.js Here :)
var mqtt = require('mqtt');
var mraa = require('mraa');
// credential parameters assigned when you subscribe your device to IoT founcation
var org = "gyyqov"; // <--- update!!
var type = "myedison"; // <--- update!!
var id = "784b87a00ebf"; // <--- update!!
var auth_token = "kPSf9slYBK6vX+r4!3"; // <--- update!!
var authmethod = 'use-token-auth'; // You don't need update this parm
// create clientID and URL to connect IoT foundation
var clientId = 'd:' + org + ':' + type + ':' + id;
var mqtt_url = 'mqtt://' + org + '.messaging.internetofthings.ibmcloud.com:1883';
var credentials = { clientId: clientId, username: authmethod, password: auth_token };
// create a mqtt client
var client = mqtt.connect(mqtt_url, credentials);
// connect and process
client.on('connect', function () {
var pub_topic = 'iot-2/evt/status/fmt/json'; // publish a message to a topic
var pub_message; // message to be published
var sub_topic = 'iot-2/cmd/cid/fmt/json'; // topic to subscribe
var sub_message; // message reached to topic subscribing
// publish message to IoT foundation
setInterval(function(){
pub_message = '{"d":{"brightness":' + analogVolts() + '}}';
// publish value from light sensor
client.publish(pub_topic, pub_message, function() {
console.log("Message is published");
});
},1000);
//subscribe to a topic
client.subscribe(sub_topic, function() {
// when a message arrives, do something with it
client.on('message', function(topic, message, packet) {
sub_message = message;
console.log("Received '" + sub_message + "' on '" + topic + "'");
if (JSON.parse(sub_message).LED === "on") { // when parameter LED is "on", LED is blinked.
myOnboardLed.write(1);
} else {
myOnboardLed.write(0);
}
});
});
});
// Read Analog output A0
var pin0 = new mraa.Aio(0);
var analogVolts = function() {
var counts = pin0.read();
return counts;
};
// Send signal to light LED connected to GPIO(13)
var myOnboardLed = new mraa.Gpio(13); //LED hooked up to digital pin 13 (or built in pin on Intel Galileo Gen2 as well as Intel Edison)
myOnboardLed.dir(mraa.DIR_OUT); //set the gpio direction to output
5. Bluemixで稼動する制御プログラム作成(Node-RED)
5.1. Node-REDアプリの機能
1. 光センサーデータの取得 & 可視化
IoT Foundationから光センサーデータをSubscribeし、Google visualization APIを使用したグラフを表示するWeb Pageを作成
2. 光センサーの値を元に、LEDをOn/Offするコマンド発行
IoT Foundationに、光センサー値が100を切ったらLED ON、100以上の場合はLED OFFとするコマンドをPublish
5.2 Node-REDアプリの作成
1. Node-REDの使用方法
下記のハンズオン資料を参照。
2. Sampleプログラム
Edison_to_IoTFoundation_NodeのNode-RED sampleをImportすることで、Node-REDアプリを一括導入可能。Importの方法は、こちらのQiitaの投稿(Node-RED小ワザ集)を参照。
3. 光センサーデータの取得
EdisonからIoT FoundationにPublishされた光センサーデータをSubscribeするには、「ibmiot in」ノードを使用する。プロパティーを開き、下記のように設定。
- Device Type, Device Id : IoT Foundationに登録したEdisonの情報
- Event Type : Device Event
- Event : 光センサー値のpublish先Topic:
var pub_topic = 'iot-2/evt/status/fmt/json';
に記載されているEvent名
DebugノードをつなぎDeplpoy後、Edison上でNode.jsプログラムを実行し、Debugウィンドウに光センサーデータが表示されれば成功。
4. センサーデータの可視化
「http in」ノード, 「Template」ノード、「http response」ノードを使用し、下記のURLにGET Requestがきたら、センサーデータのグラフを表示するHTMLを返すWeb Pageを作成する。
- http://<アプリ名>.mybluemix.net/brightness
また、光センサーから1秒間隔で送られてくるデータを、リアルタイムにグラフに反映させるため、データはWebSocketを使用して送信する。各ノードの設定は下記の通り。設定後、Deployし、/brightnessにアクセスして、グラフが表示され、センサーの値がリアルタイムに更新されたら成功。
-
http inノード
- Method : GET, URL : /brightness
-
Websocket outノード
- Path : /ws/brightness
-
Templateノード
- HTML Fileを記載。GitHubのGraph.html参照
- Graph.htmlを使用する場合は、HTML上のWebSoketのURLをアプリの名前に合わせて変更する必要があるので注意が必要。
5. 光センサーの値を元に、LEDをOn/Offするコマンド発行
光センサーの値を元に、下記の通り、コマンドをIoT FoundationにPublishする。
- 100以下の場合 : {"LED": "on"}
- 100以上の場合 : {"LED": "off"}
上記の処理は、「function」ノードにJavascriptを記載して行い、IoT FounadationへのPublishは、「ibmiot out」ノードを使用する。それぞれの設定は下記の通り。
-
function ノード
- Javascriptのif文でLED点灯コマンドを整形し、msg.payloadにセット。
-
ibmiot out ノード
- Authentication : Bulemix Service
- Output Type : Device Command
- Device Type : IoT Foundationに登録したDevice Type
- Device IT : msg.deiveId(deviceId情報がFlowを流れてくるので、それを使用。直接指定でもOK)
- Command Type : Topic名にかかわる設定であり、制御コマンド用Topic名 :
iot-2/cmd/cid/fmt/json
にあわせる。この例では、「cid」をCommand Typeに設定。
Node-REDアプリをDeployし、Edison上でNode.jsプログラムを起動後、光センサーを手で覆う等でセンサーの値を100以下にすると、LEDが点灯し、手を離すとLEDが消えることが確認できる。以上で完成!
6. 参考情報
MQTT関連
- MQTTについて詳しく知る
- Node.js以外の言語のMQTT Library情報
- Explore MQTT and the Internet of Things service on IBM Bluemix
EdisonとBluemix
- Intel Edison IoTF Recipe : Node.js
- Intel EdisonとIBM IoT Foundation & Bluemixの連携 : Python
Bluemixの基礎, Node-RED