调用该接口生成固件文件上传OSS的URL及详细信息。

使用说明

该接口与其他接口结合使用完成固件创建。创建固件的步骤:

1. 调用本接口生成固件文件上传到对象存储(OSS)的信息。

本接口的返回参数包含:

  • 调用OSS PostObject上传固件文件的请求参数:KeyOSSAccessKeyIdSignature和Policy
  • 调用CreateOTAFirmware创建固件的请求参数FirmwareUrl

2. 请在本接口返回结果后的1分钟之内,使用OSS SDK调用PostObject接口上传固件文件。

说明 本接口返回的参数信息有效期为1分钟,请在1分钟内上传固件。上传的固件文件大小不能超过1,000 MB。

3. 固件上传完成后,请在60分钟内,调用物联网平台API CreateOTAFirmware接口创建固件。

如果上传了固件,但未调用CreateOTAFirmware接口创建固件,上传的文件将被系统定期自动清理。

限制说明

单阿里云账号调用该接口的每秒请求数(QPS)最大限制为10。

说明 子账号共享主账号配额。

调试

您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。

请求参数

名称 类型 是否必选 示例值 描述
Action String GenerateOTAUploadURL

系统规定参数。取值:GenerateOTAUploadURL。

IotInstanceId String iot_instc_pu****_c*-v64********

公共实例不传此参数;您购买的实例需传入实例ID。

调用API时,除了本文介绍的该API的特有请求参数,还需传入公共请求参数。公共请求参数说明,请参见公共参数文档

返回数据

名称 类型 示例值 描述
Code String iot.system.SystemException

调用失败时,返回的错误码。错误码详情,请参见错误码

Data Struct

调用成功时,返回的固件文件上传信息。详情见以下参数信息。

FirmwareUrl String https://iotx-ota.oss-cn-shanghai.aliyuncs.com/ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin

固件文件的URL,即固件文件在对象存储(OSS)上的存储地址。

固件文件上传成功后,使用此参数调用CreateOTAFirmware接口创建固件。

Host String https://iotx-ota.oss-cn-shanghai.aliyuncs.com

OSS的接入域名。

Key String ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin

调用OSS API PostObject上传对象(即固件文件)的名称,包含OSS对象的完整路径。

OSSAccessKeyId String cS8uRRy54Rsz****

OSS Bucket拥有者的AccessKeyId。

该OSS Bucket将存储固件文件。

Policy String eyJleHBpcmF****

OSS通过该参数验证请求表单域的合法性。

Signature String v6lViO4FBvfquajQjg20K5hK****

根据AccessKeySecretPolicy计算出的签名信息。调用OSS API时,OSS验证该签名信息,从而确认Post请求的合法性。

ErrorMessage String 系统异常

调用失败时,返回的出错信息。

RequestId String 74C2BB8D-1D6F-41F5-AE68-6B2310883F63

阿里云为该请求生成的唯一标识符。

Success Boolean true

是否调用成功。true表示调用成功,false表示调用失败。

示例

请求示例

https://iot.cn-shanghai.aliyuncs.com/?Action=GenerateOTAUploadURL
&<公共请求参数>

正常返回示例

XML 格式

<GenerateOTAUploadURLResponse>
    <Data>
        <Key>ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin</Key>
        <Host>https://iotx-ota.oss-cn-shanghai.aliyuncs.com</Host>
        <Policy>eyJleHBpcmF****</Policy>
        <OSSAccessKeyId>cS8uRRy54Rsz****</OSSAccessKeyId>
        <Signature>PKmRTy40QxqIUUWy325SCT/****</Signature>
        <FirmwareUrl>https://iotx-ota.oss-cn-shanghai.aliyuncs.com/ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin</FirmwareUrl>
    </Data>
    <RequestId>B6E77674-09C4-4647-BF85-59CB72A72E4B</RequestId>
    <Success>true</Success>
</GenerateOTAUploadURLResponse>

JSON 格式

{
    "GenerateOTAUploadURLResponse": {
        "Data": {
            "Key": "ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin",
            "Host": "https://iotx-ota.oss-cn-shanghai.aliyuncs.com",
            "Policy": "eyJleHBpcmF****",
            "OSSAccessKeyId": "cS8uRRy54Rsz****",
            "Signature": "PKmRTy40QxqIUUWy325SCT/****",
            "FirmwareUrl": "https://iotx-ota.oss-cn-shanghai.aliyuncs.com/ota/65dfcda0473be29836dfde585472****/ck2nfzljo00023g7kysg0****.bin"
        },
        "RequestId": "B6E77674-09C4-4647-BF85-59CB72A72E4B",
        "Success": true
    }
}

返回参数的用途

调用OSS PostObject接口时,使用本接口的返回参数值作为请求参数值,将您编辑好的固件文件上传到对象存储(OSS)。

以下是向对象存储OSS上传文件的Java代码示例。

  • 在pom.xml中添加以下依赖。
    
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.3</version>
    </dependency>
    
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpmime</artifactId>
      <version>4.5.10</version>
    </dependency>
    
  • 上传固件文件的代码如下。

public static boolean postObject(String key,
                                  String host,
                                  String policy,
                                  String ossAccessKeyId,
                                  String signature,
                                  String data) throws IOException {
  CloseableHttpClient httpClient = HttpClients.createDefault();
  HttpPost uploadFile = new HttpPost(host);

  MultipartEntityBuilder builder = MultipartEntityBuilder.create();
  builder.addTextBody("key", key, ContentType.TEXT_PLAIN);
  builder.addTextBody("policy", policy, ContentType.TEXT_PLAIN);
  builder.addTextBody("OSSAccessKeyId", ossAccessKeyId, ContentType.TEXT_PLAIN);
  builder.addTextBody("signature", signature, ContentType.TEXT_PLAIN);
  builder.addTextBody("success_action_status", "200", ContentType.TEXT_PLAIN);
  builder.addBinaryBody("file", data.getBytes());

  HttpEntity multipart = builder.build();
  uploadFile.setEntity(multipart);
  CloseableHttpResponse response = httpClient.execute(uploadFile);

  if (response.getStatusLine().getStatusCode() == 200) {
    return true;
  }

  return false;
}