さて、前回はAppクラスを作りましたので、いよいよ次は通信機能を作ります。
ガーミン本体には直接Web通信する機能は付いていないので、通信はスマホ経由になります。(WiFi経由もありますが、ここでは置いときます。)
さて、今回はIFTTTのWebhooksに情報を投げるのが目的です。IFTTTに投げるだけなら認証も不要なので簡単です。IFTTTにWebhookを投げてLineに投げる方法はこちら。
アクセスする際のメソッドはGETでもPOSTでもOK。中身はJSON。
ボタンを押した時に動いて欲しいので、通信機能は、前回ガラだけを作ったGenmaiWebHookWidgetDelegate.mcの中に作ります。どのボタンを押した時に動かすのか決めていないので、makeRequest()という関数を新たに作ります。
こんな感じ。
ついでに親クラスのイニシャライズを呼び出すだけのinitialize関数を作っておきます。
さて、通信に使うメソッドはこれ。Communications.makeWebRequest()です。セットしたurlにパラメーター付きでアクセスするメソッドです。ガーミン本体からスマホのガーミンコネクトモバイルを経由(プロキシ)して、Webにアクセスします。ですので、ガーミン本体とスマホのBluetoothがONになっていないとつながりません。また、バックグラウンドでもいいんですが、ガーミンコネクトモバイルが起動していないとつながりません。
makeWebRequest(url、パラメーター、オプション、responseCallback)⇒ オブジェクト
Garmin Connect Mobileをウェブのプロキシとして使用します。
Web要求は非同期です。提供された応答コールバックメソッドは、リクエストが戻るときに呼び出されます。
これの中身(引数)を入れていきます。 最初なのでハードコーディングしますが、気になさらぬよう。
まず、urlです。
var url = "https://maker.ifttt.com/trigger/{イベント名}/with/key/ {IFTTT KEY}";
{IFTTT KEY}のところをIFTTTのサイトで指定されたKEYに置き換えます。
次はパラメーターです。
var params = { "value1" => "Hello", "value2" => "Garmin", "value3" => "World", };
IFTTT側でJSONのタグはvalue1〜3と指定されているので、値を嵌めます。
次はオプション
今回は3つ設定します。
リクエストメソッド。GETでもPOSTでもいいらしいのですが、今回はPOSTを指定。
あとはヘッダーのContent-TypeをJSONにしておきます。
そして、レスポンスタイプをTEXT_PLAINにしておきます。IFTTTからは"Congratulations! You've fired the {イベント名} event"っていう文字だけが返されてくるので、これで受けておきます。
var options = {
:method => Communications.HTTP_REQUEST_METHOD_POST,
:headers => {
"Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON
:responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN
},
};
で、最後は、レスポンスコールバック。
このmakeWebRequest関数はサーバーからレスポンスが来るのを待たずに、次の処理に進んで行きます。なので、コールバック用の関数を作ってそれをresponseCallback変数に格納します。サーバーからレスポンスがあったときに、呼ばれる関数です。
method関数で包んでやることで関数への参照を作ることができます。
var responseCallback = method(:onReceive);
これを引数にして、最後にCommunications.makeWebRequest(url, params, options,responseCallback);でWebアクセスを行います。
onRecieve()関数も作っておかないといけないです。
引数としてresponseCode, dataが渡されます。responseCodeはアクセスした結果。内容はHTTPのレスポンスコードで、200だとアクセス成功です。
マイナスの数字が返された場合は、Bluetoothでスマホと通信できない場合、サーバーアクセス時にエラーが出た場合になります。例えばスマホの電源OFFやGCMが起動していない場合、URLが間違っている場合、タイムアウトになった場合などです。
dataには、IFTTTへのアクセス結果。成功だと"Congratulations! You've fired the {イベント名} event"という文字列が格納されてきます。
また後で修正すると思いますが、いったん、コンソールに成功時と失敗時に結果を出すようにしてみます。
これで、通信部分ができました。
次回は動かしてみます。
公式の参考ページ
https://developer.garmin.com/connect-iq/programmers-guide/communication
Module: Toybox::Communications — Connect IQ SDK