1. 程式人生 > >酷炫MQTT實現訊息推送

酷炫MQTT實現訊息推送

首先在實現本功能之前我們需要儲備一下預備知識,大家可以看我的前兩篇文章以及官網,瞭解MQTT的基本常識:
MQTT入門篇

在步入正題之前先給大家發放個福利,介紹一款MQTT外掛:MQTTLens 。

MQTTLens外掛的使用

1.安裝:點選連結進行安裝。

2.輸入以下三個資訊:
connection name : 隨便寫
HostName:寫伺服器地址,如果自己電腦測試,就寫本地地址
client ID : 唯一ID 一般是裝置唯一識別碼

這裡寫圖片描述

3.儲存,使用 。接下來就可以訂閱或者釋出訊息了。

⚠️:訂閱和釋出的標題必須一致!!!

這裡寫圖片描述

客戶端接收MQTT訊息

這裡我們需要用到開源庫 paho,更多paho的接收可以檢視官網:paho官網

第一步:倒入依賴庫PAHO

1.在APP下Gradle中新增:

dependencies {
    compile 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
    compile 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
}

2.在project下Gradle中新增:

repositories {
        maven {
            url "https://repo.eclipse.org/content/repositories/paho-releases/"
} }

第二步:新增許可權

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name
="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />

第三步:開啟服務

在AndroidMainFest.xml中開啟MQTT服務:

    <!-- Mqtt Service -->
    <service android:name="org.eclipse.paho.android.service.MqttService" />

第四步:訂閱器的實現

前面幾步準備工作完成之後我們就可以正式開啟今天的任務。

1.首先建立MqttAndroidClient和MqttConnectOptions,這兩員大將一個是負責連線,一個是複雜屬性設定的:

MqttAndroidClient mqttAndroidClient = new MqttAndroidClient(getApplicationContext(), serverUri, clientId);

MqttConnectOptions mqttConnectOptions = new MqttConnectOptions();

2.然後去設定MqttConnectOptions屬性:

    // 配置MQTT連線
    mqttConnectOptions.setAutomaticReconnect(true);
    mqttConnectOptions.setCleanSession(false);
    mqttConnectOptions.setUserName(null);
    mqttConnectOptions.setPassword(null);
    mqttConnectOptions.setConnectionTimeout(30);  //超時時間
    mqttConnectOptions.setKeepAliveInterval(60); //心跳時間,單位秒
    mqttConnectOptions.setAutomaticReconnect(true);//自動重連

這裡寫圖片描述

3.建立MQTT連線

mqttAndroidClient.connect(mqttConnectOptions);

4.設定監聽

mqttAndroidClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                Log.e(TAG, "reconnect ---> " + reconnect + "       serverURI--->" + serverURI);
            }

            @Override
            public void connectionLost(Throwable cause) {
                Log.e(TAG, "cause ---> " + cause);
            }

            @Override
            public void messageArrived(String topic, MqttMessage message) throws Exception {
                Log.e(TAG, "topic ---> " + topic + "       message--->" + message);
                startNotification(message);
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken token) {
                Log.e(TAG, "token ---> " + token);
            }
        });

5.訂閱訊息

我們在上面connectComplete方法裡面去訂閱訊息

    final String subscriptionTopic = "exampleAndroidTopic";

    private void subscribeToTopic() {
        try {
            mqttAndroidClient.subscribe(subscriptionTopic, 0, null, new IMqttActionListener() {
                @Override
                public void onSuccess(IMqttToken asyncActionToken) {
                    Log.e(TAG, "onFailure ---> " + asyncActionToken);
                }

                @Override
                public void onFailure(IMqttToken asyncActionToken, Throwable exception) {
                    Log.e(TAG, "onFailure ---> " + exception);
                }
            });
        } catch (MqttException e) {
            Log.e(TAG, "subscribeToTopic is error");
            e.printStackTrace();
        }
    }

到這裡大公告成,已經可以接收到傳送的訊息了。
接下來去實現我們的Notification。

Notification通知欄

Notification使用非常簡單,這裡就不詳細介紹,主要見程式碼:

    private NotificationManager notificationManager ;
    private NotificationCompat.Builder notificationBuilder ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initNotification();
    }

    private void initNotification() {
        notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationBuilder = new NotificationCompat.Builder(this);
    }

初始化完成之後我們在上面監聽器的messageArrived方法中去接收訊息。

@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
    Log.e(TAG, "topic ---> " + topic + "       message--->" + message);
    startNotification(message);
}
private void startNotification(MqttMessage message) {
        // params
        Bitmap largeIcon = ((BitmapDrawable) getResources().getDrawable(R.mipmap.ic_launcher_round)).getBitmap();
        String info = message.toString();

        Intent intent = new Intent(MainActivity.this,JumpActivity.class);
        intent.putExtra(MESSAGE,info);

        notificationBuilder.setLargeIcon(largeIcon)
                .setSmallIcon(R.mipmap.ic_launcher_round)
                .setContentTitle("推送訊息啦")
                .setContentText(info)
                .setTicker(info)
                .setContentIntent(PendingIntent.getActivity(MainActivity.this, 0, intent, 0));

        Notification notification = notificationBuilder.getNotification();

        notificationManager.notify(NOTIFICATION_ID, notification);
    }

好啦,就是這麼簡單,記下來讓我們看一下展示效果!

⚠️:切記,地址和埠一定要匹配 不讓玩死也收不到訊息!!!!!!!!!!!!!!!!!!!!!!!!

效果展示

這裡寫圖片描述

DEMO地址 :
大家只需要更換自己的IP地址就可以用了。

掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~
掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~
掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~

公眾號回覆“資料獲取”,獲取更多幹貨哦~