物聯(lián)網(wǎng)平臺(tái)支持設(shè)備通過(guò)MQTT協(xié)議方式,將文件上傳至用戶自己的OSS空間或阿里云物聯(lián)網(wǎng)平臺(tái)空間進(jìn)行儲(chǔ)存。本文介紹設(shè)備上傳文件流程相關(guān)的Topic和數(shù)據(jù)格式,包括設(shè)備請(qǐng)求上傳文件、設(shè)備上傳文件分片和設(shè)備取消上傳文件。

背景信息

設(shè)備端完成文件上傳能力開(kāi)發(fā)的具體操作,請(qǐng)參見(jiàn)文件上傳(MQTT)

若選擇將文件上傳至您自己的OSS空間,設(shè)備上傳文件后,您可以在OSS中訪問(wèn)文件。

重要 OSS Bucket必須為設(shè)備所屬用戶所有,Bucket地域必須與設(shè)備所屬地域相同。

若將文件上傳至阿里云物聯(lián)網(wǎng)平臺(tái)空間,設(shè)備上傳文件后,您可以在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)查看、下載、刪除文件。具體操作,請(qǐng)參見(jiàn)文件管理

設(shè)備請(qǐng)求上傳文件

  • 請(qǐng)求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/init
  • 響應(yīng)Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/init_reply

請(qǐng)求數(shù)據(jù)格式:

{
    "id":"123456",
    "params":{
        "fileName":"abc.bin",
        "fileSize":123455,
        "conflictStrategy":"overwrite",
        "ficMode":"crc64",
        "ficValue":"0205d7***",
        "initUid":"ab1***34",
        "extraParams":{
            "ossOwnerType":"device-user",
            "serviceId":"device1.bucket",
            "fileTag":{
                "tagKey1":"tagValu1",
                "tagKey2":"tagValue2"
            }
        }
    }
}
表 1. 請(qǐng)求參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
paramsObject請(qǐng)求業(yè)務(wù)參數(shù)。
fileNameString設(shè)備上傳文件的名稱。限制如下:
  • 支持?jǐn)?shù)字、英文字母、下劃線(_)和英文句點(diǎn)(.)。
  • 首字符僅支持?jǐn)?shù)字和英文字母。
  • 長(zhǎng)度不超過(guò)100字節(jié)。
fileSizeLong上傳文件大小,單位字節(jié)。單個(gè)文件大小不超過(guò)16 MB。

取值為-1時(shí),表示文件大小未知。文件上傳完成時(shí),需在上傳文件分片的消息中,指定參數(shù)isComplete,具體說(shuō)明,請(qǐng)參見(jiàn)設(shè)備上傳文件分片

conflictStrategyString物聯(lián)網(wǎng)平臺(tái)對(duì)設(shè)備上傳同名文件的處理策略。非必填參數(shù),默認(rèn)為overwrite

使用說(shuō)明:

  • 若物聯(lián)網(wǎng)平臺(tái)不存在同名文件,直接創(chuàng)建文件的上傳任務(wù)。
  • 若物聯(lián)網(wǎng)平臺(tái)已存在同名文件,則按照設(shè)置的策略,進(jìn)行如下處理:
    • overwrite:覆蓋模式。

      先刪除同名文件,再創(chuàng)建文件的上傳任務(wù)。

    • append:文件追加模式。
      • 若同名文件上傳未完成,設(shè)備端可根據(jù)物聯(lián)網(wǎng)平臺(tái)返回的文件信息,繼續(xù)上傳文件。
      • 若同名文件上傳已完成,創(chuàng)建文件上傳任務(wù)會(huì)失敗。設(shè)備端可修改文件名稱或通過(guò)覆蓋模式(overwrite)重新請(qǐng)求上傳文件。
    • reject:拒絕模式。

      物聯(lián)網(wǎng)平臺(tái)拒絕同名文件上傳的請(qǐng)求,并返回文件已存在的錯(cuò)誤碼。

    重要 從創(chuàng)建文件上傳任務(wù)成功開(kāi)始計(jì)時(shí),如果24小時(shí)內(nèi)設(shè)備端未完成上傳,物聯(lián)網(wǎng)平臺(tái)云端會(huì)自動(dòng)刪除該文件上傳任務(wù)。
ficModeString文件的完整性校驗(yàn)?zāi)J剑壳翱扇≈?span id="z68uejxpaoma" class="keyword option" data-tag="option" id="option-3jh-36b-39x">crc64。非必傳參數(shù)。
  • 若不傳入,在文件上傳完成后不校驗(yàn)文件完整性。
  • 若傳入,與ficValue同時(shí)傳入,根據(jù)校驗(yàn)?zāi)J胶托r?yàn)值校驗(yàn)文件完整性。
重要fileSize值為-1,不支持設(shè)置ficModeficValue
ficValueString文件的完整性校驗(yàn)值,是16位的Hex格式編碼的字符串。

非必傳參數(shù)。若傳入,與ficMode同時(shí)傳入。

initUidString自定義的設(shè)備請(qǐng)求上傳文件的任務(wù)唯一ID,同一上傳任務(wù)請(qǐng)求必須對(duì)應(yīng)相同的唯一ID。限制如下:
  • 支持?jǐn)?shù)字、英文字母、短劃線(-)、下劃線(_)和英文句點(diǎn)(.)。
  • 首字符僅支持?jǐn)?shù)字和英文字母。
  • 長(zhǎng)度不超過(guò)16個(gè)字符。

該參數(shù)可選:

  • 傳入:用于設(shè)備請(qǐng)求上傳文件的消息,在重發(fā)場(chǎng)景下的冪等性處理。您需確保同一上傳文件任務(wù)的重試消息使用相同的initUid

    在同一設(shè)備下,該參數(shù)相同的兩個(gè)上傳請(qǐng)求消息,會(huì)被物聯(lián)網(wǎng)平臺(tái)云端識(shí)別為消息重試,返回相同的文件請(qǐng)求上傳的響應(yīng)消息。

    在同一設(shè)備下,若重試的時(shí)間間隔超過(guò)24小時(shí),則重試的請(qǐng)求會(huì)識(shí)別為新的文件上傳任務(wù)請(qǐng)求。此時(shí)若請(qǐng)求上傳文件成功,則返回新的uploadId

  • 不傳入:物聯(lián)網(wǎng)平臺(tái)的云端識(shí)別當(dāng)前請(qǐng)求為新的文件上傳請(qǐng)求。
extraParamsObject設(shè)備上傳文件至OSS存儲(chǔ)空間的配置參數(shù)。非必須參數(shù)。

若未指定該參數(shù),表示設(shè)備將文件上傳至物聯(lián)網(wǎng)平臺(tái)的存儲(chǔ)空間中。

ossOwnerTypeString設(shè)備上傳文件的目標(biāo)OSS所有者類型。可取值:
  • iot-platform:表示上傳到阿里云物聯(lián)網(wǎng)平臺(tái)的OSS存儲(chǔ)空間中。

    上傳的文件會(huì)在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)的設(shè)備文件列表中展示,且可以通過(guò)相關(guān)的云端API管理。詳細(xì)內(nèi)容,請(qǐng)參見(jiàn)文件管理

  • device-user:表示上傳到設(shè)備所屬用戶自己的OSS存儲(chǔ)空間中。

    上傳的文件不會(huì)在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)的設(shè)備文件列表中展示,也不能通過(guò)相關(guān)的云端API管理。

    文件上傳位置為:{ossbucket}/aliyun-iot-device-file/${instanceId}/${productKey}/${serviceId}/${deviceName}/${fileName}

    • {ossbucket}:在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)已配置的目標(biāo)Bucket。
    • {instanceId}:設(shè)備所屬實(shí)例的ID。
    • {productKey}:設(shè)備所屬產(chǎn)品的ProductKey。
    • {serviceId}:在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)已配置的業(yè)務(wù)ID。
    • {deviceName}:設(shè)備名稱。
    • {fileName}:設(shè)備文件名稱。
serviceIdString文件上傳相關(guān)的業(yè)務(wù)ID。該ID需要在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)預(yù)先定義。具體操作,請(qǐng)參見(jiàn)配置設(shè)備文件上傳至Bucket

ossOwnerTypedevice-user時(shí),serviceId有效。

fileTagObject文件保存到OSS存儲(chǔ)空間攜帶的標(biāo)簽,最多包含5個(gè)。標(biāo)簽定義規(guī)則,請(qǐng)參見(jiàn)對(duì)象標(biāo)簽

標(biāo)簽Key不能以2個(gè)下劃線(_)開(kāi)頭。

ossOwnerTypedevice-user時(shí),fileTag有效。

響應(yīng)數(shù)據(jù)格式:

{
    "id": "123456",
    "code": 200,
    "message": "this is error msg when code is not 200",
    "data":{
        "fileName": "abc.bin",
        "uploadId": "03d9151e-6***",
        "offset": 123123
    }
}
表 2. 響應(yīng)參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
codeInteger結(jié)果碼。返回200表示成功,返回其他狀態(tài)碼,表示失敗,具體請(qǐng)參見(jiàn)設(shè)備端接收的錯(cuò)誤碼
messageString請(qǐng)求失敗時(shí),返回的錯(cuò)誤信息。
dataObject返回設(shè)備端的數(shù)據(jù)。
fileNameString設(shè)備上傳文件的名稱。
uploadIdString本次上傳文件任務(wù)的標(biāo)識(shí)ID。后續(xù)上傳文件分片時(shí),需要傳遞該文件標(biāo)識(shí)ID。
offsetLong僅當(dāng)請(qǐng)求參數(shù)conflictStrategyappend,且物聯(lián)網(wǎng)平臺(tái)云端存在未完成上傳的文件時(shí),返回的已上傳文件的大小,單位為字節(jié)。

設(shè)備上傳文件分片

  • 請(qǐng)求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/send
  • 響應(yīng)Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/send_reply

請(qǐng)求數(shù)據(jù)格式:

  • 結(jié)構(gòu)如下圖:結(jié)構(gòu)
    結(jié)構(gòu)項(xiàng)說(shuō)明
    Header Length表示請(qǐng)求Header中JSON字符串對(duì)應(yīng)的字節(jié)數(shù)組長(zhǎng)度,必須占位2個(gè)字節(jié),高位字節(jié)在前,低位字節(jié)在后。

    例如,Header的JSON字符串使用UTF-8編碼轉(zhuǎn)碼成字節(jié)數(shù)組的長(zhǎng)度為十進(jìn)制的87,對(duì)應(yīng)十六進(jìn)制57,則高位字節(jié)為0x00,低位字節(jié)為0x57。

    Header String Bytes表示請(qǐng)求Header中JSON字符串對(duì)應(yīng)的字節(jié)數(shù)組,編碼格式為UTF-8。具體內(nèi)容,請(qǐng)參見(jiàn)下文的“Header的JSON數(shù)據(jù)格式”。
    File Block Bytes表示當(dāng)前文件分片的字節(jié)數(shù)組,字節(jié)順序按照相對(duì)于文件頭的偏移量從小至大排列。
    CRC16/IBM表示文件分片的校驗(yàn)值,僅支持CRC16/IBM,占位2個(gè)字節(jié),低位字節(jié)在前,高位字節(jié)在后。

    例如,文件分片的校驗(yàn)值為0x0809,則低位字節(jié)為0x09,高位字節(jié)為0x08。

  • Header的JSON數(shù)據(jù)格式:
    {
        "id":"123456",
        "params":{
            "uploadId":"03d9151e-6***",
            "offset":34344,
            "bSize":123455,
            "isComplete":true
        }
    }
表 3. 請(qǐng)求參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
paramsObject請(qǐng)求業(yè)務(wù)參數(shù)。
uploadIdString設(shè)備請(qǐng)求上傳文件時(shí)返回的文件上傳任務(wù)標(biāo)識(shí)ID。
offsetLong已上傳文件分片的總大小,單位為字節(jié)。
bSizeLong當(dāng)前上傳文件分片的大小,單位為字節(jié)。
  • 非最后一個(gè)分片時(shí),分片大小范圍為256 B~131072 B。
  • 最后一個(gè)文件分片時(shí),若上傳的文件大小已知,則分片大小范圍為1 B~131072 B;若上傳的文件大小未知,則分片大小范圍為0 B~131072 B。
isCompleteBoolean僅當(dāng)設(shè)備請(qǐng)求上傳文件中fileSize為-1,即文件大小未知時(shí),該參數(shù)有效,表示當(dāng)前分片是否是文件的最后一個(gè)分片。
  • true:是。此時(shí),物聯(lián)網(wǎng)平臺(tái)的云端會(huì)校驗(yàn)已上傳文件大小是否超過(guò)16 MB:
    • 未超過(guò):若文件大小大于0,則文件上傳成功。若文件大小為0,則返回文件不能為空的錯(cuò)誤信息且刪除文件上傳任務(wù)。
    • 超過(guò):返回文件大小超過(guò)16 MB的錯(cuò)誤碼,并刪除已上傳的文件。詳細(xì)說(shuō)明,請(qǐng)參見(jiàn)設(shè)備上傳文件相關(guān)錯(cuò)誤碼
  • false:否。表示不是最后一個(gè)文件分片,需繼續(xù)上傳文件。

響應(yīng)數(shù)據(jù)格式:

說(shuō)明 未知大小的文件上傳過(guò)程中,上傳文件大小若超過(guò)16 MB,則返回文件大小超過(guò)16 MB的錯(cuò)誤碼78117,且物聯(lián)網(wǎng)平臺(tái)云端會(huì)自動(dòng)取消文件上傳任務(wù),并刪除已上傳的文件。
{
    "id":"123456",
    "code":200,
    "message":"this is error msg when code is not 200",
    "data":{
        "uploadId":"03d9151e-6***",
        "offset":34344,
        "bSize":123455,
        "complete":true,
        "ficMode":"crc64",
        "ficValueClient":"0205d7***",
        "ficValueServer":"0205d7***"
    }
}
表 4. 響應(yīng)參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
codeInteger結(jié)果碼。返回200表示成功,返回其他狀態(tài)碼,表示失敗,具體請(qǐng)參見(jiàn)設(shè)備端接收的錯(cuò)誤碼
messageString上傳失敗時(shí),返回的錯(cuò)誤信息。
dataObject返回設(shè)備端的數(shù)據(jù)。
uploadIdString本次上傳文件任務(wù)的標(biāo)識(shí)ID。后續(xù)上傳文件分片時(shí),需要傳遞該文件標(biāo)識(shí)ID。
offsetLong已上傳文件分片的總大小,單位為字節(jié)。
bSizeLong當(dāng)前上傳文件分片的大小,單位為字節(jié)。
  • 非最后一個(gè)分片時(shí),分片大小范圍為256 B~131072 B。
  • 最后一個(gè)文件分片時(shí),若上傳的文件大小已知,則分片大小范圍為1 B~131072 B;若上傳的文件大小未知,則分片大小范圍為0 B~131072 B。
completeBoolean當(dāng)上傳了最后一個(gè)分片數(shù)據(jù)后,文件上傳完成,返回該參數(shù),值為true
  • 若設(shè)備請(qǐng)求上傳文件的請(qǐng)求消息中fileSize值大于0,即文件大小已知時(shí),若已上傳的文件大小與設(shè)備請(qǐng)求上傳文件時(shí)的文件大小相同,文件被識(shí)別為上傳完成。
  • 若設(shè)備請(qǐng)求上傳的請(qǐng)求消息中fileSize值為-1,即文件大小未知時(shí),若文件分片上傳請(qǐng)求中isComplete存在且值為true,文件被識(shí)別為上傳完成。
ficModeString文件的完整性校驗(yàn)?zāi)J健H粽?qǐng)求上傳文件時(shí)傳入了該參數(shù),對(duì)應(yīng)的值僅支持為crc64
ficValueClientString文件上傳完成,返回設(shè)備請(qǐng)求上傳文件時(shí)的ficValue值。
ficValueServerString文件上傳完成,返回物聯(lián)網(wǎng)平臺(tái)云端計(jì)算的文件完整性校驗(yàn)值。該值與ficValueClient值相同,表示文件上傳完整。

設(shè)備取消上傳文件

  • 請(qǐng)求Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/cancel
  • 響應(yīng)Topic:/sys/${productKey}/${deviceName}/thing/file/upload/mqtt/cancel_reply

請(qǐng)求數(shù)據(jù)格式:

{
    "id":"123456",
    "params":{
        "uploadId":"03d9151e-6***"
    }
}
表 5. 請(qǐng)求參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
paramsObject請(qǐng)求業(yè)務(wù)參數(shù)。
uploadIdString設(shè)備請(qǐng)求上傳文件時(shí)返回的文件上傳任務(wù)標(biāo)識(shí)ID。

響應(yīng)數(shù)據(jù)格式:

{
    "id":"123456",
    "code":200,
    "message":"uploading task for upload-id xxxx does not exist.",
    "data":{
        "uploadId":"03d9151e-6***"
    }
}
表 6. 響應(yīng)參數(shù)說(shuō)明
參數(shù)類型說(shuō)明
idString消息ID號(hào)。String類型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
codeInteger結(jié)果碼。返回200表示成功,返回其他狀態(tài)碼,表示失敗,具體請(qǐng)參見(jiàn)設(shè)備端接收的錯(cuò)誤碼
messageString請(qǐng)求失敗時(shí),返回的錯(cuò)誤信息。
dataObject返回設(shè)備端的數(shù)據(jù)。
uploadIdString取消的文件上傳任務(wù)標(biāo)識(shí)ID。

相關(guān)文檔

設(shè)備端接收的錯(cuò)誤碼信息,請(qǐng)參見(jiàn)設(shè)備上傳文件相關(guān)錯(cuò)誤碼