酷炫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地址就可以用了。
掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~
掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~
掃碼關注公眾號“偉大程式猿的誕生“,更多幹貨等著你~
公眾號回覆“資料獲取”,獲取更多幹貨哦~