kintoneで実践するiotハンズオン -90分で挑戦!kintone & aws iot連携-

160
Twitter: @yamaryu0508 FB: https://www.facebook.com/ryu.yamashita.3 2016年2月19日 株式会社ジョイゾー/kintoneエバンジェリスト/ kintone Café 運営事務局・東京支部 山下 竜 kintoneで実践するIoTハンズオン -90分で挑戦!kintone & AWS IoT連携- Developers Summit 2016 【19-F-3】サイボウズ特別トラック #devsumiF

Upload: ryu-yamashita

Post on 16-Apr-2017

846 views

Category:

Software


5 download

TRANSCRIPT

Twitter: @yamaryu0508 FB: https://www.facebook.com/ryu.yamashita.3

2016年2月19日 株式会社ジョイゾー/kintoneエバンジェリスト/ kintone Café 運営事務局・東京支部 山下 竜

kintoneで実践するIoTハンズオン -90分で挑戦!kintone & AWS IoT連携-

Developers Summit 2016 【19-F-3】サイボウズ特別トラック

#devsumiF

自己紹介「山下 竜」

2

2013.3 IOTとグループウェア(デヂエ)の連携を試みてkintone に出会う2014.4 - kintoneエバンジェリストに

2014.11 kintone好きが高じて、界隈初のkintone転職2015.2 kintone Café 運営事務局開設、事務局メンバーに

2014.5 - 2014.10 kintone Café 福岡 Vol.1 - 3を主催

現在(kintone歴2年ちょっと、AWS歴数ヶ月) 多分、“日本で唯一100%kintoneでご飯食べてる人”

株式会社ジョイゾー 山下 竜(33) 福岡県大牟田市出身

「ブルーウェーブ」という共通点

kintone楽しませてもらっています!

3

Pepperによるアプリ作成

アイディアバナナ (貰いに行っただけ)

NKアグリさんの 見学

kintone devCamp 2015

kintone Café クラウドEXPO

ハンズオン祭りcybozu.com developer

network

デブサミ

会社紹介「株式会社ジョイゾー」

4

会社名  株式会社ジョイゾー 所在地  東京都江東区木場3-5-5 設立  2010年12月20日(6期目) 社員数  8名(kintoneエバンジェリスト2名) 主な事業  kintone導入支援・カスタマイズ開発  サイボウズOffice/ガルーン構築支援 案件の9割以上がkintone

日本初定額制来店型システム開発「システム39」

5

1Week20万円の定額kintoneカスタマイズ

6

kintoneエコシステム背景

新しいSI・働き方

コミュニティ

ユーザー

コアサービス

グローバル

他サービス開発者/パートナー

kintoneエコシステムの本質

9

作って、使って、 コミュニケーションして、楽しい!

ユーザーが、 コミュニティ参加者が、 開発者/パートナーが、 サイボウズの人が、

kintoneエコシステム テクニカルな切り口では・・・

kintoneエコシステム

11

「kintoneエコシステム」構築の3つのテクニカルキーワード

Lv.1 kintoneプラグイン

kintone連携サービス

サーバレスアーキテクチャ

Lv.2

Lv.3

帳票

複合機

経費精算

基幹

EAI

BI

kintoneエコシステム

12

「kintoneエコシステム」構築の3つのテクニカルキーワード

Lv.1 kintoneプラグイン

kintone連携サービス

サーバレスアーキテクチャ

Lv.2

Lv.3

帳票

複合機

経費精算

基幹

EAI

BI

最近注目しています!

kintoneとAWSナイスな相性だと 言われています!

kintoneとAWS

14

• アプリケーション寄りPaaS(SaaS)

• クライアントサイド/フロントエンド (UI/UX)

• 行動的/解釈の共有でアクションを起こし、コミュニケーションで業務を回す

• インフラ寄りPaas(IaaS、BaaS)

• サーバーサイド/バックエンド   (コマンド)

• 思考的/データを捌き事象を解釈する

APIで 結合・補完

良質のインプット

強力なデータ処理

AWS Lambdaによる サーバレスアーキテクチャ

参考・引用「Serverless Architecture on AWS」 (http://www.slideshare.net/keisuke69/serverless-architecture-on-aws)

肝となる

Lambda イベントソース

kintoneエコシステム(王道っぽいAWSとkintoneの連携パターン)

Amazon DynamoDB Stream

Amazon SNS

Amazon S3

Amazon Kinesis

AWS Lambda

Amazon EC2

REST API

kintone on cybozu.com

・レコード操作 ・ワークフロー操作 ・スペース操作 ・アプリ操作

REST API

kintone.proxy() & Amazon API Gateway 経由もやっぱりイイ!

REST API

プリミティブな連携 ・ホスティング ・バッチ処理

Amazon API Gateway

AWS IoT

16

サーバ(EC2)による処理系の例

17

データプッシュポーリング・ 待機・監視

データの発生状況を ポーリングチェック

処理(コード)の 実行

・ロードバランス ・レプリケーション ・オートスケール

データ

サーバレス(Lambda)による処理系の例

18

データ

トリガー

データの発生が トリガーとして渡る

・ロードバランス ・レプリケーション ・オートスケール

処理(コード)の 実行

• インフラ構築不要

• インフラの運用管理不要

• キャパシティ

• スケール

• デプロイ

• 障害耐性

• モニタリニグ

• ロギング

• セキュリティパッチ適用

サーバレス(Lambda)の恩恵

Lambda イベントソース

kintoneエコシステム(王道っぽいAWSとkintoneの連携パターン)

19

Amazon DynamoDB Stream

Amazon SNS

Amazon S3

Amazon Kinesis

AWS Lambda

Amazon EC2

REST API

kintone on cybozu.com

・レコード操作 ・ワークフロー操作 ・スペース操作 ・アプリ操作

REST API

kintone.proxy() & Amazon API Gateway 経由もやっぱりイイ!

REST API

プリミティブな連携 ・ホスティング ・バッチ処理

Amazon API Gateway

AWS IoT

kintone & AWSサーバレスアーキテクチャのベストプラクティス

その3

その2

kintoneとAWSサーバレスアーキテクチャのベストプラクティス

21

その1 AWS各サービスを用いたkintoneへのインプット

kintoneへのAPIアクセスのラッピング

kintoneからAWS各サービスへのアクセス

(従来IoT、kintone controller)

(Webhookからの連携、kintoneデータの柔軟な公開)

(kintoneデータを元にした機械学習)

その4 Schedule Eventによるkintoneバッチ処理

API

(定期的な集計、サービス間連携)

AWS各サービスを用いたkintoneへのインプット

22

・農業(圃場) ・見守り ・建設・工事現場 ・工場設備 ・エネルギー設備

現場

センサー

・温度 ・湿度 ・照度 ・加速度 ・騒音

センサー クラウド kintone

・通知 ・ワークフロー ・スレッド ・カスタマイズビュー

事象・データが発生する データを捌き、 事象を解釈する

解釈の共有でアクションを起こし、コミュニケーションで業務を回す

IoT

ルール (閾値条件)

AWS各サービスを用いたkintoneへのインプット

23

XX

MQTT

REST API

Rule Action

kintone & AWSによるIoT構成例

センサー トピック

Rule Action

全データ 蓄積

業務アクションのために 即時連携が必要なデータ

通知・ワークフロー

可視化

必要なデータを 必要な分だけ取得

MQTT

ルール (全データ)

認証

REST

API

AWS各サービスを用いたkintoneへのインプット

24

kintone controller

REST API

AWS LambdaAWS IoTコントローラー

IoT連携

・レコード操作 ・ワークフロー操作 ・スペース操作 ・アプリ操作

①ボタンを押す ②IoT情報を受け取って、次のサービスに渡す

③受け取った情報をトリガーにkintoneにアクセス

kintoneへのAPIアクセスのラッピング

25

Webhook Event REST API

①Gitのプッシュ、 課題追加等の発生

②APIでパラメータを 渡す

③Eventでパラメータを受け取り、 APIでkintoneへ

Webhook(通知等)をAPI Gatewayを経由してLambdaで捌いた内容を kintoneに連携

Webhookからのkintoneアクセス

kintoneへのAPIアクセスのラッピング

26

①kintoneデータへのアクセスをAPI Gatewayで APIを再定義

②kintoneを意識することなく 有益な情報にアクセス

kintoneに蓄積されたデータをAPI Gatewayで再定義したAPIで柔軟に公開

kintoneのデータを再定義したAPIで公開

REST API Event REST APIRESTful Service

kintoneからAWS各サービスへのアクセス

27

kintoneのデータを元にしたMachine Learning

AWS Lambda

kintone on cybozu.com

①kintoneデータで 予測モデル作成

Amazon API Gateway

Amazon Machine Learning

②kintoneにデータ登録 ③API(クエリ)で パラメータを渡す

④Eventでパラメータを受け取り、 APIでリアルタイム予測へ

REST API Event REST API

⑤予測実行後 予測値を返す

※初動のモデル作成は直接実施  (Lambda未経由)

⑥予測値をセット

kintone.proxy()

kintoneのデータ管理に予測機能を追加!

kintoneからAWS各サービスへのアクセス

28

REST API Event REST API

Device Shadow

SOAP API

①スイッチON/OFF②API GatewayとLambdaを介して、 Device ShadowのREST APIをコール

③Device Shadowで Raspberry Piを制御

④Raspberry PiからLAN内の Wemoにアクセス

⑤家電の電源をON/OFF

Schedule Eventによるkintoneバッチ処理

29

①Lambdaを定期起動

スケジュールイベント(定期実行)で、サービス間連携

Event REST API

連携 サービス

REST API ②connpassのデータを取得

③connpassのデータを kintoneへ

④kintoneに入ったデータを kViewerで公開

kintoneエコシステム真時代の到来!なぜ今なのか?

改めて、

サーバーレスアーキテクチャが 登場したから?

キーワードですが、いち要素にすぎません

コミュニティ

ユーザー

コアサービス

グローバル

他サービス新しいSI・働き方 開発者/パートナー

もう一度見返してみましょう!

新しいSI・働き方

コミュニティ

ユーザー

コアサービス

グローバル

他サービス

2011

2006

2014

20142015

20132011

開発者/パートナー

それぞれの進化によりエコシステム形成のためのピースが全て実際に埋まったから^^

紙芝居でなく写真になり、 システムも今日実践しましょう!

いよいよ本題

kintone & AWS IoT連携 ハンズオンシナリオと構成

ハンズオンモチベーション

36

kintone × IoT とは?

データベース プロセス 管理

コミュニケーション

ただの「データベース」ではなくて、kintoneならではの 「プロセス管理」や「コミュニケーション」の機能を活かす!

ここで大切なのは

「オフィスのデータ」だけでなく 「現場のデータ」も取り込む

オフィスで人が入力 現場でセンサーが送信

kintone × センサークラウド 連携事例

データ送信センサークラウド kintone

レコード登録  - 通知  - ワークフロー

カスタマイズビュー  - グラフカスタマイズ

megakiku connect (IoTアプリ)

※kintone連携機能有

- 温度・湿度・照度等のデータを蓄積 - 生産予測の精度向上 - 上のノウハウ再利用で、フランチャイズ化に伴う生産管理の効率化

NKアグリ様(東京・和歌山)(kintoneでやっていること)

温度センサー

・低下する就労人口 ・農業経営・技術の継承問題

チームワークプラットフォームの インプットとしてのIoT

引用「kintone × IoT 連携による現場業務の改善」 (http://www.slideshare.net/joyzojp/kintone-iot)

Rule Action

全データ 蓄積

可視化REST

API

必要なデータを 必要な分だけ取得

ルール (全データ)

ルール (閾値条件)

ハンズオン構成(続き)

37

XX

MQTT

REST API

センサー トピック

Rule Action

業務アクションのために 即時連携が必要なデータ

通知・ワークフローMQTT

認証

kintone & AWSによるIoT構成例

ハンズオン構成(続き)

①BLE CentralからBLE Peripheralの センサーデータをAWS IoT Device GWへ MQTT Publish

AWS Lambda kintone on cybozu.com

MQTT

AWS IoT

Event REST API

IoT Device

BLE Peripheral

BLE Central

②AWS IoTルール エンジンでイベントドライブ

③Lambdaから kintoneへのレコード操作

AWS IoT/Lambdaからkintoneへの柔軟なデータ取り込みを体験

※今回BLE CentralはRaspberry Piで代用38

Special Thanks

39

引用「TechCrunch」 (http://jp.techcrunch.com/2016/01/13/skydisc/)

最近1億円の資金調達をされた福岡の

の着脱式センサ「GINGA」をAWS様のご協力でお借りしています!

SKYDISC様

• kintone

• kintone REST APIをNode.jsでコールする

• レコード操作

• ワークフロー操作(応用編)

• AWS

• AWS Lambdaの設定方法

• AWS IoTの設定方法

• デバイス、ルール、ポリシー、証明書

• IoT Device

• AWS IoT SDKによるMQTT Publishの記述方法

今回のハンズオンに必要とされるスキルセット(目標・成果物)

40

ハンズオンの手順

①BLE CentralからBLE Peripheralの センサーデータをAWS IoT Device GWへ MQTT Publish

AWS Lambda

IoT Device ← AWS IoT ← Lambda ← kintone

MQTT

AWS IoT

Event REST API

IoT Device

BLE Peripheral

BLE Central

②AWS IoTルール エンジンでイベントドライブ

③Lambdaから kintoneへのレコード操作

データやプロセスの終着点側から設定すると、スムーズに進みます!

41

kintone & AWS IoT連携 ハンズオン予備知識

kintone REST API

kintone3大要素とREST API

44

データベース プロセス管理 コミュニケーション

充実 強化中 弱いAPIからの操作も3大要素をバランスよく活用することが重要!

API操作で3大機能同士を密に結合できるようになると、更に便利になると期待しています!

kintone3大要素とREST API(ポータル画面)

45

スペースの 作成・メンバー更新等

アプリの作成・更新

(欲しい)

(参考:「cybozu.com developer network > kintone API」)

kintone3大要素とREST API(詳細画面)

46

レコードの 取得・登録・更新・削除

添付ファイルの アップロード・ダウンロード

レコードの ステータス変更

(欲しい)(参考:「cybozu.com developer network > kintone API」)

kintone REST APIの概要

47

• kintoneアプリのレコードやスペースの操作

kintone REST APIの用途

プロトコル

• HTTPSプロトコル

フォーマット

• JSON

文字コード

• UTF-8

認証認証

• ユーザ認証(パスワード、APIトークン)

• Basic認証

その他

• 同時処理レコード数100件

• API同時アクセス10件※GET/recordsのみ500件

kintone REST APIの概要(続き)

48

• https://{subdomain}.cybozu.com/k/v1/{command}.json【通常】

• https://{subdomain}.cybozu.com/k/guest/{space id}/v1/{command}.json【ゲストスペース】

URI

リクエストヘッダ

• Host: {subdomain}.cybozu.com:443

• Content-Type:application/json

• 認証情報

リクエスト例(GET/records)

49

QWRtaW5pc3RyYXRvcjpwYXNzd29y

GETメソッドではContent-Typeは不要

Basic認証を使用していない場合にも空欄で入れておく分には問題ない様子

https://{subdomain}.cybozu.com/k/v1/records.json?app={app id}

 【認証方法の記述】 X-Cybozu-Authorization : {BASE64-encoded "id:password"} Authorization : Basic {BASE64-encoded "id:password"} ※例の{base64-encoded "id:password"}はidをAdministrator、passwordをpasswordとした場合の値としています

HTTPクライアント設定画面

※以降、Google Chromeのアドオン「POSTMAN」を利用しています

リクエスト例(GET/records:続き)

50

リクエスト詳細

https://{subdomain}.cybozu.com/k/v1/records.json?app={app id}

QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==

{subdomain}.cybozu.com

{app id}

リクエスト例(GET/records:続き)

51

レスポンス

"{field code}": { "type" : "{field type}", "value" : "{value}" }

各フィールドはこのように記述されます ・複数値を取りうる{value}は配列になります ・POST/PUTの際はtypeが不要です

フィールドの記述

リクエスト例(POST/records)

52

HTTPクライアント設定画面

QWRtaW5pc3RyYXRvcjpwYXNzd29y

https://{subdomain}.cybozu.com/k/v1/records.json

リクエスト例(POST/records:続き)

53

リクエスト詳細

POST/PUTメソッドではContent-Lengthが必要(自動補完してくれない言語・ライブラリを利用する場合は要注意)

https://{subdomain}.cybozu.com/k/v1/records.json

QWRtaW5pc3RyYXRvcjpwYXNzd29yZA==

{subdomain}.cybozu.com

リクエスト例(POST/records:続き)

54

レスポンス

【POSTのレスポンス】 ・ids(レコードID)とrevisions(リビジョン) 【PUTのレスポンス】 ・revisions(リビジョン)

AWS IoT

AWS IoTの概要

56

引用「AWS IoTの仕組み」 (https://aws.amazon.com/jp/iot/how-it-works/)

• DEVICE GATEWAY

• メッセージブローカー、MQTT/HTTP1.1

• AUTHENTICATION & AUTHORIZATION

• TLS1.2、IAM、SigV4、Cognito

• AWS IoT DEVICE SDK

• Embedded C、JavaScript、Arduino Yún

• RULES ENGINE

• SQLライクな記述、AWSサービスへのアクション

• DEVICE SHADOWS

• オフライン時のメッセージ受信

• REGISTRY

• メタデータ管理参考「Everything You Want to Know About AWS IoT」 (http://www.slideshare.net/AmazonWebServices/mbl205-new-everything-you-want-to-know-about-aws-iot)

AWS IoTの概要(DEVICE GATEWAY)

57

AWS IoTの概要(DEVICE GATEWAY・続き)

58

メッセージブローカー

PublishSubscribe

MQTTイメージ

AWS IoTの概要(DEVICE GATEWAY・続き)

59

メッセージブローカー

POSTGET

RESTイメージ

AWS IoTの概要(AUTHENTICATION & AUTHORIZATION)

60

認証・アクセス許可

AWS IoTの概要(AUTHENTICATION & AUTHORIZATION・続き)

61

認証・アクセス許可

XXポリシー

証明書証明書

モノ

AWS IoTの概要(RULE ENGINE)

62

ルールエンジン

ルールエンジンアクション

AWS IoTの概要(RULE ENGINE・続き)

63

ルールエンジン

SQLライクな記述が可能なフィルタ 例: SELECT * FROM ‘things/thing-2/color' WHERE color = ‘red’

メッセージ交換(文字列操作、算術演算等)

AWS IoTの概要(RULE ENGINE・続き)

64

ルールエンジンアクション受け取ったメッセージの処理

パブリッシュ データ格納 Lambda関数呼出

テーブル操作 パブリッシュ リパブリッシュ

AWS IoTを中心にハンズオン構成を見る

65

XX

MQTT REST API

①証明書で紐ついたモノから メッセージ(データ)をPublish

Event

②受け取ったメッセージを Topic等でフィルタ

③受け取ったメッセージを Lambdaで処理してkintoneへ連携

MQTT

{ "temp": "14", "humidity": "80", "time": "2016-02-19T12:23:56+09:00", "device": "Lambda test" }

メッセージ kintoneの レコード

ハンズオンの設定概要

66

XX

MQTT REST API

Event

【kintone】 ①アプリ作成 ②APIトークンの取得

MQTT

【AWS Lambda】 ①eventで送られてきたメッセージを 処理して、kintoneに連携するLambda 関数の作成

【AWS IoT】 ①モノの作成 ②ルールの作成 ②ポリシーの作成 ④証明書の生成 ⑤証明書とモノの紐付け ⑥証明書とポリシーの紐付け

【IoT Device】 ①BLEによるセンサー値取得 ②AWS IoT Device SDKによる センサー値のMQTT Publishの設定

ハンズオン本編

サンプルダウンロード

68

①「https://github.com/joyzo/devsumi-2016-19F3」にアクセス

②「Download ZIP」をクリックして、 ファイル一式をダウンロード

kintoneアプリの設定

kintoneアプリの設定(テンプレートからのアプリ作成)

①「ハンズオンスペース」をクリックして、個別スペースに移動

70

kintoneアプリの設定(テンプレートからのアプリ作成・続き)

②アプリ作成の「+」をクリック

③「テンプレートから選ぶ」をクリック

④「アプリを作成する」をクリック ⑤今回1つのアプリが追加される

71

kintoneアプリの設定(インシデント管理アプリの概要)

72

フォーム項目フィールド の種類

フィールドコード

測定日時 日時 time

センサー名 文字列(1行) device

温度 数値 temp

湿度 数値 humidity

IoT DeviceからAWS IoT/Lambdaを経由して登録されるセンサーデータ用のフォームを準備

kintoneアプリの設定(インシデント管理アプリの概要・続き)

73

フォーム項目フィールド の種類

フィールドコード

タイトル 文字列(1行) タイトル

優先度 ドロップダウン 優先度

内容 文字列(複数行)

内容

対応期限 日付 対応期限

対応者 ユーザー選択 対応期限

センサーデータをトリガーに発生する業務に関連するフォームを準備

kintoneアプリの設定(インシデント管理アプリのID確認)

74

①アプリURLの「/k/」の後ろの数値(アプリID)をメモ

kintoneアプリの設定(インシデント管理アプリのAPIトークン取得)

75

②「アプリの設定を変更」をクリック

①「・・・」をクリック

kintoneアプリの設定(インシデント管理アプリのAPIトークン取得・続き)

76

③「詳細設定」をクリックして展開

④「APIトークン」をクリック

kintoneアプリの設定(インシデント管理アプリのAPIトークン取得・続き)

77

⑤「生成する」をクリック

⑥「レコード閲覧」、「レコード追加」、「レコード編集」、「レコード削除」にチェック

⑦生成されたAPIトークンをメモ

⑧「保存」をクリック

kintoneアプリの設定(インシデント管理アプリのAPIトークン取得・続き)

78

⑨「設定完了」をクリック

⑩「OK」をクリック

Lambda・関数の設定

AWS IoTのルールエンジンからのアクセ本をトリガーにkintoneのレコードを操作するLambda関数の設定

Lambda・関数の設定

80

①「Lambda」をクリック

※今回は「東京(ap-northeast-1)」リージョン

Lambda・関数の設定(続き)

81

②(Lambda利用が初めてでなければ)「Create a Lambda function」をクリック

②(Lambda利用が初めてならば)「Get Started Now」をクリック

Lambda・関数の設定(続き)

82

③今回は「Skip」をクリック

Lambda・関数の設定(続き)

83

④「Name」に今回のLambda関数の名前(例: kintone-iot)を記入

⑤「Runtime」は「Node.js」を選択しておく

⑦「APP_ID」の値をメモしておいたkintoneアプリのIDで差し替える

⑥サンプルの「./nodejs/kintone_iot.js」を貼付け ※日本語は貼付け時に文字化けし、不具合の原因になることがある ※全選択して貼り付けると既存のソースを残して追加されることがある

⑧「API_TOKEN」の値をメモしておいたkintoneアプリのAPI Tokenで差し替える

Lambda・関数の設定(続き)

84

⑨「Handler」はそのまま ※ZIPコードをアップロードする際にファイル名と同一である必要がある(index.handler → index.js)

⑪基本実行権限を持つIAMロールを新しく作る場合には「許可」をクリック

⑬「Next」をクリック⑩「Role」は基本実行権限を持つ既存ロールか「Basic execution role」を選択

⑫「Memory」を512、「Timeout」を5で設定

※ポップアップの許可が必要な場合があります

Lambda・関数の設定(続き)

85

⑭「Create function」をクリック

Lambda・関数の設定(続き)

86

⑮Lambda関数の作成完了

⑯「Test」をクリック

⑰サンプルの「./json/sample_event.json」を貼付け ※IoT DeviceがPublishしてくるデータ

⑱「Save and test」をクリックして、テスト実行

Lambda・関数の設定(続き)

87

⑲テスト実行が成功すると「Execution result」が「succeeded」になり、kintoneのレスポンスが出力される

• event(PublishされたメッセージがAWS IoT経由で渡される)データを用いてkintoneへのレコード登録を行う

イベントコード「kintone_iot.js」の概要

88

// Libraries var https = require('https'); // HTTPS request

// constant parameters const KINTONE_HOST = 'kintone-iot.cybozu.com'; const APP_ID = 3; const API_TOKEN = 'Tm8C8ziqgf7fUx2XdvAAIu1PJINczwPHVntFj9ON';

イベントコード「kintone_iot.js」の部分解説

89

HTTPSリクエストを行う標準モジュールNode.jsのモジュール(1行目~)

設定値(定数)(6行目~)アプリ毎の固有の情報(今回の編集対象)

// get options to access to kintone REST API var getOptions = function(path, method) { return { hostname: KINTONE_HOST, port: 443, path: path, method: method, secureProtocol: 'SSLv3_method', headers: { 'X-Cybozu-API-Token': API_TOKEN } }; };

イベントコード「kintone_iot.js」の部分解説(続き)

90

ヘッダ情報は認証情報のみセットしておく (URL渡しのGET/records等以外はContent-Type: application/jsonを別途付加)

HTTPSリクエスト時に必要な情報を取得する関数(9行目~)

// regist record to kintone var postRecord = function(event, callback) { console.log('start postRecord'); // set request body var params = { "app": APP_ID, "record": { "time": { "value": event.time || event.timestamp || "" }, "device": { "value": event.device || "devsumi_device" }, "temp": { "value": event.temp || "" }, "humidity": { "value": event.humidity || "" } } }; var json = JSON.stringify(params); // set request headers var options = getOptions('/k/v1/record.json', 'POST'); options.headers['Content-Type'] = 'application/json';

// access to kintone REST API var req = https.request(options, function(res) { console.log('STATUS: ' + res.statusCode); console.log('HEADERS: ' + JSON.stringify(res.headers)); res.setEncoding('utf8'); res.on('data', function(chunk) { console.log('BODY: ' + chunk); if (res.statusCode === 200) { callback(null, JSON.parse(chunk)); } }); });

req.on('error', function(e) { console.log('problem with request: ' + e.message); callback(e.message); });

req.write(json); req.end(); };

イベントコード「kintone_iot.js」の部分解説(続き)

91

eventを処理してレコード登録を行う関数(24行~)

eventから登録するrecordを作成

「Content-Type: application/json」をリクエストヘッダに付加

POST/recordをコール

Lambda関数のテスト起動で kintoneにレコード登録する動きの確認

ここまでの設定による動き

①BLE CentralからBLE Peripheralの センサーデータをAWS IoT Device GWへ MQTT Publish

AWS Lambda

MQTT

AWS IoT

REST API

IoT Device

BLE Peripheral

BLE Central

②AWS IoTルール エンジンでイベントドライブ

③Lambdaから kintoneへのレコード操作

Event

(設定済みの範囲)先ほどのテスト

93

イベント履歴の確認

94

①「Monitoring」をクリックする

②直近24時間の履歴を表示

③詳細をCloudWatchで確認するためにクリック

イベント履歴の確認(続き)

95

④直近のログストリームをクリック

⑤テストで挿入したeventデータ

⑥kintoneのレスポンスが表示され正常終了

kintoneのレコード登録確認

96

⑳Lambdaのテストで登録されたレコード

AWS IoTの設定

モノ周辺の設定を行い、MQTT PublishされたデータをLambdaに渡す

AWS IoTの設定

98

①「AWS IoT」をクリック

※今回は「東京(ap-northeast-1)」リージョン

AWS IoTの設定

99

②(AWS IoT利用が初めてでなければ)「Create a resource」をクリック

②(AWS IoT利用が初めてならば)「Get started」をクリック

AWS IoTの設定(モノの作成)

100

④「Name」に作成するモノの名前(例: kintone-iot)を記入

③「Create a thing」を選択

⑤「Create」をクリック

AWS IoTの設定(モノの作成・続き)

101

⑦Shadowのエンドポイント等が表示される

⑥「View thing」をクリック

AWS IoTの設定(ルールの作成)

102

⑧「Create a rule」を選択

⑨「Name」にルール名(例: kintone_iot)を記入

AWS IoTの設定(ルールの作成)

103

⑨「Attribute」に「*」を記入

⑪「Choose an action」では「Insert this message into a code function and execute it

(Lambda) 」を選択

⑩「Topic filter」に「devsumi/ginga」を記入

AWS IoTの設定(ルールの作成・続き)

104

⑫「Function name」は先程設定した「kintone-iot」を記入・選択

⑬「Add action」をクリック

⑮「Create」をクリック

⑭「Lambda Action」が追加される

AWS IoTの設定(ルールの作成・続き)

105

⑰先ほど設定したクエリ情報等が表示される

⑯「View rule」をクリック

AWS IoTの設定(ポリシーの作成・続き)

106

⑱「Create a policy」を選択

⑲「Name」にポリシー名(例: kintone-iot)を記入

㉑「Resource」には「*」を記入

㉒「Allow」にチェック

㉓「Add statement」をクリック

⑳「Action」には 「iot:*」を記入

AWS IoTの設定(ポリシーの作成・続き)

107

㉕「Create」をクリック

㉔「Statement 1」が追加される

AWS IoTの設定(ポリシーの作成・続き)

108

㉗設定されたポリシー情報が表示される

㉖「View policy」をクリック

AWS IoTの設定(証明書の作成)

109

㉘「Create a certificate」を選択

㉙「1-Click certificate create」をクリック

AWS IoTの設定(証明書の作成・続き)

110

㉚生成された3つの証明書をダウンロード 【ファイル名(今回の命名ルール)】 サンプルの「./ginga/」で「./ginga/cert」フォルダを作成し、その下に保存 ・public key -> public.pem ・private key -> private.pem ・certificate -> certificate.pem ※「Download」の部分が「Show」となっている方は コピペしてテキストエディタで保存してください。

AWS IoTの設定(証明書とポリシーの紐付け)

111

㉛先程作成した証明書に「レ(チェック)」を入れる

32「Attach a policy」をクリック

33先程作成したポリシー名を記入

34「Attach」をクリック

36「Attach a thing」をクリック

AWS IoTの設定(証明書とモノの紐付け)

112

35選択中の証明書にはチェックのまま

37先程作成したモノの名前を記入

38「Attach」をクリック

AWS IoT(証明書のアクティベーション)

113

39選択中の証明書にはチェックのまま

40「Activate」をクリック

AWS IoT(証明書のアクティベーション・続き)

114

41「ACTIVE」に変わる

AWS IoTの設定(再掲:AUTHENTICATION & AUTHORIZATION)

115

認証・アクセス許可

XXポリシー

証明書証明書

モノ

証明書のアタッチ状況

モノポリシー

AWS IoTの設定(ルート証明書の取得)

116

42Symantecからルート証明書を取得

43コピペもしくはcURLコマンド等で他の証明書と同じフォルダに「rootCA.pem」として保存する ※cURLコマンドはサンプルの「howto_curl_rootCA.txt」に記載

AWS IoTへのPublishで kintoneにレコード登録する動きの確認

ここまでの設定による動き

AWS LambdaAWS IoT

REST API

IoT Device

BLE Peripheral

BLE Central

②AWS IoTルール エンジンでイベントドライブ

③Lambdaから kintoneへのレコード操作

Event

(設定済みの範囲)MQTT Publishテスト

①BLE CentralからBLE Peripheralの センサーデータをAWS IoT Device GWへ MQTT Publish

MQTT

118

MQTT Publishの確認(エミュレータの準備)

119

①「https://github.com/yamaryu0508/aws-iot-publisher」にアクセス

②「Download ZIP」をクリックして、 ファイル一式をダウンロード

※ハンズオンではUSBにてアプリを配布

MQTT Publishの確認(エミュレータの準備・続き)

120

/ ┣ AWS IoT Publisher-darwin-x64/ (Mac用) ┃ ┗ AWS IoT Publisher.app (エミュレータアプリ) ┣ AWS IoT Publisher-win32-ia32/ (Windows32bit用) ┃ ┗ AWS IoT Publisher.exe (エミュレータアプリ) ┗ AWS IoT Publisher-win32-x64/ (Windwos64bit用) ┗ AWS IoT Publisher.exe (エミュレータアプリ)

レポジトリの中身(パッケージ済アプリ部分のみ)

③自分の環境に適したアプリを起動

MQTT Publishの確認(エミュレータによるPublish)

①「Asia Pacific (Tokyo)[ap-northeast-1]」を選択

②先程設定した「devsumi/ginga」を記入

③先程ダウンロードした「rootCA.pem」を選択

④先程ダウンロードした「certificate.pem」を選択

⑤先程ダウンロードした「private.pem」を選択

⑥サンプルの「sample_event.json」をkey-value形式で入力

⑦「Publish to AWS IoT !」をクリック

121

MQTT Publishの確認(エミュレータによるPublish・続き)

122

⑧AWS IoTにConnectして メッセージをPublish

出典: https://github.com/yamaryu0508/aws-iot-publisher

kintoneのレコード登録確認

123

⑧MQTT Publishのテストで登録されたレコード ※Lambda-kintone間はチェック済みのため、LambdaのCloudWatch Logsの確認は省略

AWS IoT内のMQTT Clientを使った確認(続き)

124

①「MQTT Client」を選択

AWS IoT内のMQTT Clientを使った確認(続き)

125

②「Clinet ID」を入力(例: devsumi-test)

③「Connect」をクリック

AWS IoT内のMQTT Clientを使った確認(続き)

126

④「Connection」が 「Connected」になる

AWS IoT内のMQTT Clientを使った確認(続き)

127

⑤「Publish to topic」をクリック

⑥サンプルの「./json/sample_event.json」を貼付け ※IoT DeviceがPublishしてくるデータ

⑦「device」を「MQTT Client test」等わかりやすいものにしておく

⑧「Publish」をクリック

AWS IoT内のMQTT Clientを使った確認(続き)

128

⑨「Publish」に成功すると「Success!」が表示される

kintoneのレコード登録確認

129

⑩MQTT Clientからのテストで登録されたレコード ※Lambda-kintone間はチェック済みのため、LambdaのCloudWatch Logsの確認は省略

IoT Deviceの設定

IoT Device周辺の詳細

131

BLE MQTT Publish

温湿度センサー (BLE Peripheral)

GW (BLE Central) AWS IoT

ここでの設定対象

Peripheralから送られてくるセンサー値を取得して、 AWS IoTにメッセージ(データ)をパブリッシュする

BLE Centralの動き

IoT Device周辺の構成

IoT Device周辺の詳細(続き)

132

BLE MQTT Publish

センサー (BLE Peripheral)

GW (BLE Central) AWS IoT

- Periferalの値を読み取るNode.jsコーディング - AWS IoTアクセス用の証明書のセット - AWS IoT SDKを用いたAWS IoTアクセス用のNode.jsコーディング

BLE Centralの設定内容

IoT Deviceの設定

133

{kintoneのログインID(例: user1)}/ ┣ ginga_iot.js (センサーの値を取得してPublishするメインのNode.jsファイル) ┣ node_module/ (Node.jsのモジュール群) ┃ ┣ aws-iot-device-sdk/ (証明書を伴うAWS IoTへのアクセス) ┃ ┣ noble/ (BLE Centralの作成) ┃ ┗ moment/ (日時操作) ┗ cert/ (証明書ファイル群) ┣ rootCA.pem (ルート証明書) ┣ certificate.pem (証明書) ┗ private.pem (秘密鍵)

BLE Centralのフォルダ構成 フォルダ名を「ginga/」からkintoneのログインIDに各自修正しておく

// constant parameters const DEVICE_NAME = 'dev1'; const TOPIC = "devsumi/ginga"; // MQTT TOPIC const MY_ADDRESS = "f3:2f:85:98:69:ce"; // MAC Address of BLE peripheral, "GINGA" const REGION = 'ap-northeast-1';

IoT Deviceの設定

134

ginga_iot.jsの編集箇所(6行目~)①Peripheralの「Dev**」を記入

②Peripheralのアドレスを記入

• アドレス指定したPeripheralからのadvertisementがあった際にセンサーの値を取得する

• 証明書を紐付けて、取得したセンサーの値をAWS IoTにPublishする

• 「AWS IoTのリージョン」、「証明書のパス」、「Topic」の指定が必要

Centralコード「ginga_iot.js」の概要

135

// libraries var noble = require('noble'); // BLE central module var awsIot = require('aws-iot-device-sdk'); // AWS IoT SDK var moment = require('moment'); // Date library

Centralコード「ginga_iot.js」の部分解説

136

Node.jsのモジュール群(1行目~)

// constant parameters const DEVICE_NAME = 'dev1'; const TOPIC = "devsumi/ginga"; // MQTT TOPIC const MY_ADDRESS = "f3:2f:85:98:69:ce"; // MAC Address of BLE peripheral, "GINGA" const REGION = 'ap-northeast-1';

設定値(定数)(6行目~)

AWS IoTルールエンジンで設定したTopicと同じ値

AWS IoTの設定を行った東京リージョン

// device config. var device = awsIot.device({ keyPath: './certs/private.pem', certPath: './certs/certificate.pem', caPath: './certs/rootCA.pem', clientId: DEVICE_NAME, region: REGION });

Centralコード「ginga_iot.js」の部分解説(続き)

137

AWS IoT Device SDKにおけるdeviceオブジェクトの初期化(12行目~)

証明書のパス

// parse & publish temperature/humidity data function publish_ginga(data) { // parse temperature data var t1 = parseInt(data[0]); var t2 = parseInt(data[1]) / 100; var temp_value = t1 + t2; // temperature value // parse humidity data var h1 = parseInt(data[2]); var h2 = parseInt(data[3]) / 100; var humidity_value = h1 + h2; // humidity value // create & publish message var message = { "device": DEVICE_NAME, "sensor": 'ginga', "time": moment().format(), "temp": temp_value, "humidity": humidity_value }; message = JSON.stringify(message); console.log("# Publish: " + message); device.publish(TOPIC, message); // publish }

Centralコード「ginga_iot.js」の部分解説(続き)

138

GINGAのデータをパースしてAWS IoTにPublishする関数(48行目~)

温度をパース

湿度をパース

Publishするメッセージ

AWS IoTへのPublish

// event for BLE peripheral "discover" noble.on('discover', function(peripheral) { noble.stopScanning();

if (MY_ADDRESS == peripheral.address) { var serviceUUID = peripheral.advertisement.serviceUuids[0]; console.log('# Service UUID: ' + serviceUUID); peripheral.connect(function(error) { if (error) console.log('# Connect error: ' + error); console.log('# Connected to ' + peripheral.uuid); peripheral.discoverServices([serviceUUID], function(error, services) { if (error) console.log('## discoverServices error: ' + error); console.log('## services.length: ' + services.length); var service = services[0]; service.discoverCharacteristics(null, function(error, characteristics) { if (error) console.log('## discoverCharacteristics error: ' + error); console.log('## characteristics.length: ' + characteristics.length); characteristics[0].notify(true, function(error) { if (error) console.log('## notify error: ' + error); setInterval(function() { characteristics[0].read(function(error, data) { if (data) { // publish_humidity(data); // publish humidity // publish_temp(data); // publish temperature publish_ginga(data); // publish GINGA data } }); }, 10 * 1000); // per 10sec }); }); } ); }); } else { console.log("# No my device is discovered"); } });

Centralコード「ginga_iot.js」の部分解説(続き)

139

Peripheralからのadvertisement受信時の処理(80行目~)

BLE Peripheralからのadvertisementを受けてデータが取れたら、Publishする関数を呼ぶ

nobleモジュールでBLEのadvertisementを受けた時のイベント

advertisementが指定したアドレスからの時にはデータ取得のために処理続行

メインファイルと証明書をCentralに設置

各自のファイルセット → kintone → BLE Central

SCPコマンドも良いのですが、ファイルの受け渡しのためにkintoneを利用します

{kintoneのログインID(例: user1)}/ ┣ ginga_iot.js ┣ node_module/ ┃ ┣ aws-iot-device-sdk/ ┃ ┣ noble/ ┃ ┗ moment/ ┗ cert/ ┣ rootCA.pem ┣ certificate.pem ┗ private.pem

kintoneにファイルセットを保存

141

圧縮して、kintoneの「ユーザー管理」アプリに保存

BLE Centralのフォルダ

kintoneに保存したファイルセットをCentralにデプロイ

142

$ curl -X GET "https://kintone-iot.cybozu.com/k/v1/file.json?fileKey={ファイルキー}"\ -H "X-Cybozu-Authorization:{「ID:Passwrod」のbase64エンコード値}"\ -o ./{kintoneのログインID(例: user1)}.zip

ファイル取得のコマンド

$ unzip ./{kintoneのログインID(例: user1)}.zip

ファイルセットの展開

今回は代表何名か分を実施させていただきますm(__)m

CentralからMQTT Publish

Peripheralの電源を入れる

144

下に倒れている状態 (バックの枠に合った状態)

上に倒れている状態 (バックの枠に合ってない状態)

OFF ON

ONに!

Centralでコードを実行

145

$ node ginga_iot.js

PeripheralのデータをPublish

kintoneのレコード登録確認

146

IoT DeviceからAWS IoT/Lambda経由で登録されたレコード

おさらいとまとめ

今回やった内容のおさらい

148

XX

MQTT REST API

①証明書で紐ついたモノから メッセージ(データ)をPublish

Event

②受け取ったメッセージを Topic等でフィルタ

③受け取ったメッセージを Lambdaで処理してkintoneへ連携

MQTT

{ "temp": "14", "humidity": "80", "time": "2016-02-19T12:23:56+09:00", "device": "Lambda test" }

メッセージ kintoneの レコード

今回行った設定のおさらい

149

XX

MQTT REST API

Event

【kintone】 ①アプリ作成 ②APIトークンの取得

MQTT

【AWS Lambda】 ①eventで送られてきたメッセージを 処理して、kintoneに連携するLambda 関数の作成

【AWS IoT】 ①モノの作成 ②ルールの作成 ②ポリシーの作成 ④証明書の生成 ⑤証明書とモノの紐付け ⑥証明書とポリシーの紐付け

【IoT Device】 ①BLEによるセンサー値取得 ②AWS IoT Device SDKによる センサー値のMQTT Publishの設定

• AWS IoT/LambdaでkintoneへのIoTインプットが容易に実現できました

• 今回はデータ連携のハンズオンでしたが、kintoneはチームワークプラットフォームなので、ただのDBやビューワだけでなく、IoTインプットからのワークフロー、コミュニケーション、そしてアクションにつなげる利用がkinotne IoT活用の鍵となります

まとめ

150

ハンズオンは以上です

ハンズオン後片付け(Lambda関数の削除)

152

①今回作成した関数にチェック

②「Delete function」をクリック

③「Delete」をクリック

ハンズオン後片付け(AWS IoT証明書の削除)

153

①証明書のリンクをクリック

②ポリシーにチェック

③モノにチェック

④「Detach」をクリック

⑤「Detach」をクリック

※「Detach」、「Deactive」後に、 「Delete」が可能になる

ハンズオン後片付け(AWS IoT証明書の削除・続き)

154

⑥証明書にチェック

⑧「Deactive」をクリック ⑦「Deactive」をクリック

ハンズオン後片付け(AWS IoT証明書の削除・続き)

155

⑨証明書にチェックのまま

⑪「Delete」をクリック ⑩「Delete」をクリック

ハンズオン後片付け(AWS IoTポリシーの削除)

156

③「Delete」をクリック ②「Delete」をクリック

①ポリシーにチェック

ハンズオン後片付け(AWS IoTモノの削除)

157

③「Delete」をクリック ②「Delete」をクリック

①モノにチェック

ハンズオン後片付け(AWS IoTルールの削除)

158

③「Delete」をクリック ②「Delete」をクリック

①ルールにチェック

本日の内容は以上です