酷炫MQTT實現訊息推送

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

MQTT伺服器Mosquitto安裝及使用

MQTT官網

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

MQTTLens外掛的使用

MQTTLens

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

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

這裡寫圖片描述

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

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

這裡寫圖片描述

客戶端接收MQTT訊息

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

paho API

第一步:倒入依賴庫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);//自動重連

以上是一些常用的屬性,更多屬性可以檢視官網:Class MqttConnectOptions API

這裡寫圖片描述

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地址就可以用了。

http://download.csdn.net/detail/github_33304260/9879717

後續會更加精彩,歡迎關注本人部落格以及github
https://github.com/libin7278/ImageLoader 歡迎star

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

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