MQTTJava客戶端的使用

百年孤獨111發表於2018-02-28

(mqtt java客戶端整合Spring的參看這篇文章)

Paho Java客戶端是一個用Java編寫的MQTT客戶端庫,用於開發在JVM或其他Java相容平臺(如Android)上執行的應用程式。
Paho Java客戶端提供了兩個API:MqttAsyncClient提供了一個完全非同步的API,通過已註冊的回撥通知完成活動。 MqttClient是MqttAsyncClient的一個同步包裝,其中函式與應用程式同步。

下載

將下面顯示的依賴性定義新增到maven pom檔案中。

最新版本是1.2.0和當前的快照版本1.2.1-SNAPSHOT

<dependencies>
    <dependency>
        <groupId>org.eclipse.paho</groupId>
        <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
        <version>1.2.0</version>
    </dependency>
</dependencies>

入門

基類 介紹
MqttClient 同步呼叫客戶端,使用阻塞方法與MQTT伺服器通訊。
MqttAsyncClient 非同步呼叫客戶端,使用非阻塞方法與MQTT伺服器通訊,允許操作在後臺執行。
MqttClientPersistence 表示永續性資料儲存,用於儲存正在傳輸的出站和入站訊息,從而實現向指定的QoS的傳遞。 可以使用 MqttClient指定此介面的實現,MqttClient將使用該實現來持久儲存QoS為1和2訊息。
MqttConnectOptions 儲存控制客戶端連線到伺服器的方式的選項集,包括使用者名稱、密碼等。
MqttMessage MQTT訊息,儲存應用程式有效負載和指定訊息如何傳遞的選項訊息。

下面包含的程式碼是一個非常基本的示例,它連線到伺服器並使用MqttClient同步API釋出/訂閱訊息。

  • 釋出端
/**
 *釋出端
 */
public class PublishSample {
    public static void main(String[] args) {

        String topic = "mqtt/test";
        String content = "hello 哈哈";
        int qos = 1;
        String broker = "tcp://iot.eclipse.org:1883";
        String userName = "test";
        String password = "test";
        String clientId = "pubClient";
        // 記憶體儲存
        MemoryPersistence persistence = new MemoryPersistence();

        try {
            // 建立客戶端
            MqttClient sampleClient = new MqttClient(broker, clientId, persistence);
            // 建立連結引數
            MqttConnectOptions connOpts = new MqttConnectOptions();
            // 在重新啟動和重新連線時記住狀態
            connOpts.setCleanSession(false);
            // 設定連線的使用者名稱
            connOpts.setUserName(userName);
            connOpts.setPassword(password.toCharArray());
            // 建立連線
            sampleClient.connect(connOpts);
            // 建立訊息
            MqttMessage message = new MqttMessage(content.getBytes());
            // 設定訊息的服務質量
            message.setQos(qos);
            // 釋出訊息
            sampleClient.publish(topic, message);
            // 斷開連線
            sampleClient.disconnect();
            // 關閉客戶端
            sampleClient.close();
        } catch (MqttException me) {
            System.out.println("reason " + me.getReasonCode());
            System.out.println("msg " + me.getMessage());
            System.out.println("loc " + me.getLocalizedMessage());
            System.out.println("cause " + me.getCause());
            System.out.println("excep " + me);
            me.printStackTrace();
        }
    }
}
  • 訂閱端
/**
 *訂閱端
 */
public class SubscribeSample {

    public static void main(String[] args) throws MqttException {   
        String HOST = "tcp://iot.eclipse.org:1883";
        String TOPIC = "mqtt/test";
        int qos = 1;
        String clientid = "subClient";
        String userName = "test";
        String passWord = "test";
        try {
            // host為主機名,test為clientid即連線MQTT的客戶端ID,一般以客戶端唯一識別符號表示,MemoryPersistence設定clientid的儲存形式,預設為以記憶體儲存
            MqttClient client = new MqttClient(HOST, clientid, new MemoryPersistence());
            // MQTT的連線設定
            MqttConnectOptions options = new MqttConnectOptions();
            // 設定是否清空session,這裡如果設定為false表示伺服器會保留客戶端的連線記錄,這裡設定為true表示每次連線到伺服器都以新的身份連線
            options.setCleanSession(true);
            // 設定連線的使用者名稱
            options.setUserName(userName);
            // 設定連線的密碼
            options.setPassword(passWord.toCharArray());
            // 設定超時時間 單位為秒
            options.setConnectionTimeout(10);
            // 設定會話心跳時間 單位為秒 伺服器會每隔1.5*20秒的時間向客戶端傳送個訊息判斷客戶端是否線上,但這個方法並沒有重連的機制
            options.setKeepAliveInterval(20);
            // 設定回撥函式
            client.setCallback(new MqttCallback() {

                public void connectionLost(Throwable cause) {
                    System.out.println("connectionLost");
                }

                public void messageArrived(String topic, MqttMessage message) throws Exception {
                    System.out.println("topic:"+topic);
                    System.out.println("Qos:"+message.getQos());
                    System.out.println("message content:"+new String(message.getPayload()));
                    
                }

                public void deliveryComplete(IMqttDeliveryToken token) {
                    System.out.println("deliveryComplete---------"+ token.isComplete());
                }

            });
            client.connect(options);
            //訂閱訊息
            client.subscribe(TOPIC, qos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

連結


相關文章