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



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

[APIドキュメント](http://developer.littlebitscloud.cc)にある実行例を見ると、エンドポイント /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クラスを定義することにします。

```Java
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()メソッドも自動生成させておきましょう。

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

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

```Java

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](http://control.littlebitscloud.cc)で確認することが可能です。

![Cloud Control](http://img.f.hatena.ne.jp/images/fotolife/m/mfunaki/20150620/20150620002253.png)

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

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

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

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

```Java
		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();
```

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

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

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

```Java
		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オブジェクトに設定する部分です。

```Java
		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版の解析器](http://www.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プロジェクト](https://github.com/mfunaki/cloudbit-java)を構築しました。さらに今回使った内容に関しては、[1-CloudBit_Infoブランチ](https://github.com/mfunaki/cloudbit-java/tree/1-CloudBit_Info)にて、動作・参照可能なソースコードを公開させて頂いております。

それでは続きは[また](http://qiita.com/mfunaki/items/6b5b5f70dd8c87f43a88)にしましょう！

0. [はじめに](http://qiita.com/mfunaki/items/cc3f6210bd0f72d34e54)
1. [cloudBitの情報取得](http://qiita.com/mfunaki/items/a11c32456cc3c1066fd9)
2. [cloudBitからの情報受け取り口](http://qiita.com/mfunaki/items/6b5b5f70dd8c87f43a88)
3. [受け取ったデータをDBに格納](http://qiita.com/mfunaki/items/f9ede4f2fdcf25b5ed25)