Over-the-Air (OTA) 技術は、ワイヤレスネットワーク経由でデバイスのファームウェア、ソフトウェア、またはドライバーを更新して、機能を追加し、脆弱性を修正し、パフォーマンスを最適化します。このトピックでは、IoT Platform に接続されているデバイスの OTA アップデートプロセスについて説明します。
制限
OTA を使用するデバイスは、MQTT 経由で IoT Platform に接続する必要があります。デバイスは、MQTT または HTTPS 経由で更新パッケージをダウンロードできます。
-
各 Alibaba Cloud アカウントは、最大 500 個の更新パッケージをサポートします。アカウント配下のすべての RAM ユーザーがこのクォータを共有します。
-
更新パッケージの数、サイズ、フォーマット、およびリージョンには、以下の制限が適用されます。
-
HTTPS ダウンロード:1 つの更新には、1 つ以上のファイルを含めることができます。単一ファイルのサイズは最大 1,000 MB です。サポートされているフォーマットは、
.bin、.dav、.tar、.gz、.zip、.gzip、.apk、.tar.gz、.tar.xz、および.packのみです。 -
MQTT ダウンロード:最大 16 MB までの単一ファイルにのみ対応しており、China (Shanghai)、China (Beijing)、および China (Shenzhen) リージョンでのみ利用できます。MQTT ファイルダウンロードを開発するには、C Link SDK を使用してください (サンプルコード)。
-
仕組み
-
分散デバイスは、宛先インスタンスに配布された後、Over-the-Air (OTA) で更新できます。
前提条件
-
デバイスが IoT Platform に接続されている必要があります。Link SDK ユーザー:C Link SDK を取得し、デバイス接続ガイドをご参照ください。AliOS Things チップのユーザー:AliOS Things のドキュメントをご参照ください。
OTA アップデート手順
このトピックの例では C Link SDK を使用しています。その他の言語の例については、「概要」をご参照ください。
ステップ1:バージョン番号の報告
-
OTA 機能を設定します。
-
デバイスを IoT Platform に接続する。 IoT Platform コンソールで、対象のインスタンスを選択し、 の順に選択します。 デバイスのステータスが [オンライン] であることを確認します。
-
-
現在のバージョン番号を報告します。デバイスは、最初の更新の前にバージョンを報告する必要があります。起動時に 1 回だけバージョンを報告し、定期的に報告しないでください。1 回の呼び出しにつき、1 つのモジュールバージョンのみ報告できます。トピックとメッセージフォーマット:本トピック末尾の「メッセージフォーマット」を参照してください。
ステップ2:更新パッケージ情報のプッシュ
-
更新パッケージの追加:製品の OTA モジュールと更新パッケージを追加します。
-
モジュール:同じ製品のデバイス向けの、ユーザー定義の更新可能なモジュール (ファームウェア、ソフトウェア、ドライバーなど) です。
-
フルパッケージ:完全な更新ファイル。1 つ以上のパッケージを追加できます。複数のサンプルパッケージの追加には C Link SDK が必要です。フル更新の前にデバイスが OTA モジュールバージョンを報告する必要はありませんが、バージョンを報告しない場合、一括更新で特定のバージョンをターゲットにすることはできません。一括更新ジョブの作成。
-
差分パッケージ:現在のバージョンとターゲットバージョンの差分のみが含まれます。デバイスは、更新前にローカルで差分復元を実行してフルパッケージを再構築します。差分更新により、OTA アップデートクォータの消費とダウンロードトラフィックが削減されます。デバイスは、差分更新の前に OTA モジュールバージョンを報告する必要があります。
-
AliOS Things チップの場合、Alibaba Cloud が差分パッケージ生成と差分復元アルゴリズムを提供します。OTA Diff Tools ユーザーガイド。
-
その他のデバイスの場合、差分パッケージの生成と差分復元アルゴリズムの開発をご自身で行う必要があります。
-
-
-
オプション:アップデートパッケージの検証:パッケージを追加する際に [アップデートパッケージの検証] を [はい] に設定した場合、一括デプロイの前に、選択したデバイスでテストする必要があります。パッケージは、テストデバイスのアップデートが成功した後にのみ利用可能になります。
OTA アップデートを続行する前に、アプリケーションによる確認を要求できます。
-
アプリケーションをご自身で開発してください。プラットフォームはデバイスに更新メッセージをプッシュしません。アプリケーションが更新メッセージをクエリする必要があります。
-
アプリケーションは ListOTAUnfinishedTaskByDevice を呼び出して、未完了のデバイス更新ジョブをクエリします。
-
アプリケーションは ConfirmOTATask を呼び出して更新ジョブを確認します。プラットフォームは、確認後にのみデバイスに更新メッセージをプッシュします。
-
-
バッチ更新ジョブを作成する:IoT プラットフォームは、更新情報 (パッケージ URL、バージョン、サイズ) をデバイスにバッチで送信します。デバイスのステータスは [更新待ち] または [確認待ち] に変わり、デバイスが進捗を報告すると [更新中] に変わります。
ステップ3:更新パッケージのダウンロード
-
更新パッケージ情報の取得。オフラインのデバイスは更新メッセージを受信できません。デバイスがオンラインになると、IoT Platform は保留中の更新を確認し、必要に応じてメッセージをプッシュします。
-
IoT Platform が更新パッケージ情報をプッシュします。デバイスは次のトピックをサブスクライブします:
/ota/device/upgrade/${YourProductKey}/${YourDeviceName}。デバイスは、次の2つのシナリオでこのトピックの更新情報を受信します。-
ジョブ作成時にデバイスがオンラインの場合:IoT Platform は更新情報を即座にプッシュします。
-
ジョブ作成時にデバイスがオフラインの場合:IoT Platform は、デバイスがオンラインになった時点で更新情報をプッシュします。
-
-
デバイスが更新パッケージ情報をプルします。デバイスがトピックにリクエストをパブリッシュすると、IoT Platform は応答トピックで更新パッケージ情報を返します。トピックとメッセージフォーマット:本トピック末尾の「メッセージフォーマット」を参照してください。
-
HTTPS および MQTT ダウンロードのメッセージフォーマット:本トピック末尾の「メッセージフォーマット」を参照してください。
-
-
デバイスは、HTTPS または MQTT プロトコルを使用して更新パッケージをダウンロードします。
-
更新の進捗の報告。トピックとメッセージフォーマット:本トピック末尾の「メッセージフォーマット」を参照してください。
重要デバイスが 3 秒よりも頻繁に進捗を報告する場合、コンソールの[バッチ詳細]タブに一部の進捗エントリが表示されない場合があります。
-
新しいバージョン番号を報告します。更新後すぐにデバイスを再起動してください。オンラインになってから 2 秒以内に新しいバージョンを報告してください。
重要IoT プラットフォームは、報告されたバージョンがターゲットバージョンと一致した場合にのみ、更新が成功したとみなします。報告された進捗が 100% に達しても、[デバイス更新のタイムアウト] 期間が満了する前に新しいバージョン番号が報告されない場合、更新は失敗します。
-
トピック:
/ota/device/inform/${YourProductKey}/${YourDeviceName} -
メッセージフォーマット
{ "id": 1, "params": { "version": "2.0.0" } }
-
ステップ4:更新結果の表示
-
更新ステータスの表示:対象デバイスの更新ステータス、更新パッケージ情報などを表示します。
-
更新パッケージバージョンと成功率の表示:更新後のバージョン分布と成功率の統計を表示します。OTA アップデート失敗の原因を分析して、成功率を向上させます。
関連ドキュメント
-
失敗した OTA アップデートのトラブルシューティング:デバイスの OTA アップデートが失敗した場合のトラブルシューティング方法
-
IoT Platform ログをクエリして、IoT Platform、デバイス、アプリケーション間の通信記録を表示します。
-
デバイス側のエラーコード:デバイスのエラーコード
-
デバイス更新情報のサーバーへの転送:AMQP を使用してサーバー側サブスクリプションを設定する。転送後の OTA トピックのデータ形式:データ形式。
メッセージフォーマット
バージョン番号の報告
-
トピック:
/ota/device/inform/${YourProductKey}/${YourDeviceName} -
メッセージフォーマット
{ "id": 1, "params": { "version": "1.0.0", "module": "mcu" // ファームウェアモジュール。デフォルトモジュールの場合は空文字列 "" を指定します。 } }パラメーター
タイプ
説明
id
文字列 / 長整数
メッセージ ID。文字列または長整数を指定できます。値の範囲:0~4294967295。デバイスごとに一意である必要があります。
version
文字列
OTA モジュールのバージョン。
module
文字列
OTA モジュール名。デフォルトモジュールのバージョンを報告する場合は、このパラメーターを空のままにします。デフォルトモジュールは、デバイスファームウェア全体を表します。
更新パッケージの能動的なプル
-
デバイスは、トピック
/sys/{productKey}/{deviceName}/thing/ota/firmware/getにメッセージをパブリッシュします。-
メッセージフォーマット
{ "id": "123", "version": "1.0", "params": { "module": "MCU" }, "method": "thing.ota.firmware.get" } -
パラメーターの説明
パラメーター
タイプ
説明
id
文字列
メッセージ ID。値は 0~4294967295 の数値を含む文字列であり、現在のデバイスで一意である必要があります。
version
文字列
プロトコルバージョン。値は 1.0 に固定されています。
params
オブジェクト
リクエストパラメーター。
module
文字列
アップデートパッケージが属するモジュールの名前。このパラメーターを指定しない場合、デフォルトモジュールのアップデートパッケージ情報がリクエストされます。
method
文字列
リクエストメソッド。値は thing.ota.firmware.get です。
-
-
IoT Platform がリクエストを受信すると、レスポンストピック
/sys/{productKey}/{deviceName}/thing/ota/firmware/get_replyでアップデートパッケージ情報をデバイスに返します。
HTTPS 経由のダウンロード
単一ファイル パッケージのダウンロード
{
"id": "123",
"code": 200,
"data": {
"size": 93796291,
"sign": "f8d85b250d4d787a9f483d89a974***",
"version": "10.0.1.9.20171112.1432",
"isDiff": 1,
"url": "https://the_firmware_url",
"signMethod": "MD5",
"md5": "f8d85b250d4d787a9f48***",
"module": "MCU",
"extData":{
"key1":"value1",
"key2":"value2",
"_package_udi":"{\"ota_notice\":\"基盤となるカメラドライバーを更新して、ビデオ画像がぼやける問題を解決します。\"}"
}
}
}
マルチファイルパッケージのダウンロード
{
"code": "1000",
"data": {
"version": "2.0.0",
"isDiff": 1,
"signMethod": "MD5",
"files":[
{
"fileSize":432944,
"fileName":"file1-name",
"fileUrl":"https://***/nop***.tar.gz?Expires=1502955804&OSSAccessKeyId=***&Signature=***XJEH0qAKU%3D&security-token=CAISuQJ***",
"fileMd5":"93230c3bde425a9d***",
"fileSign":"93230c3bde425a9d****"
},
{
"fileSize":432945,
"fileName":"file2-name",
"fileUrl":"https://***/no***.tar.gz?Expires=1502955804&OSSAccessKeyId=***&Signature=***qAKU%3D&security-token=***q6Ft5B2y***",
"fileMd5":"93230c3bde425a92***",
"fileSign":"93230c3bde425a92****"
}
],
"module": "MCU",
"extData":{
"key1":"value1",
"key2":"value2",
"_package_udi":"{\"ota_notice\":\"基になるカメラドライバーを更新し、映像がぼやける問題を解決します。\"}"
}
},
"id": 1626969597470,
"message": "success"
}
|
パラメーター |
タイプ |
説明 |
|
id |
Long |
メッセージ ID です。ID は現在のデバイスで一意である必要があります。 |
|
message |
文字列 |
結果情報です。 |
|
code |
文字列 |
ステータスコードです。 |
|
version |
文字列 |
デバイスのアップデートパッケージのバージョンです。 |
|
size |
Long |
アップデートパッケージファイルのサイズ (バイト) です。 このパラメーターは、OTA アップデートパッケージに単一のファイルが含まれる場合にのみ含まれます。 |
|
url |
文字列 |
Object Storage Service (OSS) 上のアップデートパッケージの保存先アドレスです。 このパラメーターは、OTA アップデートパッケージに単一のファイルが含まれ、HTTPS 経由でダウンロードされる場合にのみ含まれます。 |
|
dProtocol |
文字列 |
アップデートパッケージをダウンロードするためのプロトコルです。 このパラメーターは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。 |
|
streamId |
Long |
MQTT 経由で OTA アップデートパッケージをダウンロードするための一意の識別子です。 このパラメーターは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。 |
|
streamFileId |
Integer |
単一のアップデートパッケージファイルの一意の識別子です。 このパラメーターは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。 |
|
isDiff |
Long |
このパラメーターは、アップデートパッケージがデルタパッケージの場合にのみ含まれます。 値が 1 の場合、パッケージには新しいバージョンと以前のバージョンの差分のみが含まれ、デバイスはデルタリストアを実行する必要があります。 |
|
digestsign |
文字列 |
セキュアな更新用の OTA アップデートパッケージファイルの署名です。セキュアな更新が有効になっている場合にのみ含まれます。この機能は、更新パッケージの追加で有効にします。 |
|
sign |
文字列 |
OTA アップデートパッケージファイルの署名です。 このパラメーターは、OTA アップデートパッケージに単一のファイルが含まれる場合にのみ含まれます。 |
|
signMethod |
文字列 |
署名方法です。有効な値:
Android のデルタアップデートパッケージでは、MD5 署名方法のみがサポートされています。 |
|
md5 |
文字列 |
署名方法が MD5 の場合、sign パラメーターと md5 パラメーターの両方に値が設定されます。 このパラメーターは、OTA アップデートパッケージに単一のファイルが含まれる場合にのみ含まれます。 |
|
module |
文字列 |
アップデートパッケージが属するモジュールの名前です。モジュール名がデフォルトの場合、IoT Platform は module パラメーターを送信しません。 |
|
extData |
オブジェクト |
更新バッチタグのリストと、デバイスにプッシュされるカスタム情報です。 _package_udi フィールドはカスタム情報を示します。 単一タグの書式は |
|
files |
配列 |
複数のアップデートパッケージファイルに関する情報のリストです。 このパラメーターは、OTA アップデートパッケージに複数のファイルが含まれる場合に含まれます。各ファイルの情報は次のとおりです:
|
MQTT プロトコルによるダウンロード
MQTT 経由でアップデートパッケージをダウンロードする場合、単一ファイルパッケージのみに対応しています。デバイスが OTA アップデートパッケージ情報を取得した後、[フルダウンロード] または [分割ダウンロード] を選択できます。
-
[フルダウンロード]
-
メッセージフォーマット
{ "id": "123", "code": 200, "data":{ "size":432945, "digestsign":"A4WOP***SYHJ6DDDJD9***", "version":"2.0.0", "isDiff":1, "signMethod":"MD5", "dProtocol":"mqtt", "streamId":1397345, "streamFileId":1, "md5":"93230c3bde***", "sign":"93230c3bde42***", "module":"MCU", "extData":{ "key1":"value1", "key2":"value2" } } } -
パラメータの説明
パラメータ
タイプ
説明
id
Long
メッセージ ID。ID は、現在のデバイスで一意である必要があります。
message
String
結果情報。
code
Integer
ステータスコード。
version
String
デバイスアップデートパッケージのバージョン。
size
Long
アップデートパッケージファイルのサイズ (バイト単位)。
このパラメータは、OTA アップデートパッケージに単一のファイルが含まれている場合にのみ含まれます。
url
String
Object Storage Service (OSS) 内のアップデートパッケージのストレージアドレス。
このパラメータは、OTA アップデートパッケージに単一のファイルが含まれており、HTTPS 経由でダウンロードされる場合にのみ含まれます。
dProtocol
String
アップデートパッケージをダウンロードするためのプロトコル。
このパラメータは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。
streamId
Long
MQTT 経由で OTA アップデートパッケージをダウンロードするための一意の識別子。
このパラメータは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。
streamFileId
Integer
単一のアップデートパッケージファイルの一意の識別子。
このパラメータは、アップデートパッケージが MQTT 経由でダウンロードされる場合にのみ含まれます。
isDiff
Long
このパラメータは、アップデートパッケージが差分パッケージである場合にのみ含まれます。
値が 1 の場合は、パッケージに新しいバージョンと以前のバージョンの差分のみが含まれていることを示し、デバイスは差分復元を実行する必要があります。
digestsign
String
セキュアアップデートのための OTA アップデートパッケージファイル署名。セキュアアップデートが有効になっている場合にのみ含まれます。「アップデートパッケージの追加」でこの機能を有効にします。
sign
String
OTA アップデートパッケージファイルの署名。
このパラメータは、OTA アップデートパッケージに単一のファイルが含まれている場合にのみ含まれます。
signMethod
String
署名方式。有効な値:
-
SHA256 -
MD5
Android の差分アップデートパッケージでは、MD5 署名方式のみがサポートされています。
md5
String
署名方式が MD5 の場合、sign パラメータと md5 パラメータの両方に値が割り当てられます。
このパラメータは、OTA アップデートパッケージに単一のファイルが含まれている場合にのみ含まれます。
module
String
アップデートパッケージが属するモジュールの名前。モジュール名がデフォルトの場合、IoT Platform は module パラメータを送信しません。
extData
Object
更新バッチタグのリストと、デバイスにプッシュされるカスタム情報。
_package_udi フィールドはカスタム情報を示します。
単一のタグの形式は
"key":"value"です。files
Array
複数のアップデートパッケージファイルに関する情報のリスト。
このパラメータは、OTA アップデートパッケージに複数のファイルが含まれている場合に含まれます。各ファイルの情報は次のとおりです:
-
fileSize:アップデートパッケージファイルのサイズ。
-
fileName:アップデートパッケージファイルの名前。
-
fileUrl、fileMd5、fileSign:これらのパラメータは、url、md5、sign と同様です。
-
-
-
[オプション: 分割ダウンロード]。前述のアップデートパッケージ情報を取得した後、デバイスは次のトピックを使用して OTA アップデートパッケージファイルを分割ダウンロードします。
-
リクエストトピック:
/sys/${productKey}/${deviceName}/thing/file/download -
レスポンストピック:
/sys/${productKey}/${deviceName}/thing/file/download_reply -
リクエストメッセージフォーマット
{ "id": "123456", "version": "1.0", "params": { "fileToken":"1bb8***", "fileInfo":{ "streamId":1234565, "fileId":1 }, "fileBlock":{ "size":256, "offset":2 } } } -
リクエストメッセージのパラメータの説明
パラメータ
タイプ
説明
id
String
メッセージ ID。値は 0~4294967295 の数値を含む文字列で、現在のデバイスで一意である必要があります。
version
String
プロトコルバージョン。値は 1.0 に固定されています。
params
Object
リクエストパラメータ。
fileToken
String
ファイルの一意のトークン。このパラメータは必須ではありません。数字、文字、アンダースコア (_)、ピリオド (.) をサポートします。値の長さは最大 16 文字です。
使用上の注意:
-
このパラメータを指定すると、IoT Platform はデバイスリクエストへのレスポンスでそれを返します。これにより、マルチファイルダウンロードシナリオで、レスポンスメッセージ内の対応するダウンロード済みファイルを確認できます。
-
現在のファイルのリクエストとレスポンスのサイクル中に、デバイスが他のファイルのダウンロードリクエストを開始する必要がない場合は、このパラメータを空のままにすることができます。
fileInfo
Object
OTA アップデートパッケージファイル情報。
streamId
Long
MQTT 経由で OTA アップデートパッケージをダウンロードするための一意の識別子。
fileId
Integer
単一のアップデートパッケージファイルの一意の識別子。
fileBlock
Object
ファイルチャンク情報。
size
Integer
ダウンロードするファイルチャンクのサイズ (バイト単位)。値の範囲は 256~131072 です。最後のファイルチャンクの場合、値の範囲は 1~131072 です。
offset
Integer
ファイルチャンクに対応するバイトの開始アドレス。値の範囲は 0~16777216 です。
-
-
レスポンスメッセージの構造
構造項目
説明
JSON バイト長
レスポンスデータ内の JSON 文字列に対応するバイト配列の長さ。長さは 2 バイトで、上位バイトが先頭になります (ビッグエンディアン)。
たとえば、レスポンスの JSON 文字列を UTF-8 エンコーディングを使用して変換したバイト配列の長さが 10 進数で 87 (16 進数で 57) の場合、上位バイトは 0x00、下位バイトは 0x57 となります。
JSON 文字列バイト
レスポンスデータ内の JSON 文字列の UTF-8 バイト配列。フォーマットの詳細は、後述の「レスポンスメッセージフォーマット」をご参照ください。
ファイルブロックバイト
現在のファイルチャンクのバイト配列。バイトはファイルヘッダーからのオフセットの昇順に配置されます。
CRC16/IBM
ファイルチャンクのチェックサム。CRC16/IBM のみがサポートされています。長さは 2 バイトで、下位バイトが先頭になります (リトルエンディアン)。
たとえば、ファイルチャンクのチェックサムが 0x0809 の場合、下位バイトは 0x09、上位バイトは 0x08 となります。
-
レスポンスメッセージフォーマット
{ "id": "123456", "code":200, "msg":"file size has exceeded the limit 16 MB", "data": { "fileToken":"1bb8***", "fileLength":1238848, "bSize":1491, "bOffset":2 } } -
レスポンスメッセージのパラメータの説明
パラメータ
タイプ
説明
id
String
メッセージ ID。値は 0~4294967295 の数値を含む文字列で、現在のデバイスで一意である必要があります。
デバイスリクエストのメッセージ ID が返されます。これは、リクエストトピック
/sys/${productKey}/${deviceName}/thing/file/downloadのデータに含まれる id です。code
Integer
ステータスコード。値が 200 の場合は成功を示します。
msg
String
リクエストが失敗した場合に返されるエラーメッセージ。
data
Object
デバイスに返されるデータ。
fileToken
String
ファイルの一意のトークン。このパラメータは、リクエストパラメータで fileToken が指定された場合に返されます。
fileLength
Integer
ファイルの合計サイズ (バイト単位)。
bSize
Integer
現在のファイルチャンクのサイズ (バイト単位)。
bOffset
Integer
現在のファイルチャンクに対応するバイトの開始アドレス。この値は、リクエストデータ内の offset の値と同じです。単位はバイトです。
-
更新の進捗報告
-
デバイスは、トピック
/ota/device/progress/${YourProductKey}/${YourDeviceName}にメッセージをパブリッシュします。 -
メッセージフォーマット
{ "id": "123", "params": { "step": "-1", "desc": "OTA アップデートが失敗しました。アップデートパッケージ情報のリクエストに失敗しました。", "module": "MCU" } } -
フォーマット
パラメーター
タイプ
説明
id
文字列
メッセージ ID。値は 0~4294967295 の数値を表す文字列であり、現在のデバイスにおいて一意である必要があります。
step
文字列
OTA アップデートの進捗。アップデートシナリオに基づいて、進捗値と説明を設定します。デバイス側の設定:サンプルコード。
-
1~100 の整数: アップデートの進捗率。
-
-1: アップデート失敗 -
-2: ダウンロード失敗 -
-3: 検証失敗 -
-4: 書き込み失敗
desc
文字列
現在のステップの説明。値の長さは最大 128 文字です。例外が発生した場合、このフィールドにエラーメッセージを含めることができます。
module
文字列
OTA アップデートパッケージのモジュール名。モジュールの詳細:アップデートパッケージの追加。
デフォルトモジュールの OTA アップデートの進捗を報告する場合、 module パラメーターは空にすることができます。
-