旅に出たり、走ったり、旅に出て走ったり

走った記録や旅行記、旅ランの記録などを書いています。Garminなどのランガジェットの紹介もします。

【ConnectIQプログラミング6】Communicationsでインターネットに情報発信

 さて、前回はAppクラスを作りましたので、いよいよ次は通信機能を作ります。

genmaigenmai.hatenablog.com

ガーミン本体には直接Web通信する機能は付いていないので、通信はスマホ経由になります。(WiFi経由もありますが、ここでは置いときます。)

さて、今回はIFTTTのWebhooksに情報を投げるのが目的です。IFTTTに投げるだけなら認証も不要なので簡単です。IFTTTにWebhookを投げてLineに投げる方法はこちら。

genmaigenmai.hatenablog.com

f:id:Genmai_17:20200320102843p:plain

アクセスする際のメソッドはGETでもPOSTでもOK。中身はJSON

ボタンを押した時に動いて欲しいので、通信機能は、前回ガラだけを作ったGenmaiWebHookWidgetDelegate.mcの中に作ります。どのボタンを押した時に動かすのか決めていないので、makeRequest()という関数を新たに作ります。

using Toybox.WatchUi as Ui;
using Toybox.Communications;

class GenmaiWebHookWidgetDelegate extends Ui.BehaviorDelegate {

    function initialize() {
        BehaviorDelegate.initialize();
    }

   function 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アクセスを行います。

   function makeRequest() {
       var url = "https://maker.ifttt.com/trigger/{イベント名}/with/key/{IFTTT KEY}";

       var params = {
           "value1" => "Hello",
           "value2" => "Garmin",
           "value3" => "World",
       }; 

       var options = {
           :method => Communications.HTTP_REQUEST_METHOD_POST,
           :headers => {
                   "Content-Type" => Communications.REQUEST_CONTENT_TYPE_JSON},
           :responseType => Communications.HTTP_RESPONSE_CONTENT_TYPE_TEXT_PLAIN
       };

       var responseCallback = method(:onReceive);
       
       Communications.makeWebRequest(url, params, options, responseCallback);
   
   }

 onRecieve()関数も作っておかないといけないです。

引数としてresponseCode, dataが渡されます。responseCodeはアクセスした結果。内容はHTTPのレスポンスコードで、200だとアクセス成功です。

ja.wikipedia.org

マイナスの数字が返された場合は、Bluetoothスマホと通信できない場合、サーバーアクセス時にエラーが出た場合になります。例えばスマホの電源OFFやGCMが起動していない場合、URLが間違っている場合、タイムアウトになった場合などです。

dataには、IFTTTへのアクセス結果。成功だと"Congratulations! You've fired the {イベント名} event"という文字列が格納されてきます。

また後で修正すると思いますが、いったん、コンソールに成功時と失敗時に結果を出すようにしてみます。

   function onReceive(responseCode, data) {
       if (responseCode == 200) {
           System.println("Request Successful");       // print success
           System.println(data);
       }
       else {
           System.println("Response: " + responseCode);// print response code
           System.println(data);
       }

これで、通信部分ができました。

次回は動かしてみます。

にほんブログ村 その他スポーツブログ マラソンへ
にほんブログ村

 

公式の参考ページ

https://developer.garmin.com/connect-iq/programmers-guide/communication

Module: Toybox::Communications — Connect IQ SDK