このトピックでは、Java用のPaho Message Queuing Telemetry Transport (MQTT) ライブラリを使用してIoT Platformに接続し、通信する方法について説明します。
使用状況ノート
このトピックでは、共通ユーザーの権限を使用してすべての操作を実行します。 管理者権限を必要とする特定の操作を実行する場合は、sudoコマンドを実行します。
前提条件
プロダクトとデバイスは、IoT Platformコンソールで作成されます。 LightSwitchプロパティは、[製品の詳細] ページの [機能の定義] タブで定義します。
開発環境の準備
この例では、開発環境は次のコンポーネントで構成されています。
オペレーティングシステム: Windows 10
Java開発キット (JDK): JDK 8
統合開発環境 (IDE): IntelliJ IDEAコミュニティエディション
Java用のPaho MQTTライブラリをダウンロードする
MQTTプロトコルのバージョンに基づいて、Mavenプロジェクトに依存関係を追加します。
MQTT 3.1および3.1.1
<dependencies> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.0</version> </dependency> </dependencies>MQTT 5.0
<dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.mqttv5.client</artifactId> <version>1.2.5</version> </dependency>
デバイスから IoT Platform への接続
[MqttSign.java] をクリックして、Alibaba Cloudが提供するソースコードを取得します。 ソースコードは、MQTT接続パラメータを取得するために必要です。
MqttSign.javaファイルは、MqttSignクラスを指定します。
構文
クラスMqttSign説明
このクラスを使用すると、MQTT接続パラメーターusername、password、clientidを取得できます。
メンバー
タイプ
メソッド
公共の無効
compute (String productKey, String deviceName, String deviceSecret)productKey、deviceName、およびdeviceSecretパラメーターに基づいて、username、password、およびclientidパラメーターを取得します。
public文字列
getUsername()usernameパラメーターを取得します。
public文字列
getPassword()passwordパラメーターを取得します。
public文字列
getClientid()clientidパラメーターを取得します。
IntelliJ IDEAを開き、プロジェクトを作成します。
MqttSign.javaファイルをプロジェクトにインポートします。
プロジェクトで、デバイスをIoT Platformに接続できるプログラムファイルを追加します。
MqttSign.javaファイルでMqttSignクラスを使用するプログラムを記述する必要があります。 これにより、IoT PlatformへのMQTT接続を確立するために使用されるパラメーターを取得できます。
このセクションでは、接続を確立するための開発手順とサンプルコードを提供します。
MqttSignクラスを使用して、MQTT接続パラメーターを取得します。
文字列productKey = "a1X2bEn ****"; 文字列deviceName = "example1"; 文字列deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y ****"; // MQTT接続パラメータを取得します。 MqttSign sign=新しいMqttSign(); sign.ca (productKey, deviceName, deviceSecret); System.out.println("username: " + sign.getUsername()); System.out.println("password: " + sign.getPassword()); System.out.println("clientid: " + sign.getClientid());IoT Platformに接続するためのPaho MQTTクライアントを作成します。
// デバイスをIoT Platformに接続するために使用するエンドポイントを指定します。 String port = "443"; String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port; // Paho MQTTクライアントを作成します。 MqttClient sampleClient = new MqttClient(broker, sign.getClientid(), persistence); // MQTT接続パラメータを設定します。 MqttConnectOptions connOpts=新しいMqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(180); connOpts.setUserName(sign.getUsername()); connOpts.setPassword(sign.getPassword().toCharArray()); sampleClient.connect(connOpts); System.out.println("ブローカー:" + Broker + "Connected");重要String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;のエンドポイントを変更します。 brokerパラメーターの値は、次の形式である必要があります。"ssl://" + "${デバイスがMQTT経由で接続するIoT Platformインスタンスのエンドポイント}" + ":" + port。パブリックインスタンスおよびEnterprise Editionインスタンスのエンドポイントとエンドポイントの形式の詳細については、「インスタンスのエンドポイントの表示」をご参照ください。
メッセージを公開します。
次のコードは、LightSwitchプロパティを送信する方法を示しています。
// Paho MQTTを使用してメッセージを公開します。 文字列トピック="/sys/" + productKey + "/" + deviceName + "/thing/event/property/post"; String content = "{\" id\":\" 1\"、\" version\":\" 1.0\"、\" params\":{\" LightSwitch\":1}"; MqttMessage message = new MqttMessage(content.getBytes()); message.setQos(0); sampleClient.publish (トピック、メッセージ);MQTT 5.0を使用する場合、次のサンプルコードを追加して、カスタムプロパティを含むメッセージを公開できます。
// MQTT 5.0の新しい機能: カスタムプロパティを作成します。 MqttPropertiesプロパティ=新しいMqttProperties(); リスト <UserProperty> userPropertys = new ArrayList<>(); userPropertys.add (新しいUserProperty("key1","value1")); properties.setUserProperties(userPropertys); // MQTT 5.0の新機能: リクエストとレスポンスのモードを指定します。 properties.setCorrelationData("requestId12345".getBytes()); properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get"); message.setProperties (プロパティ); // デフォルトでは、MQTT 5.0をサポートするPaho SDKはトピックエイリアスを使用します。 sampleClient.publish (トピック、メッセージ);TSLデータの形式については、「デバイスのプロパティ、イベント、およびサービス」をご参照ください。
カスタムトピックを通信に使用する方法については、「トピック」をご参照ください。
トピックを購読して、IoT Platformからメッセージを取得します。
次のコードは、トピックをサブスクライブする方法を示しています。 IoT Platformは、プロパティが送信された後、トピックへの応答メッセージを返します。
クラスMqttPostPropertyMessageListenerがIMqttMessageListenerを実装 { @オーバーライド public void messageArrived(String var1, MqttMessage var2) throws Exception { System.out.println("返信トピック:" + var1); System.out.println("reply payload: " + var2.toString()); } } ... // Paho MQTTを使用してトピックをサブスクライブします。 String topicReply = "/sys/" + productKey + "/" + deviceName + "/thing/event/property/post_reply"; sampleClient.subscribe(topicReply, new MqttPostPropertyMessageListener());
デバイス、サーバー、およびIoT Platformの通信方法については、「デバイス、IoT platform、およびサーバー間の通信の概要」をご参照ください。
アイコンが
されている [プロジェクトの作成] ボタンをクリックして、プロジェクトをコンパイルします。
サンプルコード
サンプルコードを実行して、デバイスをIoT Platformに接続できます。
v3.1.1 demoまたはv5.0 Demoからデモパッケージをダウンロードし、パッケージを解凍します。
IntelliJ IDEAを開き、サンプルプロジェクトaiot-java-demoをデモパッケージにインポートします。
src/main/java/com.aliyun.iotディレクトリで、サンプルデバイス情報をAppまたはMqtt5Appファイルのデバイス情報に置き換えます。
説明MQTT 3.1または3.1.1を使用する場合は、Appファイルのサンプルデバイス情報をデバイス情報に置き換えます。 MQTT 5.0を使用する場合は、Mqtt5Appファイルのサンプルデバイス情報をデバイス情報に置き換えます。
productKey、deviceName、およびdeviceSecretパラメーターのサンプル値をデバイス証明書情報に置き換えます。
String productKey = "${ProductKey}"; 文字列deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}";String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;のエンドポイントを変更します。 詳細については、このトピックの「デバイスをIoT Platformに接続する」セクションの手順4を参照してください。
AppまたはMqtt5Appプログラムを実行します。
次の図は、成功ログを示しています。

IoT Platformコンソールで、デバイスのステータスとログを表示できます。
を選択します。 [デバイス] ページには、デバイスがオンライン状態であることが表示されます。
を選択します。 次に、[クラウド実行ログ] または [デバイスローカルログ] タブをクリックしてログを表示します。 詳細については、「IoT Platformログ」および「ローカルデバイスログ」をご参照ください。
Mqtt5Appプログラムを実行すると、デバイスがログで送信したカスタムプロパティを表示できます。

エラーコード
デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。