QiMessaging JavaScriptを使ってみた

#はじめに
[SwiftからPepperの音量を変更する](http://qiita.com/miyae/private/774330be89ba89877a71)でqimessagingを使用したので、使い方について個別にまとめました。

#qimessagingとは
JavaScriptからNAOqi APIを呼んでPepper等を操作するためのライブラリです。
[Aldebaranのgithubアカウント](https://github.com/aldebaran/libqi-js)で公開されております。
qimessagingとはなんぞや？というところの詳しい説明が知りたい場合は、Qiita内で検索すれば見つかると思いますので、検索してみてください。

#version1.0について
現在非推奨となっているため、これから使用する予定ならばversion2を使用することをおすすめします。
（ただし、PepperではなくNAOに使用したい場合は、version1.0でないと動かない可能性があります。私が検証していた環境ではそのような現象が発生していました。）
参考：[QiMessaging JavaScript1.0](http://doc.aldebaran.com/2-5/dev/js/index-1.0.html#js-1-0)

###1.ヘッダ
qimessagingのJavaScriptファイルを読み込みます。

```html
<script src="libs/qi/qi.js"></script>      
```

###２.初期化

```js:初期化
var qiSession;
qiSession = new QiSession("xxx.xxx.xxx.xxx");
qiSession.socket().on('connect', function(){
    //connected
}).on('disconnect', function () {
    //disconnected
});
```
`new QiSession([ホスト名 or IPアドレス])`で対象のロボットへ接続するためのQiSessionを生成します。
`qiSession.socket().on('connect', function(){})`のfunction内は接続が成功した際に実行されます。
`.on('disconnect', function(){})`内はセッションが切断された際に実行されます。

###３.サービスの取得
セッションを確立できたら、サービスの取得を行います。

```js:サービスの取得
qiSession.service([サービス名]).done(function(service){
    //OK
}).fail(function(error){
    //NG 
});
```
[サービス名]は操作したい内容に合わせて設定してください。（参考：[NAOqi API](http://doc.aldebaran.com/2-5/naoqi/index.html)）
`.done(function(service){})`内はサービスが取得できた際に実行されます。serviceにサービスへのプロキシが渡されます。
`.fail(function(){})`内はエラーが発生した際に実行されます。

###4.サービスの使用
サービスを使用してPepperを操作します。APIの仕様についてはNAOqi APIのドキュメントを参考にしてください。

```js:音量を設定する①(set)
[プロキシ].setOutputVolume([音量]).done(function(){
    //OK
}).fail(function(error){
    //NG
});
```
```js:音量を設定する②(set)
[プロキシ].setOutputVolume([音量]);　　　　　　　　　　　//done以下は書かなくても動作します
```
```js:音量を取得する(get)
[プロキシ].getOutputVolume().done(function(volume){
    //OK('volume'に音量が返ってきます）
}).fail(function(error){
    //NG
});
```
```js:ALMemoryイベント
qiSession.service("ALMemory").done(function(am){
    am.subscriber([イベント名]).done(function(subscriber){
        subscriber.signal.connect(function(state){
            //イベント発生時に行う処理
　　　　　　　　　　　　　　　　});
　　　　　　　　});
});
```

#qimessaging2について
version1.0の説明に書いた通りなのですが、基本的にはversion2を使用するのが良いかと思います。別記事で説明しているアプリでもversion2を使用しています。
###1.ヘッダ
qimessagingのJavaScriptファイルを読み込みます。今回はqimessaging2を使用するので、以下のように記述してください。

```html
<script src="libs/qi/qi.js"></script>      
```

###２.初期化

```js:初期化
QiSession(function(session){
    //connected
},function (){
    //disconnected
}
, data)
```
`function(session){}`内はセッションが確立できた際に実行されます。sessionにQiSessionオブジェクトが渡されます。
`function(){}`内はセッションが切断された際に実行されます。
`data`には接続先のホスト名もしくはIPアドレスを設定します。

###3.サービスの取得
セッションを確立できたら、サービスの取得を行います。

```js:サービスの取得
[取得したセッション].service([サービス名]).then(function(service){
    //OK
}, function(error){
    //NG
});
```
[サービス名]は操作したい内容に合わせて設定してください。（参考：[NAOqi API](http://doc.aldebaran.com/2-5/naoqi/index.html)）
`function(service){}`内はサービスが取得できた際に実行されます。serviceにサービスへのプロキシが渡されます。
`function(){}`内はエラーが発生した際に実行されます。

###4.サービスの使用
サービスを使用してPepperを操作します。下記は音量を変更する際の例です。APIの仕様についてはNAOqi APIのドキュメントを参考にしてください。

```js:音量を設定する①(set)
[プロキシ].setOutputVolume([音量]).then(function(){
    //OK
}, function(error){
    //NG
});
```
```js:音量を設定する②(set)
[プロキシ].setOutputVolume([音量]);　　　　　//then〜以下を書かなくても動作します。
```
```js:音量を取得する(get)
[プロキシ].getOutputVolume().then(function(volume){
    //OK('volume'に音量が返ってきます）
}, function(error){
    //NG
});
```
```js:ALMemoryイベント
qiSession.service("ALMemory").then(function(am){
    am.subscriber([イベント名]).then(function(subscriber){
        subscriber.signal.connect(function(state){
            //イベント発生時に行う処理
　　　　　　　　　　　　　　　　});
　　　　　　　　});
});
```

#おわりに
近年JavaScriptは書くどころか読むこともしていなかったので、qimessagingを使おうと調べ始めた時は今以上にわからないことだらけでした。
正直、付け焼き刃程度の知識でやっておりますので、至らないところが多々あるのではないかと思いますが、何かご指摘あればコメント等していただけると幸いです。

#補足
qimessagingを使用していると、Promiseの話が出てくるので気になって調べてはみたのですが、現状説明ができるほど深く理解できていないため、説明は省かせていただきます。
参考までに、調べた時に見たサイトのリンクを載せておきます。
[今更だけどPromise入門](qiita.com/koki_cheese/items/c559da338a3d307c9d88)
[[Javascript] Promise/A+仕様を、チュートリアル形式で詳しく解説します - YoheiM .NET](http://www.yoheim.net/blog.php?q=20140310)