CPとcloudBitでIoT - 2.cloudBitの情報取得


cloudBitを使用するには、使用するcloudBitをlittleBits社のCloud ControlにWebブラウザでアクセスし、画面からあらかじめ登録しておく必要があります。ここでは手始めに、登録されたcloudBitに関して、どのような情報が取得できるのか、取得方法と合わせてみていきましょう。

APIドキュメントにある実行例を見ると、エンドポイント /devices/{deviceId} をGETメソッドで呼び出すことで、JSON形式で次に挙げるような情報が得られると記述されています。

[
    {
        "id": "000001",
        "label": "000001",
        "subscribers": [],
        "subscriptions": [],
        "user_id": "1",
        "wifi": {}
    },
    {
        "id": "000002",
        "label": "000002",
        "subscribers": [],
        "subscriptions": [],
        "user_id": "1",
        "wifi": {}
    }
]

そこで、これらの情報を格納するための器として、次のようなメンバ変数を持つCloudbitクラスを定義することにします。

public class Cloudbit {
    // "id": "000001"
    private String deviceId;

    // "label": "000001"
    private String label;

    // "subscribers": []
    // "subscriptions": []

    // (different from the doc) "user_id": "1" -> 1
    private String userId;
}

APIドキュメントによるとuser_idは文字列として前後をリテラルで囲った形で通知されるようですが、実際にはリテラルで囲まれない形で(つまり数値として)通知されているようです。一応、コメントに残しておくことにします。

一方、ドキュメントには記述がないのですが、is_connectedでcloudBitの接続状態がオンラインであればtrue、オフラインであればfalseという値で通知されてきています。こちらの値も格納しておくことにしましょう。

各メンバ変数にはアクセサとなるgetterとsetterを用意しておくことにします。Eclipseであれば、ソースコードを右クリックし、Source→Generate Getters and Setters...で自動生成させられるので楽ですね。

合わせて、動作確認用にtoString()メソッドも自動生成させておきましょう。

    @Override
    public String toString() {
        return "Cloudbit ["
                + (deviceId != null ? "deviceId=" + deviceId + ", " : "")
                + (label != null ? "label=" + label + ", " : "")
                + (userId != null ? "userId=" + userId + ", " : "")
                + "connected=" + connected + "]";
    }

さて、この器に値を入れるためのクラスとして、CloudbitAPIAccessorクラスを用意して、動作検証用のmain()メソッドも合わせて定義してしまいましょう。


public class CloudbitAPIAccessor {
    protected static final String API_ENTRY = "https://api-http.littlebitscloud.cc";

    public static void main(String[] args) {
        String deviceId = args[0];
        String accessToken = args[1];

        CloudbitAPIAccessor accessor = new CloudbitAPIAccessor();
        try {
            Cloudbit cloudbit = accessor.getCloudbit(deviceId, accessToken);
            System.out.println(cloudbit.toString());
        } catch (IOException e) {
            System.err.println(e.getLocalizedMessage());
        }
    }
}

API呼び出しの際にたびたび使用することになるであろうURLの固定部分はstatic変数API_ENTRYとしてくくりだしてあります。また、main()メソッド呼び出し時の引数として、引数1にはcloudBitのdeviceIdを、引数2にはaccessTokenを指定するようにします。これらは、Cloud Controlで確認することが可能です。

実際にcloudBitの情報を取得するためのメソッドとして、(すでにmain()メソッドから呼び出していますが)getCloudbit()メソッドを用意することにします。こちらも引数1にはcloudbitのdeviceIdを、引数2にはaccessTokenを指定するようにします。

    public Cloudbit getCloudbit(String deviceId, String accessToken) 
            throws IOException

getCloubit()メソッド内は、APIを呼び出す部分、呼び出し結果(エラーの有無)を確認する部分、そして、JSON形式で結果を受け取る部分と、受け取った結果をCloudbitオブジェクトに設定する部分の4つに分けることができます。

まず最初は、APIを呼び出す部分です。

        URL url = new URL(API_ENTRY + "/devices/" + deviceId);
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Authorization", "Bearer " + accessToken);
        urlConnection.setRequestProperty("Accept", "application/vnd.littlebits.v2+json");
        urlConnection.connect();

次に、呼び出し結果(エラーの有無)を確認する部分です。

        int responseCode = urlConnection.getResponseCode();
        if (responseCode != 200 && responseCode != 201) {
            String message = "(" + responseCode + "): " +
                    urlConnection.getResponseMessage();
            throw new IOException("getCloudbit" + message);
        }

次はJSON形式で返答を受け取ります。

        Cloudbit cloudbit = new Cloudbit();
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(urlConnection.getInputStream()));
        String line;
        StringBuffer body = new StringBuffer();
        while ((line = reader.readLine()) != null) {
            body.append(line);
        }

最後に、JSON形式で受け取った結果をCloudbitオブジェクトに設定する部分です。

        JSONObject json = new JSONObject(body.toString());
        cloudbit.setDeviceId(json.getString("id"));
        cloudbit.setLabel(json.getString("label"));
        try {
            cloudbit.setUserId(json.getString("user_id"));
        } catch (Exception e) {
            int userId = json.getInt("user_id");
            cloudbit.setUserId(Integer.toString(userId));
        }
        cloudbit.setConnected(json.getBoolean("is_connected"));

受け取ったJSON形式の結果を解析するために、ここではjson.orgで公開されているJava版の解析器を使ってみました。なお、前述の通り、user_idが(仕様上定められている文字列としてではなく)数値として通知されてきていることから、try { } catch { } を使った奇妙な実装になっています。

ここまでできたら、コマンドラインからCloudAPIAccessorクラスのmainメソッドを呼び出していただければ、引数に指定したdevice_idのcloudBitに関する情報が画面上に表示されるはずです。

Cloudbit [deviceId=XXXXXXXXXXXX, label=CLOUD_IN, userId=00000, connected=false]

ソースコードに関しては、github上でcloudbit-javaプロジェクトを構築しました。さらに今回使った内容に関しては、1-CloudBit_Infoブランチにて、動作・参照可能なソースコードを公開させて頂いております。

それでは続きはまたにしましょう!

  1. はじめに
  2. cloudBitの情報取得
  3. cloudBitからの情報受け取り口
  4. 受け取ったデータをDBに格納