Android平台上使用MQTT协议实现消息推送功能
MQTT实现消息推送,效果如下
服务端下载地址:http://activemq.apache.org/download-archives.html
jar包地址
百度网盘:https://pan.baidu.com/s/1kVHuta3
CSDN下载:http://download.csdn.net/download/ww897532167/9959431
下载后解压,我使用的是apache-activemq-5.9.1
在bin目录下根据win系统 选择 win32或者win64打开文件夹,然后双击InstallService.bat 完成后双击activemq.bat
然后打开网页:http://127.0.0.1:8161/admin/ 输入账号密码 admin admin
登录成功后 点击Topics可查看已定阅过的主题,点击Connections可查看 有哪些设备连接
实现步骤:
将MQTT连接写在Service中,然后接收到数据后显示通知以及通过发送广播的方式传递数据给Activity中显示
MQTT的连接需要:a).服务器地址及端口 b).客户端ID要求唯一 c).订阅的主题。
写了一个MQTT的服务抽象类,需要使用MQTT时 继承MQTTService即可
public abstract class MQTTService extends Service {//客户端 private static MqttClient mClient; private MqttConnectOptions options; private ScheduledExecutorService scheduler; /** * 设置连接服务器地址和端口 * * @return */ public abstract String getHost(); /** * 设置clientId(客户端ID) * * @return */ public abstract String getClientId(); /** * 订阅的主题 数组 * * @return */ protected abstract String[] getTopics(); /** * 处理服务发来的消息 * * @param topic 主题 * @param message 对应主题发送的消息 */ protected abstract void handleMessage(String topic, String message); @Override public void onCreate() {super.onCreate(); try {mClient = new MqttClient(getHost(), getClientId(), new MemoryPersistence()); //消息的配置参数 options = new MqttConnectOptions(); //是否清除在此以前的消息 options.setCleanSession(true); options.setConnectionTimeout(10); options.setKeepAliveInterval(10); mClient.setCallback(new MqttCallback() {@Override public void connectionLost(Throwable throwable) {//设置重连 reconnect(); }@Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {//处理消息 handleMessage(s, mqttMessage.toString()); }@Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {}}); //连接 connect(); } catch (MqttException e) {e.printStackTrace(); }}/** * 连接 */ private void connect() {if (mClient != null) {if (!mClient.isConnected()) {if (!mClient.isConnected()) {try {mClient.connect(options); //连接 mClient.subscribe(getTopics()); //订阅 } catch (MqttException e) {e.printStackTrace(); }}}}}/** * 重连接 */ private void reconnect() {scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new Runnable() {@Override public void run() {connect(); }}, 0, 5000, TimeUnit.MILLISECONDS); }/** * 发送消息 * * @param topic 主题 * @param message 消息 * @return */ public static boolean sendMessage(String topic, String message) {if (mClient == null) {return false; }if (!mClient.isConnected()) {return false; }MqttTopic temperatureTopic = mClient.getTopic(topic); MqttMessage mqttMessage = new MqttMessage(message.getBytes()); try {temperatureTopic.publish(mqttMessage); } catch (MqttException e) {e.printStackTrace(); return false; }return true; }@Override public void onDestroy() {super.onDestroy(); if (scheduler != null) {scheduler.shutdown(); }if (mClient.isConnected()) {try {mClient.disconnect(); } catch (MqttException e) {e.printStackTrace(); }}} }
然后新建Service 继承于MQTTService
public class MyService extends MQTTService {@Override public String getHost() {return "tcp://10.10.4.21:1883"; }@Override public String getClientId() {UUID uuid = UUID.randomUUID(); String str = uuid.toString(); String uuidStr = str.replace("-", ""); return uuidStr; }@Override protected String[] getTopics() {return new String[]{"topic1", "topic2", "topic3"}; }@Override protected void handleMessage(String topic, String message) {//弹出通知栏 showNotification(topic + ":" + message); //发送广播 Intent intent = new Intent(); intent.putExtra("MQTT",topic + ":" + message); intent.setAction("com.ww.xhu.mqtt"); this.sendBroadcast(intent); }@Nullable @Override public IBinder onBind(Intent intent) {return null; }/** * 显示通知栏 */ private void showNotification(String message) {NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("MQTT")//设置通知栏标题 .setContentText(message)//设置通知栏显示内容 .setNumber(10)//设置通知集合的数量 .setTicker("通知来啦")//通知首次出现在通知栏,带上升动画效果的 .setWhen(System.currentTimeMillis())//通知产生的时间,会在通知信息里显示,一般是系统获取到的时间 .setPriority(Notification.PRIORITY_DEFAULT)//设置该通知优先级 .setAutoCancel(true)//设置这个标志当用户单击面板就可以让通知将自动取消 .setOngoing(false)//ture,设置他为一个正在进行的通知 .setDefaults(Notification.DEFAULT_VIBRATE)//向通知添加声音、闪灯和振动效果的最简单 .setSmallIcon(R.mipmap.ic_launcher);//设置通知小ICON notificationManager.notify(1, mBuilder.build()); } }
在对应的Activity中开启服务 注册广播接收者
public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn_send; private TextView textView; private EditText editText; private MyReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn_send = (Button) findViewById(R.id.btn_send); editText = (EditText) findViewById(R.id.edit_send_message); textView = (TextView) findViewById(R.id.tv_show_message); btn_send.setOnClickListener(this); //开启服务 Intent startIntent = new Intent(MainActivity.this, MyService.class); startService(startIntent); //注册广播接收者 IntentFilter filter = new IntentFilter("com.ww.xhu.mqtt"); receiver = new MyReceiver(); registerReceiver(receiver, filter); }@Override public void onClick(View v) {MyService.sendMessage("topic1", editText.getText().toString()); }public class MyReceiver extends BroadcastReceiver {@Override public void onReceive(Context context, Intent intent) {String message = intent.getStringExtra("MQTT"); textView.setText("收到消息:" + message); }}@Override protected void onDestroy() {//注销广播 unregisterReceiver(receiver); super.onDestroy(); } }
别忘记注册服务
<service android:name=".MyService" />
加上权限
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.VIBRATE"/>//允许访问振动设备
如果连接成功,发送消息却没有显示通知,可以查看应用权限 是否被禁止显示通知栏
连接成功后可在服务端查看 已订阅的主题
以及连接的设备
具体效果就如文章最开始的gif图。
Android平台上使用MQTT协议实现消息推送功能相关推荐
- Android 二维码被扫后接收通知(使用MQTT协议实现消息推送)
现如今扫码付款和收款已经很便利了,比如超市买完东西付款时有两种方式 : 顾客可以出示付款码给收银员扫码收款,也可以由顾客扫描超市的收款码进行付款 .两种方式在付款完成后超市端会进行语音播报收到xx元. ...
- 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务
一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...
- 关于MQTT协议实现消息推送系统
查看全文 http://www.taodudu.cc/news/show-4956774.html 相关文章: 第二十三天:JavaEE规范+Tomcat+Http协议 MMS协议详解 linux版格 ...
- nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能
利用Nodejs怎么实现一个微信小程序消息推送功能 发布时间:2021-01-20 13:55:29 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程 ...
- 友盟消息推送服务器demo,umeng友盟消息推送功能集成
umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: 2.集成步骤如下 下载sdk 注意:有两种sdk如果用户已经集成支付 ...
- 小程序云开发之消息推送功能
小程序云开发之消息推送功能(图文) 一:新建项目 APPID获取方法:1.在微信公众平台上注册账号,选择小程序(也可以从服务号注册,前提你有一个服务号)注册后登录,登录时微信扫码验证一下 2.填写小程 ...
- 云开发实现小程序订阅消息推送功能
步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...
- 微信公众号配置 Token 认证以及消息推送功能
前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...
- php 企业号文本消息推送,Python如何实现微信企业号文本消息推送功能的示例
这篇文章主要介绍了Python编程实现微信企业号文本消息推送功能,结合实例形式分析了Python微信企业号文本消息推送接口的调用相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python微信企业号 ...
最新文章
- java selenium验证元素是否存在
- Python中使用you-get库批量在线下载bilibili视频的教程
- UVA 1646 Edge Case
- 计算机科学和机器学习中的代数学、拓扑学、微积分以及最优化理论
- 在LINUX上配置oracle ASMLib的多路径磁盘
- 美汽车销售商使用RFID汽车,加快销售速度
- arcgis创建剖面线execl文件
- 10_Influxdb+Grafana监控Mysql
- TensorFlow学习记录1-一些比较好的学习资源
- 电子计算机之争的想法,模拟意识的通俗讲解
- 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
- 1. TensorFlow 2.8(2.5\2.6\2.x) GPU windows 安装教程
- Scut游戏server引擎Unity3d访问
- 线性表建立学生信息表
- 深入浅出mysql第三版pdf百度云,工作感悟
- MTK6589反向修改拼包法操作流程
- word||标题序号和标题内容间隔很大
- seems to be corrupted. Trying one more time
- project web architecture
- java排列和组合算法