酷炫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);//自动重连
以上是一些常用的属性,更多属性可以查看官网: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
- 点赞
- 收藏
- 关注作者
评论(0)