このトピックでは、Link SDK for Android を使用して、HTTP/2 ストリーミングプロトコルで Alibaba Cloud IoT Platform にファイルをアップロードする方法について説明します。
概要
- SDK for Android は、ファイルの作成や既存ファイルの上書きなど、複数のアップロード方法をサポートしています。
- SDK for Android を使用すると、デバイスは指定されたサイズのファイルデータをアップロードし、そのサイズを超えるコンテンツを後続のアップロードでアップロードし続けることができます。 帯域幅の使用率を向上させるために、ネットワーク帯域幅に基づいてサイズ (
part_len) を設定できます。
このセクションでは、src/main/java/... /H2FileManagerActivity.java を使用して、SDK for Android を使用してファイルをアップロードする方法を説明します。
初期化の実行
IStreamSender は、HTTP/2 ストリーミングチャネルの API 操作クラスです。
LinkKitInitParams params = new LinkKitInitParams();
params.deviceInfo = deviceInfo; // デモを参照してください。
// params.propertyValues = propertyValues; // その他の初期化パラメーター。
// params.connectConfig = userData;
// H2 初期化パラメーター。
IoTH2Config ioTH2Config = new IoTH2Config();
ioTH2Config.clientId = "client-id";
// {pk} をデバイスが属するプロダクトの ProductKey に置き換えます。 デフォルトでは、このパラメーターを設定する必要はありません。
// ioTH2Config.endPoint = "https://{pk}.iot-as-http2.cn-shanghai.aliyuncs.com";
params.iotH2InitParams = ioTH2Config;
// SDK の初期化を実行します。
// SDK が初期化された後、次のメソッドを使用して IStreamSender インスタンスを取得できます。
IStreamSender client = LinkKit.getInstance().getH2StreamClient();
接続の作成
CompletableListener は、汎用非同期コールバックインターフェイスです。
// 作成された接続またはネットワークエラーを示す例外が返される場合があります。
// client パラメーターは、初期化中に取得された IStreamSender インスタンスを示します。
client = LinkKit.getInstance().getH2StreamClient();
client.connect(new CompletableListener<Object>() {
@Override
public void complete(Object o) {
// 接続が作成されます。
}
@Override
public void completeExceptionally(Throwable throwable) {
// 接続の作成に失敗しました。
}
});
ファイルのアップロード
再開不可のアップロード
アップロードできるファイルの種類の詳細については、「IANA メディアタイプ」をご参照ください。
final Http2Request request = new Http2Request();
// Object Storage Service (OSS) バケットに保存されているファイルの名前。 ファイル名検証ルールの正規表現は [a-zA-Z][a-zA-Z0-9_.] * です。
request.getHeaders().add("x-file-name", "fileName");
// 同じ名前のファイルを上書きするかどうかを指定します。 有効な値:0(上書きしない)および 1(上書きする)。 デフォルト値:0。ファイルが既に存在し、デフォルト値(0)が使用されている場合、ストリームの作成に失敗します。
request.getHeaders().add("x-file-overwrite", "1");
// アップロードするファイルのタイプ。 このパラメーターが設定されていない場合、OSS は自動的に値を割り当てます。
// request.getHeaders().add("x-file-content-type", "jpg");
String serviceName = "/c/iot/sys/thing/file/upload";
// パスをアップロードするファイルのパスに置き換えます。
String filePath = "/sdcard/demo.jpg";
client.uploadFile(serviceNme, request, filePath, new CompletableDataListener<Http2Response>() {
@Override
public void complete(Http2Response http2Response) {
// ファイルがアップロードされます。
}
@Override
public void completeExceptionally(Throwable throwable) {
// ファイルのアップロードに失敗しました。
}
@Override
public void callBack(String fileUploadID) {
// アップロードの ID。 再開可能なアップロードが必要な場合は、fileUploadID パラメーターを指定します。
// 複数のコールバックが存在する場合は、後で再開可能なアップロードを行うために、fileUploadID パラメーターの最新の値を保存します。
}
});
再開可能なアップロード
アップロードに失敗したファイルのアップロードを再開する必要がある場合は、fileUploadId パラメーターの最新の値を渡す必要があります。
final Http2Request request = new Http2Request();
// fileUploadId パラメーターは、最後に未完了のアップロードの ID を指定します。
request.getHeaders().add("x-file-upload-id", fileUploadId);
String serviceName = "/c/iot/sys/thing/file/upload";
// パスをアップロードするファイルのパスに置き換えます。
String filePath = "/sdcard/demo.jpg";
client.uploadFile(serviceNme, request, filePath, new CompletableDataListener<Http2Response>() {
@Override
public void complete(Http2Response http2Response) {
showToast(http2Response.toString() + "success");
}
@Override
public void completeExceptionally(Throwable throwable) {
showToast(throwable.toString() + "fail");
}
@Override
public void callBack(String fileUploadID) {
fileUploadId = fileUploadID;
}
});
切断
デバイスと IoT Platform 間のストリーム接続は、ファイルがアップロードされた後に切断されます。
// client パラメーターは、初期化中に取得された IStreamSender インスタンスを示します。
client.disconnect(new CompletableListener() {
@Override
public void complete(Object o) {
}
@Override
public void completeExceptionally(Throwable throwable) {
}
});