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

IoT Platform:カスタム Topic を使用した通信

最終更新日:Nov 10, 2025

MQTT プロトコルを使用して IoT Platform に接続するデバイスは、Topic をサブスクライブするか、Topic にメッセージをパブリッシュすることで通信します。 Topic は、システム Topic、TSL モデル Topic、およびカスタム Topic に分類されます。カスタム Topic はコンソールで定義する必要があります。このトピックでは、デバイスがカスタム Topic を使用して IoT Platform と通信する方法と、IoT Platform がビジネスサーバーと通信する方法について説明します。

背景情報

この例では、電子温度計がカスタム Topic をサブスクライブして命令を受信し、カスタム Topic にメッセージをパブリッシュして温度データをレポートします。 IoT Platform は、AMQP サーバーを介して温度データをユーザーサーバーに転送します。ユーザーサーバーは Pub 操作を呼び出して、カスタム Topic にメッセージをパブリッシュし、デバイスの精度をリモートで設定します。

自定义Topic通信

開発環境を準備する

この例では、デバイスと IoT Platform は Java 用 SDK を使用します。そのため、Java 開発環境を準備する必要があります。 Java 開発環境は、Java の公式 Web サイトからダウンロードしてインストールできます。

この例では、開発環境は次のコンポーネントで構成されています。

プロダクトとデバイスを作成する

  1. IoT Platform コンソール にログインします。

  2. [概要] ページで、[すべての環境] をクリックします。 [すべての環境] タブで、管理するインスタンスを見つけ、インスタンス ID またはインスタンス名をクリックします。

  3. 左側のナビゲーションウィンドウで、[デバイス] > [プロダクト] を選択します。

  4. [プロダクトの作成] をクリックして温度計プロダクトを作成し、プロダクトキーa1uzcH0**** などの [ProductKey] を取得します。

    詳細については、「プロダクトを作成する」をご参照ください。

  5. プロダクトの作成後、プロダクトの横にある [表示] をクリックします。

  6. [プロダクトの詳細] ページで、[Topic カテゴリ] タブをクリックします。次に、[カスタム Topic] をクリックして、カスタム Topic カテゴリを追加します。

    詳細については、「カスタム Topic を使用した通信」をご参照ください。

    この例では、次の Topic カテゴリが必要です。

    • デバイスパブリッシング Topic: /a1uzcH0****/${deviceName}/user/devmsg、パブリッシュ権限付き。

    • デバイスサブスクリプション Topic: /a1uzcH0****/${deviceName}/user/cloudmsg、サブスクライブ権限付き。

  7. [サーバー側サブスクリプション] タブをクリックします。次に、[サブスクリプションの作成] をクリックして、AMQP サーバー側サブスクリプションを構成します。 [デバイスアップストリーム通知][デフォルトのコンシューマーグループ] にサブスクライブします。

    [デバイスアップストリーム通知] には、カスタム Topic メッセージと TSL モデルメッセージが含まれます。詳細については、「AMQP サーバー側サブスクリプションを構成する」をご参照ください。

  8. 左側のナビゲーションウィンドウで、[デバイス] > [デバイス] を選択します。次に、作成した温度計プロダクトに [device1] という名前のデバイスを追加します。 [ProductKey][DeviceName][DeviceSecret] などのデバイス証明書情報を取得します。

    詳細については、「デバイスを作成する」をご参照ください。

サーバーにメッセージを送信するようにデバイスを構成する

次の図は、デバイスがサーバーにメッセージを送信する方法を示しています。

自定义Topic通信

このセクションでは、メッセージングプロセスを実装するためにサーバーとデバイスを構成する方法について説明します。

  • AMQP クライアントを IoT Platform に接続し、デバイスからのメッセージをリッスンするようにクライアントを構成します。サーバーは、AMQP クライアントを使用してメッセージを受信します。詳細については、「Java 用 SDK を使用して AMQP クライアントを IoT Platform に接続する」をご参照ください。

    重要

    AMQP クライアントのコンシューマーグループは、デバイスと同じ IoT Platform インスタンスにある必要があります。

  • デバイスを IoT Platform に接続し、デバイスがメッセージを送信できるようにデバイス SDK を構成します。

    • デバイスを認証するためのパラメーターを構成します。

      final String productKey = "a1*********"; // プロダクトキー
      final String deviceName = "device1"; // デバイス名
      final String deviceSecret = "***************"; // デバイスシークレット
      final String region = "cn-shanghai"; // リージョン
      final String iotInstanceId = "iot-2w****"; // IoT インスタンス ID

      ビジネス要件に基づいて、次の表に記載されているパラメーターを構成する必要があります。

      パラメーター

      説明

      productKey

      a1uzcH0****

      デバイス証明書の情報です。IoT Platform コンソールの [デバイスの詳細] ページで情報を表示できます。詳細については、「デバイスの詳細を表示する」をご参照ください。

      deviceName

      device1

      deviceSecret

      uwMTmVAMnxB****

      region

      cn-shanghai

      IoT Platform デバイスが配置されているリージョンの ID です。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。

      iotInstanceId

      iot-2w****

      デバイスが属するインスタンスの ID です。

      インスタンス ID は、IoT Platform コンソールの [概要] ページで表示できます。

      • インスタンス ID が表示されている場合は、このパラメーターを指定する必要があります。

      • インスタンスに [概要] または ID が生成されない場合は、パラメーターに空の文字列(iotInstanceId = "")を指定します。

    • MQTT 接続パラメーター、デバイスパラメーター、TSL モデルパラメーターなど、接続を初期化するためのパラメーターを構成します。

      // MQTT 接続パラメーターを構成します。Link SDK は MQTT プロトコルを使用します。
      LinkKitInitParams params = new LinkKitInitParams();
      IoTMqttClientConfig config = new IoTMqttClientConfig();
      config.productKey = productKey;
      config.deviceName = deviceName;
      config.deviceSecret = deviceSecret;
      config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";
      
      // デバイスパラメーターを構成します。
      DeviceInfo deviceInfo = new DeviceInfo();
      deviceInfo.productKey = productKey;
      deviceInfo.deviceName = deviceName;
      deviceInfo.deviceSecret = deviceSecret;
      
      // デバイスの初期ステータスを指定します。
      Map<String, ValueWrapper> propertyValues = new HashMap<String, ValueWrapper>();
      
      params.mqttClientConfig = config;
      params.deviceInfo = deviceInfo;
      params.propertyValues = propertyValues;

      ビジネス要件に基づいて、次の表に記載されているパラメーターを構成する必要があります。

      パラメーター

      説明

      config.channelHost

      config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";

      MQTT デバイス接続用のドメイン名。

      • 古いパブリックインスタンス: config.channelHost = productKey + ".iot-as-mqtt." + region + ".aliyuncs.com:1883";

      • 新しいパブリックインスタンスと Enterprise Edition インスタンス: config.channelHost = iotInstanceId + ".mqtt.iothub.aliyuncs.com:1883";

    • 接続パラメーターを初期化します。

      // 接続し、接続確立後に呼び出されるコールバック関数を構成します。
      LinkKit.getInstance().init(params, new ILinkKitConnectListener() {
           @Override
           public void onError(AError aError) {
               System.out.println("Init error:" + aError); // 初期化エラー
           }
      
           // コールバック関数を実装します。
           @Override
           public void onInitDone(InitResult initResult) {
               System.out.println("Init done:" + initResult); // 初期化完了
           }
       });
    • デバイスからメッセージを送信します。

      デバイスが IoT Platform に接続された後、デバイスを使用してカスタム Topic にメッセージを送信できます。 onInitDone 関数の内容を次の内容に置き換える必要があります。

      @Override
       public void onInitDone(InitResult initResult) {
           // メッセージのパブリッシュ先の Topic とメッセージの内容を指定します。
           MqttPublishRequest request = new MqttPublishRequest();
           request.topic = "/" + productKey + "/" + deviceName + "/user/devmsg";
           request.qos = 0;
           request.payloadObj = "{\"temperature\":35.0, \"time\":\"sometime\"}"; // {"temperature": 35.0, "time": "sometime"}
      
           // メッセージをパブリッシュし、メッセージのパブリッシュ後に使用されるコールバック関数を構成します。
           LinkKit.getInstance().publish(request, new IConnectSendListener() {
               @Override
               public void onResponse(ARequest aRequest, AResponse aResponse) {
                   System.out.println("onResponse:" + aResponse.getData()); // レスポンス
               }
      
               @Override
               public void onFailure(ARequest aRequest, AError aError) {
                   System.out.println("onFailure:" + aError.getCode() + aError.getMsg()); // 失敗
               }
           });
       }

      ビジネス要件に基づいてコードを変更し、パラメーターを指定する必要があります。

      パラメーター

      説明

      request.topic

      "/" + productKey + "/" + deviceName + "/user/devmsg"

      デバイスがパブリッシュ権限を持つカスタム Topic。

      request.payloadObj

      "{\"temperature\":35.0, \"time\":\"sometime\"}"

      メッセージの内容。

      サーバーは次のメッセージを受信します。

      Message
      {payload={"temperature":35.0, "time":"sometime"}, // ペイロード = {"temperature": 35.0, "time": "sometime"}
      topic='/a1uzcH0****/device1/user/devmsg', // Topic = '/a1uzcH0****/device1/user/devmsg'
      messageId='1131755639450642944', // メッセージ ID = '1131755639450642944'
      qos=0, // QoS = 0
      generateTime=1558666546105} // 生成時間 = 1558666546105

デバイスにメッセージを送信するようにサーバーを構成する

次の図は、サーバーがデバイスにメッセージを送信する方法を示しています。

自定义Topic通信

  • デバイス SDK でカスタムトピックをサブスクライブするように構成します。

    カスタム Topic をサブスクライブするようにデバイス SDK を構成します。デバイスを認証するためのパラメーターの構成、接続の初期化、IoT Platform への接続方法については、「サーバーにメッセージを送信するようにデバイスを構成する」のサンプルコードをご参照ください。

    カスタム Topic をサブスクライブするようにデバイスを構成する必要があります。

    次のサンプルコードは、Topic をサブスクライブするようにデバイスを構成する方法の例を示しています。

    // コールバック関数を実装します。
    @Override
    public void onInitDone(InitResult initResult) {
        // デバイスがサブスクライブする Topic を指定します。
        MqttSubscribeRequest request = new MqttSubscribeRequest();
        request.topic = "/" + productKey + "/" + deviceName + "/user/cloudmsg";
        request.isSubscribe = true;
    
        // サブスクリプションリクエストを送信し、サブスクリプションの成功または失敗後に呼び出されるコールバック関数を構成します。
        LinkKit.getInstance().subscribe(request, new IConnectSubscribeListener() {
            @Override
            public void onSuccess() {
                System.out.println("");
            }
    
            @Override
            public void onFailure(AError aError) {
    
            }
        });
    
        // ダウンストリームメッセージのリスナーを構成します。
        IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
            // ダウンストリームメッセージの受信後に使用されるコールバック関数を構成します。
            @Override
            public void onNotify(String connectId, String topic, AMessage aMessage) {
                System.out.println(
                    "received message from " + topic + ":" + new String((byte[])aMessage.getData())); // Topic からメッセージを受信しました:
            }
    
            @Override
            public boolean shouldHandle(String s, String s1) {
                return false;
            }
    
            @Override
            public void onConnectStateChange(String s, ConnectState connectState) {
    
            }
        };
        LinkKit.getInstance().registerOnNotifyListener(notifyListener);
    }

    request.topic は、デバイスがサブスクライブ権限を持つカスタム Topic に設定する必要があります。

  • IoT Platform の Pub 操作を呼び出してメッセージをパブリッシュするようにクラウド SDK を構成します。パラメーターの詳細については、「Pub」をご参照ください。 SDK の使用方法の詳細については、「Java 用 SDK を使用する」をご参照ください。

    • デバイスを認証するためのパラメーターを構成します。

       String regionId = "cn-shanghai"; // リージョン ID
       String accessKey = "LTAI****************"; // アクセスキー
       String accessSecret = "yourAccessKeySecret"; // アクセスシークレット
       final String productKey = "a1uzcH0****"; // プロダクトキー
       final String deviceName = "device1"; // デバイス名
       final String iotInstanceId = "iot-2w****"; // IoT インスタンス ID
      

      ビジネス要件に基づいて、次の表に記載されているパラメーターを構成する必要があります。

      パラメーター

      説明

      accessKey

      LTAIyourAccessKeySecretyourAccessKeySecret

      Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret。

      Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret。IoT Platform コンソールにログインし、プロファイル画像にポインターを移動して、[AccessKey 管理] をクリックすると、AccessKey ID と AccessKey Secret を取得できます。

      説明

      RAM ユーザーを使用する場合は、AliyunIOTFullAccess 権限ポリシーを RAM ユーザーにアタッチする必要があります。このポリシーにより、RAM ユーザーは IoT Platform リソースを管理できます。 AliyunIOTFullAccess 権限ポリシーを RAM ユーザーにアタッチしないと、IoT Platform への接続に失敗します。 RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザーアクセス」をご参照ください。

      accessSecret

      yourAccessKeySecret

      productKey

      a1uzcH0****

      デバイス証明書の情報です。IoT Platform コンソールの [デバイスの詳細] ページで情報を表示できます。詳細については、「デバイスの詳細を表示する」をご参照ください。

      deviceName

      device1

      region

      cn-shanghai

      IoT Platform デバイスが配置されているリージョンの ID です。リージョン ID の詳細については、「リージョンとゾーン」をご参照ください。

      iotInstanceId

      iot-2w****

      デバイスが属するインスタンスの ID です。

      インスタンス ID は、IoT Platform コンソールの [概要] ページで表示できます。

      • インスタンス ID が表示されている場合は、このパラメーターを指定する必要があります。

      • インスタンスに [概要] または ID が生成されない場合は、パラメーターに空の文字列(iotInstanceId = "")を指定します。

    • 接続パラメーターを構成します。

      // クライアントパラメーターを構成します。
      DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret);
      IAcsClient client = new DefaultAcsClient(profile);
    • メッセージのパブリッシュに使用するパラメーターを構成します。

      PubRequest request = new PubRequest();
      request.setIotInstanceId(iotInstanceId);
      request.setQos(0);
      // メッセージのパブリッシュ先の Topic を指定します。
      request.setTopicFullName("/" + productKey + "/" + deviceName + "/user/cloudmsg");
      request.setProductKey(productKey);
      // MessageContent パラメーターを構成します。メッセージの内容は Base64 でエンコードする必要があります。そうしないと、メッセージの内容は文字化けして表示されます。
      request.setMessageContent(Base64.encode("{\"accuracy\":0.001,\"time\":now}")); // {"accuracy": 0.001, "time": now}
      

      この操作を呼び出すときは、ビジネス要件に基づいてパラメーターを構成する必要があります。詳細については、「Pub」をご参照ください。

    • メッセージを送信します。

      try {
           PubResponse response = client.getAcsResponse(request);
           System.out.println("pub success?:" + response.getSuccess()); // パブリッシュ成功?
       } catch (Exception e) {
           System.out.println(e);
       }

      デバイスは次のメッセージを受信します。

      msg = [{"accuracy":0.001,"time":now}] // msg = [{"accuracy": 0.001, "time": now}]

付録: サンプルコード

重要

ビジネス要件に基づいてコードを変更し、パラメーターを指定する必要があります。

Pub/Sub デモをダウンロードします。このデモには、この例のクラウド SDK とデバイス SDK の構成のサンプルコードが含まれています。

AMQP クライアントを IoT Platform に接続する方法については、以下のトピックをご参照ください。