お手軽IoTツール 「MESH」  ~始め方からREST APIを叩いてみるところまでやってみた~

#はじめに
・MESHに出会ってから私自身まだ半年ですが、色々触っていく中ですごく良い製品だと感じました。この感動をぜひ共感したくこのページを書きました。決してMESHの回し者ではありません笑
・IoTを始めてみたいけど、ハードル高そうでなかなか試せてないっという方におすすめです。
・かな~り長文ですので、興味ないところはすっ飛ばしながら読んで頂けると助かります。

#このページの目標
- MESHの概要を理解し、始め方からカスタムコードによるWEB APIの連携まで使って見るところまでを目指します。
- このページを最後までやるとざっとですが以下のことが理解できると思います。
 - MESHの基本的な使い方(GPIOタグは除く)
 - MESHのカスタムタグからREST APIを叩く方法
 - Qiita API(REST API)の基本的な使い方

#そもそもMESHってなに？
- Bluetoothを搭載したIoTブロック（SONY製）です。スマホと連携して様々な仕掛けを作ることができます。現在7種類のIoTブロックがあり、MESHではIoTブロックのことを「MESHタグ」と呼ぶようです。

[MESH IoTブロックラインナップ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/21921ab4-85de-d092-677c-6094e2791c24.png)

- MESHの特筆すべき特徴

 <details><summary>その１：ノンプログラミングで簡単にIoTを試せる！</summary>・MESHではスマートフォンアプリとIoT デバイスをBluetoohで連携可能なので、マイコンや電子回路の知識を必要とせずに簡単に始めることができます。<br />・スマートフォンアプリでは直感的なプログラミング(ドラック＆ドロップ)が可能なため手軽に様々な仕掛けを作成することができます。</details>
<details><summary>その２：クラウドサービス・REST APIとの連携が可能！</summary>
 ・GmailやIFTTT(イフト)といったクラウドサービスとの連携が標準で搭載されています。※IFTTTって何？という方は[こちら](http://www.atmarkit.co.jp/ait/articles/1711/22/news031.html)を読んでみてください。 <br/>・MESH SDKを利用するとREST APIを叩くことも可能です。※こちらはJava Scriptによるコーディングが必要です。<br /></details>

<details><summary>その３：GPIOも使える!</summary>・GPIOも使えるので秋葉原で買えるようなセンサーも使うことが可能です。
　※こちらの機能は私も試したことがないので詳しくは分かっていません。</details>


[スマートフォンアプリの画面イメージ]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/54f88dfc-8c8c-733b-6d34-8e39c40c3ac4.png)



- <details><summary>つまるところMESHとは！<br/>
 センサ-スマホ-クラウド連携を実現する本格的なIoTツールです！しかも、ほぼノンプログラミングで！(※1) めっちゃ凄い製品だと思いませんか！？</summary>(※1):MESHに焦点を当てて考慮した場合です。IFTTT等のクラウドサービス使う場合はプログラミングが必要になるかもです。偉そうに書いてますが、私自身はあんまりIFTTTを使ったことがありません。:sweat_smile:</details>

#ごちゃごちゃ書いてるけど結局何？と思ったあなた
細かいことはいいから何ができるのか教えてくれ！っと思ったあなたは[MESHレシピ集](https://recipe.meshprj.com/jp/)を覗いてみてください。様々な活用例が載っているのでイメージし易いと思います。

#めっちゃいい製品だけど実用での利用は厳しいかも!?
- <details><summary>一応MESHの長所だけなく、短所についても考察してみました。</summary>※MESHハブを使うとスマホだけでなくラズパイでもMESHタグを利用できるようですが、今回はスマホを前提に記載しています。</details>
- <details><summary>以下に短所を挙げました。</summary>「実用での利用が厳しそう」＝「短所」という観点で列挙しています。</details>
 - <details><summary>その１：スマホが10m以内に無いと使えない。</summary>※詳しくは[こちら](https://first-flight.sony.com/pj/mesh)</details>
 - <details><summary>その２：バッテリーが１ヶ月くらいしか持たない。</summary>※詳しくは[こちら](https://support.meshprj.com/hc/ja/articles/211943568-MESH%E3%82%BF%E3%82%B0%E3%81%AE%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC%E3%81%AF%E3%81%A9%E3%81%AE%E3%81%90%E3%82%89%E3%81%84%E3%82%82%E3%81%A1%E3%81%BE%E3%81%99%E3%81%8B-)</details>
 - <details><summary>その３：スマホ1台につきMAX10個までのMESHタグしか使えない。</summary>※詳しくは[こちら](https://support.meshprj.com/hc/ja/articles/212601267-MESH%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AAOS-%E6%A9%9F%E5%99%A8%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)</details>

 - <details><summary>その４：MESHタグ単価が高い。</summary>・一番安いものでも5,980円します。※詳しくは[こちら](http://meshprj.com/jp/tag/)</details>
 - <details><summary>その５：屋外の利用は厳しそう。</summary>・屋外で使えないことは無いのですが、温度が0℃～ 35℃、防水、防塵、耐塩害性は無しという条件、更に寿命や運用まで考慮すると屋外どこでもという訳にはいかなさそうです。※詳しくは[こちら](https://support.meshprj.com/hc/ja/articles/212147328-MESH%E3%82%BF%E3%82%B0%E3%81%AF%E5%B1%8B%E5%A4%96%E3%81%A7%E3%82%82%E4%BD%BF%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)</details><br/>

- <details><summary>以上の点を踏まえると、学校で、個人宅で、オフィスの会議室で、といった限定的なシーンでは実用での利用が可能と言えそうです。</summary>しかし、工場や屋外といったより幅広いシーンではさまざまな問題や課題に直面することが想定されるため、残念ながら実用での利用は厳しそうと言わざる得ないでしょう。</details>

#MESHをはじめる
##これから作成するもの

 - MESHタグ(ボタン)をリモートシャッターに見立て、遠隔操作でスマホの自撮りをやってみる。

##必要なもの

- ハードウェア：
 - スマホ(iOSかAndroid)
 - MESHタグのボタンタグ(緑色のブロック)
- ソフトウェア：
 - MESHアプリ([Apple store](https://itunes.apple.com/jp/app/mesh-creative-diy-toolkit/id981090691?&mt=8), [Google Play](https://play.google.com/store/apps/details?id=jp.co.sony.mesh)から無料でダウンロード)

##MESHアプリの初期設定
 - まずはMESHアプリとMESHタグをペアリングさせ、Bluetooth接続を確立します。
 - MESHアプリを起動後、チュートリアルに従ってください。めっちゃ分かりやすかったのでここでの詳細説明はやめておきます。代わりにちょっと分かりにくかったと感じたところのみ、解説します。
 - 分かりにくいと感じた点：
  - その１：MESHタグの電源について<br/>長押しすると白く光り電源がオンになります。すぐに光が消えてしまうので、あれ電源入った？と感じるかもしれません。続けて、短押しすると今度は緑に光るはずです。緑に光っていれば電源が入っています。ちなみにもう一度長押しすると電源がオフになります。
  
  - その２：ペアリングについて<br/>ペアリング初回時は中々に時間が掛かります。MESHタグをスマホに近づけてみたり、付近にBlutooth通信機器がある場合離れてみたり、MESHタグを再起動するなど辛抱強く試してみてください。

[左：長押し時、右：短押し時]
<img src="https://qiita-image-store.s3.amazonaws.com/0/144326/49570209-bfb5-5931-718f-3a20c401b259.jpeg" width=40%> <img src="https://qiita-image-store.s3.amazonaws.com/0/144326/7ce9adb3-c021-5984-c785-2baf8681c84a.jpeg" width=39.5%>

##MESHの仕掛けを作ってみる
- こちらもチュートリアルが充実しているので詳細な説明は省きました。以下図のように作ってみてください。
![IMG_0159.PNG](https://qiita-image-store.s3.amazonaws.com/0/144326/2d955887-6991-5bfe-dd03-2c02067c715e.png)

- これで完成です！あとはボタンタグを押して見てください。パシャリと音がなって写真が撮れるはずです。めっちゃ簡単ですね！！ちなみにちょっと残念なのですが、カメラアプリのようにカメラ画面は出てきません。なのでどんな写真になるかは撮ってからでないと分からないです。自撮りするにはかなり難易度高いですね笑
- これじゃ物足りないという方は[MESHレシピ集](https://recipe.meshprj.com/jp/)を参考に色々試して見てください。ノンプログラミングで作れるので色んな仕掛けがサクサクと作れると思います。


#MESH SDKとカスタムタグを使ってREST APIを叩いてみる
- ここから先は中級向けになってきます※プログラミングも必要になってくるため

##これから作成するもの
##必要なもの
- ハードウェア：
 - スマホ(iOSかAndroid)
 - MESHタグのボタンタグ(緑色のブロック)
- ソフトウェア：
 - MESHアプリ([Apple store](https://itunes.apple.com/jp/app/mesh-creative-diy-toolkit/id981090691?&mt=8), [Google Play](https://play.google.com/store/apps/details?id=jp.co.sony.mesh)から無料でダウンロード)
 -  MESH SDK アカウント
 - Qiita アカウント
 
##Qiita APIの準備
###APIの有効化　~アクセストークンの発行~
- Qiitaの設定画面にアクセスし、画面左のナビゲーションペインから「アプリケーション」を選択し、リンク「新しくトークンを発行する」をクリックする。
![Screenshot 2018-05-03 at 16.07.34.png](https://qiita-image-store.s3.amazonaws.com/0/144326/613f7819-171a-c35b-92fe-43b1178656d6.png)

-　必要事項を記述し、「発行する」をクリックして権限を設定します。今回は「read_qiita」のみにしてみました。<br/>ちなみに[Qiita APIv2ドキュメント](https://qiita.com/api/v2/docs#%E6%A6%82%E8%A6%81)によると各スコープは以下を意味するそうです。
```
read_qiita       - Qiitaからアクセストークンに紐付いたユーザに関連したデータを読み出す
read_qiita_team  - Qiita:Teamからデータを読み出す
write_qiita      - Qiitaにデータを書き込む
write_qiita_team - Qiita:Teamにデータを書き込む
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/b4c1bc61-12ab-b94e-90fc-df46a0d2802b.png)

- アクセストークンが発行されたので、メモ帳等にコピペしておきます。
![Screenshot 2018-05-03 at 16.26.31.png](https://qiita-image-store.s3.amazonaws.com/0/144326/1cdd07f6-5400-e1fe-d19b-05b4e07e7769.png)

###Qiita APIのテスト〜Postmanを使ってみる〜
- [Postman](https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=ja)というツールをご存知でしょうか？REST APIを簡単に試すのに便利なツール(Chromeアプリ)です。最近はネイティブアプリでもリリースされています。今回はこのPostmanを使ってQiita API経由で私自身が投稿した記事を取得してみます。
- Postmanを起動し、画面上部のバーを"GET"にし入力欄に「https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20」
を入力します。その後バーのすぐ下の「Headers」タブをクリックしkey欄に「Authorization」、value欄に「Bearer▲アクセストークン」を入力します。※▲は半角スペース<br/>成功すれば下の画像のようにPostmanの画面下部にjsonデータがダウンロードされます。
![Screenshot 2018-05-03 at 17.21.15.png](https://qiita-image-store.s3.amazonaws.com/0/144326/6e98b6a0-41fb-2617-5d9f-9009d3e77302.png)

- Postman でjavascriptの自動生成
画面右上の方に「code」というボタンがあるのでそれを押します。
プルダウンメニューから言語を選択します。今回は「JavaScript Jequery Ajax」を選択します。
このコードは後ほど利用します。
![Postman でjavascriptの自動生成.png](https://qiita-image-store.s3.amazonaws.com/0/144326/d185952c-32a4-04e9-865e-dc22ffe0e4a8.png)
##MESH SDKの準備
###アカウント新規作成
- [MESH公式サイト](https://meshprj.com/jp/)へアクセスし"Create New Account"をクリックします。

[MESH SDKログインサイト]
![Screenshot 2018-05-02 at 23.png](https://qiita-image-store.s3.amazonaws.com/0/144326/4a303709-0312-2761-c37a-922312bb92a5.png)

- 必要事項を入力し、"I agree to the MESH SDK Terms of Use"をチェックし"REGISTER"ボタンをクリックします。クリック後登録確認画面に遷移しますので、再度REGISTER"ボタンをクリックします。

[MESH SDK アカウント新規登録]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/144326/272a1b7c-9d7d-e404-2e82-50eedcb0441b.png)

- 以下のようなアカウント認証メールが送られてくるので、メール本文のリンクををクリックしてアカウントをアクティベートします。※メールが送られてから7日間でリンクが無効化されるので忘れずにクリックしておきましょう

[アカウント認証メール]
![Screenshot 2018-05-02 at 23.png](https://qiita-image-store.s3.amazonaws.com/0/144326/34117517-3cdb-146e-0fe1-e053cde14722.png)

###カスタムコードを作成する
- アカウント認証後、[Mesh SDK](https://meshprj.com/signin/)にログインすると以下のようなページにアクセスできます。「Create New Tag」をクリックします。
![カスタムコードを作成.png](https://qiita-image-store.s3.amazonaws.com/0/144326/c6fecba7-d053-cd91-f6cb-5c59921a700a.png)
- タグの名前やアイコンをお好みで命名します。また「Function」もお好みで命名し、「▼」を押してメニューを展開します。次に「Connector」の「Input Conneotor」と「Output Connector」の「+」をクリックします。
![カスタムコードを作成3.png](https://qiita-image-store.s3.amazonaws.com/0/144326/050c3d2c-aa35-22aa-052c-5f2bfbd934fc.png)
- 「Code」の「▼」をクリックして次に「Execute」をクリックして、コードを記述します。
![カスタムコードを作成5.png](https://qiita-image-store.s3.amazonaws.com/0/144326/edbc6131-5a5b-2594-96cc-62c1edfb3336.png)

コードには先程Postmanで生成したコードを貼り付け一部手直します。
修正１：変数settingsのheaderから「postman-token」を消す
修正２：$.ajax().done()のコールバック関数中console.log()→logに変更
追加１：$.ajax().done()のコールバック関数中、APIの結果の生データと整形データをログとして出力する処理を追加

```javascript
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20",
  "method": "GET",
  "headers": {
    "authorization": "Bearer yourQiitaAccessToken",
    "content-type": "Application/json",
    "cache-control": "no-cache"
  }
}

$.ajax(settings).done(function (response) {
  log(JSON.stringify(response));
	for(var i = 0; i < response.length; i++){
		log("//////////\nタイトル ：" + response[i].title + "\n内容：" + response[i].body);
	}
});
```
最後にページ上部にある「SAVE」をクリックします。

- 上記はPostmanで思いっきり楽しましたが、[公式ドキュメント](https://meshprj.com/sdk/doc/ja/)に則って真面目にコードを書いてみました。

```javascript
ajax ({
	url: "https://qiita.com/api/v2/authenticated_user/items?page=1&per_page=20",
	method: "GET",
	headers: {
		"authorization": "Bearer yourQiitaAccessToken",
		"content-type": "Application/json",
		"cache-control": "no-cache"
	  },
	timeout : 5000,
	success: function( contents ){
		log(JSON.stringify(contents));
		for(var i = 0; i <  contents .length; i++){
			log("//////////\nタイトル ：" +  contents [i].title + "\n内容：" +  contents [i].body);
		}
		callbackSuccess( {
			resultType : "continue",
			runtimeValues : runtimeValues
		} );
	},
	error : function ( request, errorMessage ) {
		log("request:" + JSON.stringify(request));
		log("errorMessage:" + JSON.stringify(errorMessage));
		callbackSuccess( {
			resultType : "continue",
			runtimeValues : runtimeValues
		} );
	}
});

return {
    resultType : "pause"
};
```
<details><summary>※細かすぎるのですが、私が最近ハマったので書いておきます。興味ある方はどうぞ</summary>ポイントとしてはcallbackSuccess()とコード末尾のretrun文です。
後に、MESHのアプリ内にてタグを連携させるためには意識しておく必要があります。
retrun文のpauseによりajaxの非同期通信が終わるまで一時的に待機し、終了したらcallbackSuccess()中のcontinue信号を次のタグに伝える仕様になってます。javascriptは非同期処理のため、同期処理が必要な場合はコールバック関数を使って明示的に記載する必要があるみたいです</details>
###MESHアプリとの連携設定
- ここからはiOSアプリまたはAndroidアプリの操作になります。アプリを起動し、画面右上の「・・・」をタップし、「アカウント」をタップします。
![MESHアプリとの連携設定.png](https://qiita-image-store.s3.amazonaws.com/0/144326/d496bd5a-ef13-f80f-dd36-1da83eca1d80.png)
- MESH SDKのサインインに使ったメールアドレス、パスワードを使って認証を行います。
![IMG_0174.PNG](https://qiita-image-store.s3.amazonaws.com/0/144326/ea94a7b5-8732-fe85-f71b-3bdfce712637.png)
- ログイン後は今まで作ってきたカスタムアプリ一覧が表示されます。皆様は先程作ったアプリを追加してください。
![IMG_0175.PNG](https://qiita-image-store.s3.amazonaws.com/0/144326/0219f266-fc9a-e316-6ab9-88b9069cbfc2.png)

##MESHの仕掛けを作る
- 画面右のナビゲーションのカスタムの項目から先程加えたタグを長押しして、画面中央にドラッグ&ドロップします。次にボタンタグも追加し、以下図のようにします。
![IMG_0176.PNG](https://qiita-image-store.s3.amazonaws.com/0/144326/1797144a-4725-d87d-3ab5-46a05ccb1cc4.png)

- ここまでで準備は完了です。MESHタグ(ボタン)をクリックして見てください。その後アプリの画面右のナビゲーションのカスタムの項目のログをクリックするとAPIで引き出したQiitaの情報が吐き出されています。 
![MESHアプリとの連携設定2.png](https://qiita-image-store.s3.amazonaws.com/0/144326/be22dbc7-1948-3d0f-5230-a99769900edd.png)

#最後に
MESH SDKを使った外部クラウドサービスとの連携に苦労したので備忘録も兼ねて書いてみました。
結構ハマったところもありましたが、やはりしっかりと解説されている[リファレンスマニュアル](https://meshprj.com/sdk/doc/ja/)をベースに色々試して見るのが良いと思います。
IFTTTとかとも連携させてみるとLINEをはじめ各種様々なクラウドサービスとの連携が更に簡単に幅広くできるので可能性が広がります。
MESHを色々いじってみた結果、「簡易&お手軽なNode-RED」のようなものだと感じました。Node-REDにハードルを感じている方はMESHから初めて見るのもありかと:point_up_tone3:

#引用・参考サイト
引用：[MESH公式サイト](https://meshprj.com/jp/)
参考：[MESH SDKログインサイト](https://meshprj.com/signin/)
参考：[MESH SDK リファレンスマニュアル](https://meshprj.com/sdk/doc/ja/)
参考：[さまざまなサービスが連携できる「IFTTT（イフト）」の使い方](http://www.atmarkit.co.jp/ait/articles/1711/22/news031.html)
参考：[MESHレシピ集](https://recipe.meshprj.com/jp/)
参考：[MESHタグのバッテリーはどのぐらいもちますか？](https://support.meshprj.com/hc/ja/articles/211943568-MESH%E3%82%BF%E3%82%B0%E3%81%AE%E3%83%90%E3%83%83%E3%83%86%E3%83%AA%E3%83%BC%E3%81%AF%E3%81%A9%E3%81%AE%E3%81%90%E3%82%89%E3%81%84%E3%82%82%E3%81%A1%E3%81%BE%E3%81%99%E3%81%8B-)
参考：[MESHはどのようなOS、機器で利用できますか？](https://support.meshprj.com/hc/ja/articles/212601267-MESH%E3%81%AF%E3%81%A9%E3%81%AE%E3%82%88%E3%81%86%E3%81%AAOS-%E6%A9%9F%E5%99%A8%E3%81%A7%E5%88%A9%E7%94%A8%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)
参考：[MESHタグは屋外でも使うことができますか？](https://support.meshprj.com/hc/ja/articles/212147328-MESH%E3%82%BF%E3%82%B0%E3%81%AF%E5%B1%8B%E5%A4%96%E3%81%A7%E3%82%82%E4%BD%BF%E3%81%86%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B-)
参考：[MESH製品仕様](https://first-flight.sony.com/pj/mesh)
参考：[Qiita APIv2ドキュメント](https://qiita.com/api/v2/docs#%E6%A6%82%E8%A6%81)
参考：[(Qiita API v2 活用) Qiita の記事を API 経由で取得する方法](https://qiita.com/kojiro-s/items/f4fa4f99d8a1b85fa521)