Object Body のダウンロード

Object Body のダウンロードは、Object の取得とは別の API で行います。Object Body の機能概要については、Object Body のアクセス をご覧ください。

Thing SDK Embedded は、以下の 2 種類の Object Body ダウンロード方法を提供しています。

1 回の転送サイズを大きくする場合、初期化の際に指定した バッファーサイズ にご注意ください。1 回の API 呼び出しでの転送サイズと、HTTP ヘッダー等のリクエストに必要なサイズの合計は、初期化で指定したバッファーサイズ以下である必要があります。

分割ダウンロード

Object Body をダウンロードする例を以下に挙げます。

/* Set object body parameters. */
#define OBJECT_ID "STATUS_TEMPERATURE"
#define LENGTH_CHUNK 4000

int i;
unsigned int position, actualLength, totalLength;

/* Set bucket parameters. */
kii_bucket_t bucket;
memset(&bucket, 0x00, sizeof(kii_bucket_t));
bucket.scope = KII_SCOPE_THING;
bucket.bucket_name = "myBucket";
bucket.scope_id = "VENDOR_THING_ID:rBnvSPOXBDF9r29GJeGS";

position = 0;
do {
  /* Download the object body in chunks. */
  ret = kii_object_download_body(&kii, &bucket, OBJECT_ID, position, LENGTH_CHUNK, &actualLength, &totalLength);
  if (ret != 0) {
    /* Handle the error. */
    return;
  }

  for (i = 0; i < (int)actualLength; i++) {
    printf("%02x, ", kii.kii_core.response_body[i]);
  }
  printf("\n");
  position += actualLength;
} while (position < totalLength);

分割ダウンロードでは、kii_object_download_body 関数を繰り返して呼ぶことによって Object Body をダウンロードします。

引数ではダウンロード対象の Object を kii_bucket_t 構造体と Object の ID で識別します。その他の positionLENGTH_CHUNK&actualLength&totalLength は以下の意味を持ちます。

  • position

    Object Body 全体に対するダウンロード開始位置をバイト単位で指定します。このサンプルコードでは初め 0 で初期化しておき、1 回のダウンロードごとに、実際に転送したサイズ actualLength を積算することで Object Body 全体に対する次のダウンロード開始位置を保持しています。

  • LENGTH_CHUNK

    1 回の API 呼び出しでダウンロードする最大サイズをバイト単位で指定します。

  • &actualLength

    API を呼び出した結果、実際の取得サイズを返す領域へのポインタを指定します。取得できたサイズはバイト単位で返されます。

  • &totalLength

    Object Body の全体サイズを返す領域へのポインタを指定します。サイズはバイト単位で返されます。

取得できたデータは、kii.kii_core.response_body に格納されます。

サンプルコードでは、do~while で分割ダウンロードを実現します。kii_object_download_body 関数を呼び出し、転送済みのサイズ position が、Object Body の全体サイズ totalLength より小さい場合に、ダウンロードを繰り返します。分割単位ごとのダウンロード後、kii.kii_core.response_body に取得したデータサイズまでを printf によってダンプしています。

一括ダウンロード

分割を行わず、1 回の API 呼び出しですべての Object Body をダウンロードすることも可能です(ただし、特にサイズの大きなファイルを Kii Cloud よりダウンロードするケースなどにおいては分割ダウンロードを利用することを推奨します)。

一括ダウンロードを行う例を以下に挙げます。

/* Set object body parameters. */
#define OBJECT_ID "STATUS_TEMPERATURE"

int i;
unsigned int dataLength;

/* Set bucket parameters. */
kii_bucket_t bucket;
memset(&bucket, 0x00, sizeof(kii_bucket_t));
bucket.scope = KII_SCOPE_THING;
bucket.bucket_name = "myBucket";
bucket.scope_id = "VENDOR_THING_ID:rBnvSPOXBDF9r29GJeGS";

/* Download the object body. */
ret = kii_object_download_body_at_once(&kii, &bucket, OBJECT_ID, &dataLength);
if (ret != 0) {
  /* Handle the error. */
  return;
}

for (i = 0; i < (int)dataLength; i++) {
  printf("%02x, ", kii.kii_core.response_body[i]);
}

kii_object_download_body_at_once 関数を使用すると、Object Body の全体を一度の API 呼び出しでダウンロードします。

ダウンロード対象の Object は、kii_bucket_t 構造体と Object の ID で指定します。Bucket の指定方法は、Object の作成 をご覧ください。

第 4 引数には、実際にダウンロードしたサイズを返す領域へのポインタを指定します。データの本体は、kii.kii_core.response_body に格納されます。

サンプルコードでは、ダウンロードしたデータを printf によってダンプしています。