すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:インスタンスの移行に関連するサーバーを構成する方法の例

最終更新日:Jan 26, 2024

ソースパブリックインスタンスのデータをターゲットEnterprise Editionインスタンスに移行した後、ビジネスに関連するすべてのIoT Platform API操作をターゲットEnterprise Editionインスタンスで実行する必要があります。 この場合、データベース内のデバイスが属するインスタンスのIDを更新するための関数を開発する必要があります。 また、デバイスのサービスを管理するためにIoT Platform API操作を呼び出すときに、デバイスのEnterprise EditionインスタンスIDを指定するために使用される関数を開発する必要があります。 このトピックでは、インスタンスの移行を実行するビジネスシステムでサーバーを設定する方法について説明します。 この例では、Java開発環境を使用しています。

背景情報

インスタンスの移行については、「使用上の注意事項」をご参照ください。

インスタンス移行メッセージをサブスクライブする方法の詳細については、「データ転送ルールの設定」をご参照ください。

開発環境

Java開発環境では、次のコンポーネントが使用されます。

サンプルコード

操作

説明

デバイスデータの更新

ルールエンジンを使用して、ソースパブリックインスタンスがサブスクライブするインスタンス移行メッセージを解析します。 移行されたデバイスのデータ転送メッセージを解析し、データベース内のデバイスが属するインスタンスのIDを更新します。

デバイスサービスの管理

デバイスサービスを管理するために呼び出すAPI操作のリクエストパラメーターを設定します。 API操作を呼び出すときは、データベースのテーブルでサービスを管理するデバイスが属するインスタンスのIDを照会する必要があります。 次に、API操作のIotInstanceIdリクエストパラメーターのIDを指定します。

デバイスデータを更新するためのサンプルコード

Advanced Message Queuing Protocol (AMQP) クライアントをIoT Platformに接続するために使用されるSDKに基づいて、デバイスデータを更新する機能を開発する必要があります。 AMQPクライアントの接続方法の詳細については、「SDK For Javaを使用してクライアントをIoT Platformに接続する」をご参照ください。

インスタンス移行メッセージを処理するために呼び出されるprocessMessage関数の定義を次のコードに置き換えます。 コードでは、updateDeviceInstanceId(productKey, deviceName, targetInstanceId) 関数とrecoverDeviceInstanceId(productKey, deviceName) 関数が呼び出され、データベースのデータが更新されます。 ビジネスシナリオに基づいて機能を設定する必要があります。

private static void processMessage (メッセージメッセージ) {
        try {
            byte[] body = message.getBody(byte[].class);
            String content = new String(body);
            String topic = message.getStringProperty("topic");
            文字列messageId = message.getStringProperty("messageId");
            logger.info (「メッセージを受け取る」
                + ",\n topic = " + topic
                + ",\n messageId = " + messageId
                + ",\n content = " + content);

            if (null == content) {
                logger.error("content is null");
            }

            JSONObject object = JSON.parseObject(content);
            String status = object.getString("status");

            // 移行されたデバイスが属するインスタンスのIDを更新します。 
            String targetInstanceId = object.getString("targetInstance");

            // 移行されたデバイスが属するインスタンスのIDを、移行先のEnterprise EditionのIDに置き換えます。 
            if (StringUtils.equals(status, "GRAY_EXECUTING") | | | StringUtils.equals(status, "ALL_EXECUTING")) {
                JSONArray successDevices = object.getJSONArray("successDevices");

                if (successDevices == null) {
                    return;
                }

                for (int i = 0; i < successDevices.size(); i ++) {
                    JSONObject device = successDevices.getJSONObject(i);
                    if (null ==デバイス) {
                        return;
                    }

                    String deviceName = device.getString("deviceName");
                    String productKey = device.getString("productKey");

                    // todo: 指定されたProductKey、DeviceNames、および宛先インスタンスIDに基づいて、データベース内の移行済みデバイスが属するインスタンスのIDを更新します。 
                    // updateDeviceInstanceId(productKey、deviceName、targetInstanceId)


                }
            }

            // ロールバックされたデバイスが属するインスタンスのIDを元のインスタンスのIDに復元します。 
            if (StringUtils.equals("status", "ROLL_BACK_EXECUTING")) {
                JSONArray successDevices = object.getJSONArray("successDevices");
                if (successDevices == null) {
                    return;
                }

                for (int i = 0; i < successDevices.size(); i ++) {
                    JSONObject device = successDevices.getJSONObject(i);
                    if (null ==デバイス) {
                        return;
                    }

                    String deviceName = device.getString("deviceName");
                    String productKey = device.getString("productKey");

                    // todo: 指定されたProductKeyとDeviceNamesに基づいて、データベース内のインスタンスのIDを復元します。 ビジネスシナリオに基づいて復元ポリシーを設定する必要があります。 
                    // 1. ソースパブリックインスタンスに関連するAPI呼び出しにIDを指定しない場合、システムはインスタンスIDをnullに設定します。 
                    // 2. ソースパブリックインスタンスに関連するAPI呼び出しのIDを指定した場合、システムはインスタンスIDを元のデフォルト値に設定します。 
                    // recoverDeviceInstanceId(productKey, deviceName)
                }
            }
        } catch (Exception e) {
            logger.error("processMessage occurs error" 、e);
        }
    }

デバイスサービスを管理するためのサンプルコード

IoT Platform SDK for Javaに基づいて、デバイス関連のAPI操作を呼び出す関数を開発する必要があります。 IoT Platform SDK For Javaの使用方法の詳細については、「IoT Platform SDK for Javaの使用」をご参照ください。

必要なAPI操作を呼び出す関数を開発します。 この例では、Pub API操作が呼び出されます。 次のコードは、pub(client, productKey, deviceName) 関数を定義します。 コードでは、ビジネスロジックを実装するためにgetInstanceId(productKey, deviceName) 関数が呼び出されます。 ビジネスシナリオに基づいて機能を開発する必要があります。

public static void main(String[] args) {
        String accessKey = "${accessKey}";
        String accessSecret = "${accessSecret}";
        String productKey = "${productKey}";
        文字列deviceName = "${deviceName}";
        IClientProfile profile = DefaultProfile.getProfile("cn-shanghai", accessKey, accessSecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);

        pub (クライアント、productKey、deviceName);
    }

    private static void pub(DefaultAcsClientクライアント、String productKey、String deviceName) {
        PubRequest request = new PubRequest();
        // データベースからインスタンスIDを取得します。 
        String instanceId = getInstanceId(productKey, deviceName);

        // インスタンスIDを取得した場合は、instanceIdパラメーターにインスタンスIDを指定する必要があります。 Enterprise Editionインスタンスを使用する場合は、このパラメーターを設定する必要があります。 パブリックインスタンスを使用する場合、このパラメーターを設定する必要はありません。 
        if (!StringUtils.isEmpty(instanceId)) {
            request.setIotInstanceId(instanceId);
        }

        request.setProductKey("${productKey}");
        request.setMessageContent(Base64.encodeBase64String("hello world".getBytes()));
        request.setTopicFullName("/${productKey}/${deviceName}/user/get");
        request.setQos(0); // QoS 0とQoS 1がサポートされています。 
        try {
            PubResponse response = client.getAcsResponse(request);
            System.out.println(response.getSuccess());
            System.out.println(response.getCode());
            System.out.println(response.getErrorMessage());
        } catch (ServerException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            e.printStackTrace();
        }
    }

    /**
     * データベースからインスタンスIDを取得します。 
     *
     * @ param productKey
     * @ param deviceName
     * @return
     */
    プライベート静的文字列getInstanceId(String productKey, String deviceName) {
        文字列instanceId = "";
        // todo: 指定されたProductKeyとDeviceNameを使用して、データベース内のデータを照会します。 
        // instanceId = query(productKey, deviceName);

        instanceIdを返します。
    }