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](https://qiita-image-store.s3.amazonaws.com/0/177932/80e7424d-24f4-4643-faba-61f5c73b0581.png)

PINE64を使用して、実際にModbus機器からデータをAzureに送信する部分を作成してみようと思います。構成は以下の図になります。Modbus用のモジュールもC言語で作成されたものがIoT Edgeの中に含まれますが、今回は以前作成した、コマンドを使って作成したいと思います。
![e585a8e4bd93e59bb3.png](https://qiita-image-store.s3.amazonaws.com/0/177932/57eeae9f-82aa-9686-1195-31464e5ef255.png)

[過去の記事](http://qiita.com/yasukit/items/944372a7737ca4024288)で、Modbus機器のデータをPowerBIのダッシュボードに接続してみました。今回はもう少し本格的にGatewayのためのソフトウエアを使ってみたいと思います。この部分は、[過去の記事](http://qiita.com/yasukit/items/944372a7737ca4024288)を参照ください
-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](https://qiita-image-store.s3.amazonaws.com/0/177932/97db1a18-cd7e-f842-c587-e4b62277da59.png)
![e59bb32.png](https://qiita-image-store.s3.amazonaws.com/0/177932/02b8c870-42e5-c57d-0e1d-e7c5653ee523.png)
![e59bb33.png](https://qiita-image-store.s3.amazonaws.com/0/177932/66919bf0-20a6-f305-49ab-8704dbfe7920.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](https://qiita-image-store.s3.amazonaws.com/0/177932/f2750a5f-d738-8687-40d0-c62509b8a4b5.png)