IoT Platformを使用すると、OTA (Over-the-Air Technology) を使用してデバイスファームウェアをダウンロードおよび更新できます。
背景情報
次の図は、MQTT (Message Queuing Telemetry Transport) プロトコルに基づいてファームウェアを更新するプロセスを示しています。 
OTA 更新プロセス
OTA APIを使用して、デバイスのファームウェア更新の自動ダウンロードを実装できます。 ただし、更新パッケージの保存とインストールはユーザーが管理する必要があります。
ダウンロードしたパッケージの保存場所を指定する必要があります。 ダウンロードしたパッケージを保存するデバイスのフラッシュメモリなどのメディアを指定できます。
ダウンロードしたパッケージをインストールまたは使用するには、ユーザー操作が必要です。 たとえば、更新を実行するにはボタンをクリックする必要があります。
基本APIまたは高度なAPIを使用してOTAアップデートを実装できます。 以下の手順は、2つの方法の例を提供する。
基本APIの使用
次の手順では、src/ota/examples/ota_example_mqtt.cを使用して、基本APIを使用してOTA更新を実装する方法を説明します。
デバイスをOTAサービスに接続する準備をします。 デバイスの3倍をインポートし、接続に必要なパラメーターを設定します。
int main(int argc, char * argv[]) { ... /**<デバイス情報を取得 * / HAL_SetProductKey(PRODUCT_KEY); HAL_SetDeviceName(DEVICE_NAME); HAL_SetDeviceSecret(DEVICE_SECRET); /**< end * / _ota_mqtt_client() }_ota_mqtt_client関数を呼び出して、OTAロジックを設定し、接続を確立します。
/* デバイスAUTH * / if (0 != IOT_SetupConnInfo(g_product_key, g_device_name, g_device_secret, (void **)&pconn_info)) { EXAMPLE_TRACE("AUTHリクエストが失敗しました!"); rc = -1; goto do_exit; } /* MQTTパラメータを初期化する * / memset(&mqtt_params, 0x0, sizeof(mqtt_params)); mqtt_params.port = pconn_info-> ポート; mqtt_params.host = pconn_info->host_name; mqtt_params.client_id = pconn_info->client_id; mqtt_params.username = pconn_info->username; mqtt_params.password = pconn_info-> パスワード; mqtt_params.pub_key = pconn_info->pub_key; mqtt_params.request_timeout_ms = 2000; mqtt_params.clean_session = 0; mqtt_params.keepalive_interval_ms = 60000; mqtt_params.read_buf_size = OTA_MQTT_MSGLEN; mqtt_params.write_buf_size = OTA_MQTT_MSGLEN; mqtt_params.handle_event.h_fp = event_handle; mqtt_params.handle_event.pcontext = NULL; /* 指定パラメーターでMQTTクライアントを構築する * / pclient = IOT_MQTT_Construct(&mqtt_params); if (NULL == pclient) { EXAMPLE_TRACE("MQTTコンストラクト失敗"); rc = -1; goto do_exit; }_ota_mqtt_client関数を呼び出して、OTAサービスを初期化します。 このステップにおいて、デバイスは、そのファームウェア更新情報に加入する。h_ota = IOT_OTA_Init(PRODUCT_KEY, DEVICE_NAME, pclient); if (NULL == h_ota) { rc = -1; EXAMPLE_TRACE (「OTAの初期化に失敗しました」); goto do_exit; }OTA更新に関するメッセージを受信し続けるためのループを作成します。
int ota_over = 0; do { uint32_t firmware_valid; EXAMPLE_TRACE("wait ota upgrade command ...."); /* MQTTメッセージを受信します。 */ IOT_MQTT_Yield(pclient、200); /* 受信したメッセージにファームウェアのアップグレードに関する情報が含まれているか確認します。 */ if (IOT_OTA_IsFetching(h_ota)) { /* OTAサービスから最新のファームウェアをダウンロードし、ダウンロードの進行状況を報告します。 詳細については、「ステップ5」をご参照ください。 OTAサービスから最新のファームウェアをダウンロードし、ダウンロードの進行状況を報告します。* / /* ファームウェアのMD5ハッシュ値を確認します。 詳細については、「手順6 MD5ハッシュ値の確認」を参照してください。* / } } while (!ota_over);サーバーが
IOT_OTA_IsFetchingに1で応答するように、ファームウェア更新イベントをサーバーにプッシュする必要があります。 その後、ファームウェア更新ロジックが有効になります。 ファームウェア更新イベントをプッシュするには、次の手順を実行します。IoT PlatformコンソールのOTAサービスページに移動し、[新しいファームウェアの追加] をクリックします。
[ファームウェアの作成] および [ファームウェアの確認] をクリックします。
追加したファームウェアの [一括アップグレード] をクリックし、examples/ota/ota_mqtt-example.cの3つ組に対応する製品を選択します。
バージョンドロップダウンリストから現在のバージョン番号を選択し、[アップグレード範囲] を [方向アップグレード] に設定します。 [機器スコープ] ドロップダウンリストから例 /ota/ota_mqtt-example.cと同じ3倍のデバイスを選択し、[OK] をクリックします。
OTAサービスから最新のファームウェアをダウンロードし、ダウンロードの進行状況を報告します。
do { /* OTAサービスから最新のファームウェアをダウンロードします。 */ len = IOT_OTA_FetchYield(h_ota, buf_ota, OTA_BUF_LEN, 1); if (len > 0) { if (1 != fwrite(buf_ota, len, 1, fp)) { EXPELE_TRACE ("ファイルへのデータの書き込みに失敗しました"); rc = -1; break; } } else { /* ダウンロードの進行状況を報告します。 */ IOT_OTA_ReportProgress(h_ota, IOT_OTAP_FETCH_FAILED, NULL); 例_TRACE("ota fetch fail"); } /* OTA情報を取得 * / /* ダウンロードされたデータの量、合計ファイルサイズ、MD5ハッシュ値、バージョン番号などのファームウェア情報を取得します。 */ IOT_OTA_Ioctl(h_ota, IOT_OTAG_FETCHED_SIZE, &size_downloaded, 4); IOT_OTA_Ioctl(h_ota, IOT_OTAG_FILE_SIZE, &size_file, 4); IOT_OTA_Ioctl(h_ota, IOT_OTAG_MD5SUM, md5sum, 33); IOT_OTA_Ioctl(h_ota、IOT_OTAG_VERSION、バージョン、128); last_percent=パーセント; パーセント= (size_download * 100) / size_file; if (percent - last_percent > 0) { /* ダウンロードの進行状況を報告します。 */ IOT_OTA_ReportProgress(h_ota、パーセント、NULL); IOT_OTA_ReportProgress(h_ota、パーセント、"hello"); } IOT_MQTT_Yield(pclient、100); /* ダウンロードが完了したかどうかを確認します。 */ } while (!IOT_OTA_IsFetchFinish(h_ota));MD5ハッシュ値を確認します。
IOT_OTA_Ioctl(h_ota, IOT_OTAG_CHECK_FIRMWARE, &firmware_valid, 4); if (0 == firmware_valid) { EXAMPLE_TRACE("ファームウェアが無効です"); } else { EXAMPLE_TRACE("ファームウェアは有効です"); } ota_over = 1;IOT_OTA_Deinitを呼び出して、すべてのリソースを解放します。if (NULL != h_ota) { IOT_OTA_Deinit(h_ota); } if (NULL != pclient) { IOT_MQTT_Destroy(&pclient); } if (NULL != msg_buf) { HAL_Free(msg_buf); } if (NULL != msg_readbuf) { HAL_Free(msg_readbuf); } if (NULL != fp) { fclose(fp); } 戻りrc;ファームウェアを保存します。
_ota_mqtt_client関数を呼び出して、ファイルを開いたり閉じたり、ファイルにデータを書き込んだりします。fp = fopen("ota.bin", "wb +") ... if (1 != fwrite(buf_ota, len, 1, fp)) { EXPELE_TRACE ("ファイルへのデータの書き込みに失敗しました"); rc = -1; ブレーク; } ... if (NULL != fp) { fclose(fp); }
高度なAPIの使用
次の手順では、src/dev_model/examples/linkkit_example_solo.cを使用して、高度なAPIを使用してOTA更新を実装する方法を説明します。
ゲートウェイを初期化し、firmware-over-the-air (FOTA) コールバックを登録し、ゲートウェイをIoT Platformに接続します。
int res = 0; int domain_type = 0, dynamic_register = 0, post_reply_need = 0; iotx_linkkit_dev_meta_info_t master_meta_info; memset(&g_user_example_ctx, 0, sizeof(user_example_ctx_t)); memset(&master_meta_info, 0, sizeof(iotx_linkkit_dev_meta_info_t)); memcpy(master_meta_info.product_key、PRODUCT_KEY、strlen(PRODUCT_KEY)); memcpy(master_meta_info.product_secret、PRODUCT_SECRET、strlen(PRODUCT_SECRET)); memcpy(master_meta_info.device_name, DEVICE_NAME, strlen(DEVICE_NAME)); memcpy(master_meta_info.device_secret, DEVICE_SECRET, strlen(DEVICE_SECRET)); /* コールバックの登録 * / ... ... IOT_RegisterCallback(ITE_FOTA、user_fota_event_handler); domain_type=IOTX_CLOUD_REGION_上海; IOT_Ioctl(IOTX_IOCTL_SET_DOMAIN, (void *)&domain_type); /* ログイン方法の選択 * / dynamic_register = 0; IOT_Ioctl(IOTX_IOCTL_SET_DYNAMIC_REGISTER、(void *)&dynamic_register); /* ポスト返信は必要ありません * / post_reply_need = 1;IOT_Ioctl(IOTX_IOCTL_RECV_EVENT_REPLY, (void *)&post_reply_need); /* マスターデバイスのリソースの作成 * / g_user_example_ctx.master_devid = IOT_Linkkit_Open(IOTX_LINKKIT_DEV_TYPE_MASTER、&master_meta_info); if (g_user_example_ctx.master_devid < 0) { EXAMPLE_TRACE("IOT_Linkkit_Open Failed\n"); return -1;} /* スタート接続Aliyunサーバー * / res = IOT_Linkkit_Connect(g_user_example_ctx.master_devid); if (res < 0) { 例_トレース ("IOT_Linkkit_Connect Failed\n"); リターン-1; }前の手順で登録された
user_fota_event_handlerコールバックを呼び出します。コールバックは、次のシナリオで呼び出されます。
デバイスはIoT Platformから通知を受信します。 通知は、新しいファームウェアが利用可能であることを示す。
デバイスはファームウェア更新クエリを開始し、IoT Platformは新しいファームウェアが利用可能であるという通知で応答します。
デバイスが通知を受信したら、
IOT_Linkkit_Queryを呼び出してファームウェアをダウンロードします。int user_fota_event_handler(int型、const char * version){ char buffer[128] = {0}; int buffer_length = 128; /* 0-新しいファームウェアが存在し、新しいファームウェアを照会します * / if (type == 0) { EXAMPLE_TRACE (「新しいファームウェアバージョン: % s」、バージョン); IOT_Linkkit_Query (EXAMPLE_MASTe_DEVID、ITM_MSG_QUERY_FOTA_DATA、(unsigned char *) バッファ、buffer_length); } 0を返します。}ファームウェアを保存します。
次のハードウェア抽象化レイヤー (HAL) 操作を呼び出して、ファームウェアを格納します。
/* ファームウェアのダウンロードを開始する前に、SDKを使用してこの操作を呼び出します。 * / void HAL_Firmware_Persistence_Start(void); /* ファームウェアデータを受信したときにSDKを使用してこの操作を呼び出します。 * / int HAL_Firmware_Persistence_Write(char * buffer、uint32_t長); /* ファームウェアのダウンロードが完了したら、SDKを使用してこの操作を呼び出します。 * / int HAL_Firmware_Persistence_Stop(void);新しいファームウェアが使用可能かどうかを照会します。
IOT_Linkkit_Query(user_example_ctx->master_devid, ITM_MSG_REQUEST_FOTA_IMAGE, (符号なしchar *)("app-1.0.0-20180101.1001") 、30);
ソフトウェアモジュールのOTAアップデート
OTAを使用すると、デバイスのソフトウェアモジュールをダウンロードおよび更新できます。 モジュールのOTA更新を実行する前に、IoT Platformコンソールでモジュールを作成する必要があります。
デバイス側の開発では、IoT Platformコンソールで指定したモジュール名にモジュール名を設定する必要があります。
char * module = "mcu";
IOT_Ioctl(IOTX_IOCTL_SET_MODULE、(void *) モジュール); OTA更新の他のステップは、OTAテスト手順におけるステップと同じである。 IoT PlatformコンソールでデバイスモジュールのOTAアップデートを開始すると、次のログがデバイスに表示されます。 モジュールフィールドをチェックして、正しいモジュールでOTA更新が実行されているかどうかを確認できます。
[dbg] otamqtt_UpgrageCb(111): topic=/ota/device/upgrade/a1 ****** PjW/foDzDj ******** 3PDJ9d
[dbg] otamqtt_UpgrageCb(112): len=431, topic_msg={"code":"1000","data":{"size":143360,"module":"mcu","sign":"867f1536fb ********" version ":" 111 "、" url "Md5","md5":"867f1536fb ********* 436252"},"id":1582865357795,"message":"success"}
[dbg] otamqtt_UpgrageCb(129): 受信デバイスのアップグレード
[inf] ofc_Init(47): protocol: https
受信状態: -0x092C(msgキューサイズ: 0、最大サイズ: 50)
受信状態: -0x092C (メッセージタイプ付きmsg enqueue: 43)
受信状態: -0x092C(msgデキュー)
受信状態: -0x0938(alinkイベントタイプ: 43)
受信状態: -0x0938 (新しいfota情報受信、111)
user_fota_module_event_handler.219: 新しいファームウェアバージョン: 111、モジュール: mcu