Paho MQTT for Java ライブラリを使用してデバイスを IoT Platform に接続し、モノモデルを介して通信します。
前提条件
プロダクトとデバイスは、IoT Platformコンソールで作成されます。 LightSwitchプロパティは、[製品の詳細] ページの [機能の定義] タブで定義します。
開発環境の準備
開発環境:
-
オペレーティングシステム: Windows 10
-
JDK: JDK 8
Paho MQTT for Java ライブラリのダウンロード
ご使用の MQTT バージョンに基づいて、Maven プロジェクトに次の依存関係を追加します。
公式サイトにアクセスして最新のライブラリバージョンを確認し、それに応じて version の値を更新してください。
-
MQTT 3.1 および 3.1.1
<dependencies> <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId> <version>1.2.1</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 をクリックして、MQTT 接続パラメーターを計算するためのソースコードを取得します。
MqttSign.java ファイルは MqttSign クラスを定義しています。
-
プロトタイプ:
class MqttSign 説明
このクラスを使用すると、MQTT接続パラメーターusername、password、clientidを取得できます。
-
メンバー:
型
メソッドの説明
public void
calculate(String productKey, String deviceName, String deviceSecret)デバイスの productKey、deviceName、および deviceSecret に基づいて、MQTT 接続パラメーターの username、password、clientid を計算します。
public String
getUsername()MQTT 接続パラメーターの username を取得します。
public String
getPassword()MQTT 接続パラメーターの password を取得します。
public String
getClientid()MQTT 接続パラメーターの clientid を取得します。
-
-
IntelliJ IDEA を開き、プロジェクトを作成します。
-
MqttSign.java ファイルをプロジェクトにインポートします。
-
プロジェクトに、デバイスを IoT Platform に接続するためのプログラムファイルを追加します。
MqttSign.java の MqttSign クラスを呼び出して MQTT 接続パラメーターを計算し、IoT Platform に接続するプログラムを作成します。
開発手順とサンプルコード:
-
MqttSign を呼び出して MQTT 接続パラメーターを計算します。
String productKey = "a1X2bEn****"; String deviceName = "example1"; String deviceSecret = "ga7XA6KdlEeiPXQPpRbAjOZXwG8y****"; // MQTT 接続パラメーターを計算します。 MqttSign sign = new MqttSign(); sign.calculate(productKey, deviceName, deviceSecret); System.out.println("username: " + sign.getUsername()); System.out.println("password: " + sign.getPassword()); System.out.println("clientid: " + sign.getClientid()); -
Paho MQTT クライアントを使用して IoT Platform に接続します。
// 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); // Paho MQTT 接続パラメーター。 MqttConnectOptions connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setKeepAliveInterval(180); connOpts.setUserName(sign.getUsername()); connOpts.setPassword(sign.getPassword().toCharArray()); sampleClient.connect(connOpts); System.out.println("Broker: " + broker + " Connected");重要コード行
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;のエンドポイントを修正してください。brokerの値は"ssl://" + "${お使いのインスタンスの MQTT エンドポイント}" + ":" + portの形式である必要があります。パブリックインスタンスおよびEnterprise Editionインスタンスのエンドポイントとエンドポイントの形式の詳細については、「インスタンスのエンドポイントの表示」をご参照ください。
-
メッセージをパブリッシュします。
モノモデルで定義された LightSwitch プロパティをポストします。
// Paho MQTT を使用してメッセージをパブリッシュします。 String topic = "/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(topic, message);MQTT 5.0 の場合、メッセージをパブリッシュする際にカスタムプロパティを追加します。
// MQTT 5.0 の機能: ユーザー定義プロパティ MqttProperties properties = new MqttProperties(); List<UserProperty> userPropertys = new ArrayList<>(); userPropertys.add(new UserProperty("key1","value1")); properties.setUserProperties(userPropertys); // MQTT 5.0 の機能: リクエスト/レスポンスモード properties.setCorrelationData("requestId12345".getBytes()); properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get"); message.setProperties(properties); // MQTT 5.0 用の Paho SDK は、デフォルトでトピックエイリアスを使用します。 sampleClient.publish(topic, message);モノモデルのデータ形式は「デバイスのプロパティ、イベント、およびサービス」で定義されています。
カスタムトピック通信については、「トピックとは」で説明されています。
-
トピックをサブスクライブして、IoT Platform からのメッセージを受信します。
トピックをサブスクライブして、IoT Platform からのプロパティポストへの応答を受信します。
class MqttPostPropertyMessageListener implements IMqttMessageListener { @Override public void messageArrived(String var1, MqttMessage var2) throws Exception { System.out.println("reply topic : " + 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、およびサーバー間の通信の概要」をご参照ください。
-
-
[Build Project] ボタン
をクリックして、プロジェクトをコンパイルします。
サンプルプロジェクトの実行
ビルド済みのサンプルプロジェクトを使用して、デバイスを IoT Platform に接続します。
-
コードパッケージ (v3.1.1Demo または v5.0Demo) をダウンロードして解凍します。
-
IntelliJ IDEA を開き、解凍したパッケージから aiot-java-demo サンプルプロジェクトをインポートします。
-
pom.xml ファイルで、「Paho MQTT for Java ライブラリのダウンロード」セクションで説明されているように Maven の依存関係のバージョンを更新してください。
重要依存関係のバージョンが利用できない場合は、Maven Central などの公式リポジトリで有効なバージョンを確認してください。
-
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}"; String deviceName = "${DeviceName}"; String deviceSecret = "${DeviceSecret}"; -
「IoT Platform への接続」セクションのステップ 4 で説明されているように、コード行
String broker = "ssl://" + productKey + ".iot-as-mqtt.cn-shanghai.aliyuncs.com" + ":" + port;のエンドポイントを修正してください。
-
-
App または Mqtt5App プログラムを実行します。
成功すると、次のログが表示されます。
username: example1&a1X2bxxx password: 5c9d47198d9d09050043e1f3xxx clientid: a1X2bxxx.example1|timestamp=1576140939022,_v=paho-java-1.0.0,securemode=2,signmethod=hmacsha256| broker: ssl://a1X2bxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com:443 Connected subscribe: /sys/a1X2bxxx/example1/thing/event/property/post_reply publish: {"id":"1","version":"1.0","params":{"LightSwitch":1}} reply topic : /sys/a1X2bxxx/example1/thing/event/property/post_reply reply payload: {"code":200,"data":{},"id":"1","message":"success","method":"thing.event.property.post","version":"1.0"} Disconnected Process finished with exit code 0IoT Platform コンソールにログインして、インスタンス内のデバイスのステータスとログを確認します。
エラーコード
デバイスがIoT PlatformへのMQTT接続を確立できない場合は、エラーコードに基づいて問題をトラブルシューティングできます。 詳細については、「トラブルシューティング」をご参照ください。