MESHを使って、Twilio経由で電話をかけてみる

:::note alert
2023年5月1日を持ちまして、株式会社KDDIウェブコミュニケーションズのTwilioリセール事業が終了したため、本記事に記載されている内容は正確ではないことを予めご了承ください。
:::

# MESHを使って、Twilio経由で電話をかけてみる

## はじめに

[MESH](http://meshprj.com/jp/)とは、Sonyさんが提供しているIoTデバイスです。
ボタンや人感センサー、動きセンター、温度センサーなどが用意されていて、スマホのアプリ上でドラッグ・アンド・ドロップでそれぞれを接続し、思いついた機能を簡単に実装することができます。
今回は、このMESHを使って、Twilio経由で電話をかけてみたいと思います。

#### Twilioとは

たった数行でプログラムから電話をかけたり、電話を受けることができるAPIサービスです。
Twilioについては、[こちら](http://twilio.kddi-web.com/)をご覧ください。

## しくみ

MESHには、MESH SDKという外部のWebサービスと連携するためのしくみが用意されており、今回はこのSDKを使って、Twilioの機能を呼び出したいと思います。

#### システムフロー
![MESHを使って電話をかける.png](https://qiita-image-store.s3.amazonaws.com/0/86046/c7f3a666-ab64-03e5-7f7c-b9f8fadab4f1.png)

1. MESHのスマホアプリ上に、MESHのボタンタグ（ボタンではなくても良いです）と、今回作成するTwilio用のタグを配置し、それぞれを接続します。
2. ボタンが押下されると、Twilioタグからajax経由でTwilioのRest APIをコールします。
3. Rest APIが電話をかけ、相手が応答したらTwilio上に予め作成しておいたTwiML Appsを呼び出すようにします。
4. TwiML Appsには、あらかじめ応答させたいメッセージを記述しておき、それを使って電話機に音声を流します。

なお、電話をかける相手を毎回変更したり、音声メッセージを都度変更したい場合などは、別途外部の公開サーバーを用意する必要がありますが、今回のように、決められた相手にのみ、決まったメッセージだけを流したい場合はサーバーを用意する必要はありません。

## Twilio側の準備

まずは、Twilioのアカウントが必要です。
Twilioアカウントの取得は、[こちら](http://jp.twilio.com/try-twilio/kddi-web)からできます。
今回のテストは、トライアルアカウントでも実行することができます。
アカウントを作成したら、050から始まる電話番号を１つ購入しておいてください。なお、トライアルアカウントの場合は、発信先として指定できるのは、認証済み電話番号のみとなりますので、ご注意ください。

Twilioをアカウントを取得したら、早速設定をしていきましょう。

### TwiML Binsを作成する

相手に流したい音声を定義しておきます。
Twilioアカウントを使って、[管理コンソール](http://jp.twilio.com/login/kddi-web)にログインします。
左側のボタンメニューをクリックし、スライドしてきた一覧の中から「デベロッパーセンター」を選択します。
<img width="941" alt="スクリーンショット 2016-10-16 10.31.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/bd9dd83a-88a5-cb76-fd70-8b77c28413b5.png">

デベロッパーセンターの一覧から、「TwiML Bins」を選択し、「＋」アイコンを押して、新しいTwiML Binsを作成します。
<img width="575" alt="スクリーンショット 2016-10-16 10.36.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/abfcdeb2-9be4-90f7-236f-b1d7d77d46cc.png">

以下のようなTwiMLを作成します。
FRENDLY NAME:　MeshCall

```lang:TwiML
<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Say language="ja-JP">こんにちは。メッシュのボタンが押されたよ。</Say>
</Response>
```

上記TwiML内の「こんにちは。〜」の部分が、実際に電話がかかったあとに流れるメッセージになりますので、必要に応じて変更してください。
画面中央下部に、緑色で「Valid TwiML」と表示されるのを確認して、「Create」ボタンを押します。

TwiML Binsが作成できたら、画面上部にあるコピーアイコンを押して、作成したTwiML BinsのURLをコピーし、どこかにメモしておきます。
<img width="916" alt="スクリーンショット 2016-10-16 10.43.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/1bb20db7-4365-cd4a-d608-d0e28271a5a2.png">

### TwiML Appsを作成する

次に、いま作成したTwiML Binsを呼び出すためのTwiML Appsを作成します。
左側のボタンメニューを押して、スライドしたメニューの中から「電話番号」を選択します。
<img width="417" alt="スクリーンショット 2016-10-16 10.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/8f379b01-7e55-4e87-3f81-f6098c0d0f00.png">

電話番号メニューの中の、「ツール」の中から「TwiML Apps」を選択し、さらに「＋」アイコンを押してTwiML Appsを新規で作成します。
<img width="538" alt="スクリーンショット 2016-10-16 10.49.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/fa326619-eaff-0377-3559-89aa32a321d6.png">

フレンドリーネーム: MeshCall
REQUEST URL: 先程作成したTwiML BinsのURL
<img width="1158" alt="スクリーンショット 2016-10-16 11.00.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/ed49c6cd-83d5-ab57-3d78-570f38642cf9.png">

最後に「保存」ボタンを押します。

### MESHのソフトウェアタグを作成するための情報を集める

このあとの作業で利用する情報をTwilio上から集めておきます。

#### AccountSIDとAuthToken

左側のホームボタンを押して、そこに表示されるACCOUNT SIDとAUTH TOKENを控えておきます。なお、AUTH TOKENについては、標準では見えないようになっているので、目のアイコンをクリックして確認してください。
<img width="868" alt="スクリーンショット 2016-10-16 11.11.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/7b10a49f-c478-97ea-7b67-2f314d4b76c5.png">

#### TwiML AppsのSID

先ほど作成したTwiML Appsをもう一度開き、SIDを調べて控えておきます。
<img width="823" alt="スクリーンショット 2016-10-16 11.48.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/05eec658-715f-345c-a16c-903841ac6a66.png">

以上で、Twilio側の準備はすべて終了です。

## MESH SDKを使って、ソフトウェアタグを作成する

[MESH SDK](https://meshprj.com/sdk/)のページに移動し、「Start using the MESH SDK」ボタンを押します。

「Create New Account」をクリックして、新規にユーザアカウントを作成します（メールによる本人確認があります）。
<img width="1301" alt="スクリーンショット 2016-10-16 11.55.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/51cf32e2-9ec2-b2ee-d433-4901f8c4a6fd.png">

アカウントの作成が済んだら、作成したアカウントでログインをします。

タグを作成するには、「Create New Tag」を押します。
<img width="244" alt="スクリーンショット 2016-10-16 11.58.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/2cb96324-07d9-fc7b-ad10-6cba149207fc.png">

タグに適当な名前をつけます（図では「Twilio Call」）。
Functionにも名前をつけます（図では「Call」）。
Input Connectorの右側の「+」アイコンを押して、Input Connectorを一つ作成します。

<img width="748" alt="スクリーンショット 2016-10-16 12.05.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/86046/b56b3306-b693-612f-54dc-c1706585b00f.png">


Codeの中の「Execute」をクリックし、以下のコードを記載します。

```lang:JavaScript
// Twilio経由で電話をかけるAPI
var apiURL = "https://api.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Calls.json";
 
//APIを叩く際のパラメータ
//プロパティの値を渡す
var data = {
    "To" : "+8190XXXXXXXX", // 発信先の電話番号（E.164形式）
    "From" : "+8150XXXXXXXX", // Twilioで購入した050番号（E.164形式）
    "ApplicationSid" : "[TwiML Apps SID]"
};
 
ajax ({
    url : apiURL,
    data : data,
    type : "post",
    timeout : 5000,
    success : function ( contents ) {
        log("Call success");
        callbackSuccess( {
            resultType : "continue",
        } );
    },
    error : function ( request, errorMessage ) {
        log("Call Error");
        callbackSuccess( {
            resultType : "continue",
        } );
    },
	beforeSend: function(xhr) {
		var credentials = Base64("[ACCOUNT SID]:[AUTH TOKEN]");
		xhr.setRequestHeader("Authorization", "Basic " + credentials);
	}
});
 
return {
    resultType : "pause"
};

// BASE64処理
function Base64(str) {
        return btoa(unescape(encodeURIComponent(str)));
};
```

コードの中に書かれている[ACCOUNT SID]、[AUTH TOKEN]、[TwiML Apps SID]は、先程控えておいた値に書き換えてください。
また、発信先の電話番号（トライアルアカウントでテストするときは、認証済み番号のみ指定が可能です）と、購入した電話番号も適切な値に書き換えてください。
電話番号の指定方法は、E.164形式となりますので、先頭の「0」を「+81」に書き換える必要があります（例：090-1234-5678→+819012345678）。

ここまで出来たら、画面上部のSaveボタンを押して、登録を完了します。
以上で、MESHのソフトウェアタグができました。

## スマホのMESHアプリを使ってテストをする

スマホのMESHアプリを起動して、新しいレシピを作成します。

ボタンタグをペアリングしてください。
![IMG_0915.PNG](https://qiita-image-store.s3.amazonaws.com/0/86046/107d9439-638b-b14b-a5c6-05ac198585a1.png)

右上のメニューから「SDK」を選択します。
![IMG_0916.PNG](https://qiita-image-store.s3.amazonaws.com/0/86046/8cbb28ee-e7aa-ee6a-569c-9ef0b10c0248.png)

SDKのアカウントでログインします。
![IMG_0917.PNG](https://qiita-image-store.s3.amazonaws.com/0/86046/e09c3976-efe2-ee62-563b-cba02b02ee2c.png)

カスタムタグにSDKで作成したタグが表示されます。
![IMG_0918.PNG](https://qiita-image-store.s3.amazonaws.com/0/86046/c3da51a2-c4a4-456e-b008-75ca7061c762.png)
画面上のタグには、Twilioのロゴが表示されていますが、今回の手順で作成した場合にはロゴは表示されません。

作成したソフトウェアタグを画面上にドラッグし、ボタンタグと紐付けます。
![IMG_0919.PNG](https://qiita-image-store.s3.amazonaws.com/0/86046/c6ffbef5-31ca-4539-0dd2-0efa692fd226.png)

お疲れ様でした。以上で設定は全て終わりです。
あとは、MESHのボタンタグを押して電話がかかってくれば成功です。