Node.js
Ubuntu
Azure
RaspberryPi
IoT

PINE64へのAzure IoT Edge v1の導入

概要

Azure IoT Edgeは、Gateway SDKから名前が変わりました。Edgeに配置するGatewayのためのオープンソースで提供されるソフトウエアです。Gatewayに関しては色々な製品を選択することができるようになりましたし、Single Board Computerのようなもので自作することも可能です。Azure Iot Edgeの基本部分はオープンソースで提供されます。モジュールを追加していくことによりEdgeで動作するGatewayに対して直接機能をプラグインしていくことが可能になります。
 さらに今後はクラウドでしか動作しないAzure Stream AnalyticsやAzure Machine Learningをコンテナベースで提供して、Edgeで動作させる予定です。
 カスタム機能を作成するため、プラグインするモジュールもC/C++,Java, Nodejsで作成することができます。
broker.png

PINE64を使用して、実際にModbus機器からデータをAzureに送信する部分を作成してみようと思います。構成は以下の図になります。Modbus用のモジュールもC言語で作成されたものがIoT Edgeの中に含まれますが、今回は以前作成した、コマンドを使って作成したいと思います。
e585a8e4bd93e59bb3.png

過去の記事で、Modbus機器のデータをPowerBIのダッシュボードに接続してみました。今回はもう少し本格的にGatewayのためのソフトウエアを使ってみたいと思います。この部分は、過去の記事を参照ください
-Modbus機器の接続は以前のまま使ってみたいと思います。
-USB→RS485の変換アダプタを装着します。この部分は以前の記事とほとんど同じです。
-/dev/ttyUSB0のデバイスファイルになります。アクセス権を変更します
-libmodbusをビルドしインストールします
-以前作成した、C言語のコードもビルドします

PINE64にはUbuntu 16.04を導入します。導入の後下記で最新の状態にします。

sudo apt-get update
sudo apt-get upgrade

続いてIoT Edgeをビルドします。この時の考慮しないといけないのは、どの言語を使用してカスタマイズを行うかです。Node.jsのBindingを構成してみようと思います。
 一番考慮が必要なのは、Nodejsのバージョンです。Nodejsは煩雑にバージョンアップしますので、どのバージョンを利用するかは構成管理上重要です。IoT EdgeはNode LTSが推奨になっています。
Ubuntu16.04を導入すると使用できるaptで展開されるnodejsのバージョンは4.2.6になります。現状の最新のLTSは6.11.1になりますが、4.2.6でもバージョンとしては問題ないため、そのまま使用することにします。

Iot-Edgeをビルドと導入

依存関係の導入

sudo apt-get update 
sudo apt-get install nodejs-legacy npm git
sudo apt-get install curl build-essential libcurl4-openssl-dev git cmake pkg-config libssl-dev uuid-dev valgrind libglib2.0-dev libtool autoconf

PINE64でも特に問題なく導入できました。

gitでソースコードのclone

git clone --recursive https://github.com/Azure/iot-edge.git

binding moduleのbuild

下記のスクリプトでビルドできます。

cd <azure_iot_gateway_sdk_root>/tools/
./build_nodejs.sh

build用のパスの設定

下記はbuildが成功すると最後に表示されますメモして設定します。

export NODE_INCLUDE  <<ビルド終了後表示されるパス>>
export NODE_LIB <<ビルド終了後表示されるパス>>

iot-edgeのbuild

 ./build.sh –enable-nodejs-binding
 cd ../samples/nodejs_simple_sample/nodejs_modules/
 npm install

nodejs_modulesの下に必要なnode.jsのモジュールがコピーされます。

Azureのポータルにアクセスして、iothubを作成します。

iothubを作成後デバイスを追加して、下記のように接続文字列を取得します。

e59bb31.png
e59bb32.png
e59bb33.png

設定ファイル修正

下記のフィアルを編集

 cd <azure_iot_gateway_sdk_root>/samples/nodejs_simple_sample/src/ 
 gateway_sample_lin.jsonを編集

IoT Hub device connection stringを接続文字列に入れ替えます。

一度サンプルを実行してみます。

cd ../../../build/samples/nodejs_simple_sample/
 ./nodejs_simple_sample ../../../samples/nodejs_simple_sample/src/gateway_sample_lin.json

Modbus用のコマンドから室温と湿度を取得

サンプルをカスタマイズしてコマンドからデータを取得し、Iot-Edgeに組み込みます。sensor.jsを修正します。コマンドはtestmodbusという名前でビルドしました。

try{
       const execSync = require('child_process').execSync;
       var result =  execSync('/home/ubuntu/testmodbus /dev/ttyUSB0').toString();
       var data=result.split(",");
       this.broker.publish({
             properties: {
                   'source': 'sensor'
             },
             content: new Uint8Array([data[0]/10,data[1]/10])
       });
}
       catch(e){
}

モジュール間はUint8Array型のデータでやり取りされます。

取得した温度と湿度に属性名をセット

Iothub_writer.jsをカスタマイズ

receive(message) {
      if(this.connected) {
      var a = {temperature:message.content[0],humidity:message.content[1]};
      var m = new Message(JSON.stringify(a));
           if(message.properties) {
                   for(var prop in message.properties) {
                   m.properties.add(prop, message.properties[prop]);
           }
       }

上記で、再び下記を実行するとIoTHubにデータが送信されます。

./nodejs_simple_sample ../../../samples/nodejs_simple_sample/src/gateway_sample_lin.json

IotHubで受信したデータをPowerBiで可視化した結果です。Time Series Insightsを使ったり、Azure内での構成については別の記事にしたいと思います。

powerbi.png