Groovy-IoT + kikori (0. 導入前の前提情報)

#はじめに
　本稿ではIoT用のシステムとしてGroovy-IoTとkikoriの説明をします。これらを市販のGateWay(以下、GW)システムに実装することにより、お手軽に手持ちのGWでセンサやアクチュエータを取り扱うことが出来るようになります。また、PCとの組み合わせではお手軽にセンサやアクチュエータの実験を行うことが出来ます。

#[Groovy-IoT](http://www.omiya-giken.com/?page_id=2262)
　Groovy-IoTは[Grove System](http://wiki.seeedstudio.com/Grove_System/)を接続するためのUSBインターフェイスです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/156757/cc070c51-48c0-a4d6-ddff-c88e73b165f2.jpeg" width=50%>

##Groovy-IoTの特徴
 Grove Systemを接続するためのインターフェイスボードとして、Arduino用やRasPi用などがリリースされています。これらのボードはあくまでもそれぞれのターゲットに特化していて汎用的ではありません。Groovy-IoTはUSBとしたことでターゲット選ばずにPCやRasPiなどに接続が可能です。

#[kikori](https://gitlab.com/myst3m/kikori)
　kikoriはGroovy-IoT用に開発されたWebSensorServerです。Clojureで記述されており、JDKを入れた環境で動作します。現在はWindows, MacOS, Linuxで動作します。

![kikori_arch.png](https://qiita-image-store.s3.amazonaws.com/0/156757/9e58054c-a342-801d-2245-aa155a688650.png)

##kikoriの特徴
　Groovy-IoTの各種機能(GPIO, ADC, UART = Grove System相当 + DAC, CLKR)をRESTful, WebSocketでアクセスするためのソフトウェアになります。

##WebSensorServerという考え方
　WebSensorServerとは筆者の造語です。WebServerについては非常に馴染み深いと思います。WebSenserServerを一言で言うと、「WebServerの考え方をセンサやアクチュエータについて拡張したもの」になります。
　アクセス方法として、
　1. RESTful API
　2. WebSocket
　があります。これの開発の動機として文系出身が主体となっている場合のITエンジニアにセンサやアクチュエータの取扱が困難だったことが挙げられます。IoTはインターネットにセンサのデータを上げ、何らかの処理(Post Processing:機械学習など)をさせてそこから得た結果を可視化したりアクチュエータをドライブして物理的な動きに変換します。センサからの信号が既にデータとなっている場合あるいはアクチュエータへただ単にデータを送る場合は良いのですが、問題はデータにするまでの道のりです。この道のりがとてつもなく長く理解するまでに多大な時間がかかるのです(膨大な学習コスト)。

![WebSensorServer.png](https://qiita-image-store.s3.amazonaws.com/0/156757/9bc4f7c8-5f57-119b-8249-84b7473e6cfb.png)


###長い道のり
　下表は筆者の定義したIoTで必要なスキルセットの一部です。異論はあると思いますが本稿のための参考としてください。色々な領域において下から上までの領域をカバーするエンジニアを「フルスタックエンジニア」と呼称されたりしますが、IoTになるとリアルにそれを痛感します。専門的なのはもちろん広範な知識が必要とされます。表中のヘッダでGroovy-IoTとなっているのが筆者、kikoriとなっているのがkikoriの開発者のスキルセットになります。You?と書いてあるところで自分は左側のどのスキルを保持しているかの確認をしてください。

No. |Cat. |Elements         |Required                     |Groovy-IoT|kikori|You ?|Note|
----|-----|-----------------|-----------------------------|----------|------|-----|----|
1.  |IT   |Tools Handling   |Node-RED, etc.               |✓         |✓     |     |    |
2.  |IT   |Web-Access       |Basic network, JSON          |✓         |✓     |     |    |
3.  |AP   |Web Programming  |API, FrameWork handling      |✓ (P)     |✓     |     |    |
4.  |AP   |Cloud Programming|API, FrameWork, Cloud service|          |✓     |     |    |
5.  |AP/MW|-Implementation- |Java, JS, python, C(++), etc.|✓         |✓     |     |    |
6.  |MW   |Server mechanism |CLI parsing, scheduling, etc.|✓         |✓     |     |    |
7.  |MW   |Web-server       |Web-server mechanism         |✓         |✓     |     |    |
8.  |AP   |Value handling   |Application characteristics  |✓         |      |     |    |
9.  |LL   |I/O handling     |Therad, schedule theory      |✓         |✓     |     |    |
10. |LL   |USB driver       |Kernel driver access         |✓         |✓     |     |    |
11. |HW   |USB chip         |Chip characteristics         |✓         |      |     |    |
12. |HW   |IC connection    |Electronics, Schematics      |✓         |      |     |    |
13. |HW   |Sensor element IF|Electronics                  |✓         |      |     |    |
14. |HW   |Sensor elements  |Material characteristics     |✓ (P)     |      |     |    |

上から順番に説明していきます。
表中で(P)と書かれているのはPartiallyの意味で部分的に理解していることを表します。

1. 最近のIoTのシステムではNode-REDなどのシステムを簡便に取り扱うツールが充実してきています。そういったツールの取扱の可否を示します。ITツールの範疇に収まりますので、カテゴリとしてITを設定しました。
2. Web-Accessに際して、基本的なネットワークの知識やJSONの意味の理解をしているか？になります。まだ、プログラミングまでのスキルは要求されないレベルです。
3. Web Programmingが行えるかどうかのレベルになります。これはRESTでのアクセスやJavaScript, pythonのWeb Programming Frameworkが使えるかどうかになります。
4. ここは AWS-IoT, Azureなどの各種Cloud serviceを用いたプログラミングのスキルの有無になります。残念ながら筆者自身にはほとんど経験がないので、現在キャッチアップ中になります。kikoriの作者はスキルを保持しています。
5. AP/MWとなっているのはMiddleWare（ライブラリやフレームワーク）の中身を理解した上で、アプリケーションのプログラミングが行えるか？を想定しています、
6. Serverの内部動作の理解になります。APIが定義された時のコマンド列のパーシングや内部処理のスケジューリングを理解して上でのプログラミングが可能かどうかを想定しています。
7. MWとして、ある程度のWebServerのメカニズムを理解しているか？を想定しています。今回、WebSensorServerとしていますので、WebServerの深い理解は実装する上で重要なファクターになります。
8. Value handlingとしているのはセンサから上がってきた情報を理解した上でポストプロセッシングが出来るかどうかになります。例えば、GPSセンサからのデータが来た時にそのデータにどのような意味があるのか？衛星をロックしていない場合のセンサからの情報をどの様に取り扱えば効果的かを判断するスキルになります。センサ自身が高度化した場合は副次的な利用を考えられかどうかのスキルになります。
9. ここからLowLayerのプログラミングになります。センサやアクチュエータにかなり近づきました。これらを取り扱うためのプログラミングスキルには一般的な知識としてRTOS(RealTimeOS)の概念が必要になってきます。Threadによる効率的なリソース（各種ハードウェアI/F)の利用のスキルです。
10. センサを取り扱う場合はセンサI/Fと呼ばれるレイヤーが出てきます。今回はUSBで構成していますので、これらにアクセスするためにUSB Driverの理解は必須となります。特にGroovy-IoTの場合はアクセス方法としてSerial(CDC-ACM), HID (Human Interface Device)になりますので、Kernelレイヤーでのドライバアクセスになります。
11. ココからHardWareのレイヤーになります。Groovy-IoTで使っているチップのハードインターフェイスの機能の理解になります。ADC, DAC, UART, I2Cの電気的特性の理解と実装になります。
12. 熱電対などで温度計測する場合にどの様なハードウェアインターフェイスを設計するかを検討できるかどうかのレイヤになります。電気的特性を理解して上でインターフェイスチップとの接続を行わないとセンサからの電気信号が取れないだけではなく最悪の場合チップやPC/GWの破壊に繋がります。これらの事象を理解できているかどうかがポイントになります。
13. センサ素子自体の物性特性理解が出来ているかどうかになります。ピエゾ効果、ゼーベック／ペルチェ効果の理解と電気信号の現れ方の理解がキモとなります。

以上になります。

#次回
　[具体的なGroovy-IoT+kikoriでのシステム開発事例をスタートします。](https://qiita.com/ooo_6502/items/1bff47d78331a018d7fd)