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协议实现消息推送功能相关推荐

  1. Android 二维码被扫后接收通知(使用MQTT协议实现消息推送)

    现如今扫码付款和收款已经很便利了,比如超市买完东西付款时有两种方式 : 顾客可以出示付款码给收银员扫码收款,也可以由顾客扫描超市的收款码进行付款 .两种方式在付款完成后超市端会进行语音播报收到xx元. ...

  2. 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  3. 关于MQTT协议实现消息推送系统

    查看全文 http://www.taodudu.cc/news/show-4956774.html 相关文章: 第二十三天:JavaEE规范+Tomcat+Http协议 MMS协议详解 linux版格 ...

  4. nodejs android 推送,利用Nodejs怎么实现一个微信小程序消息推送功能

    利用Nodejs怎么实现一个微信小程序消息推送功能 发布时间:2021-01-20 13:55:29 来源:亿速云 阅读:92 作者:Leah 今天就跟大家聊聊有关利用Nodejs怎么实现一个微信小程 ...

  5. 友盟消息推送服务器demo,umeng友盟消息推送功能集成

    umeng友盟消息推送功能集成(本人使用的是eclipse开发) 1.首先请自行观看友盟消息推送集成的API文档. 观看地址如下: 2.集成步骤如下 下载sdk 注意:有两种sdk如果用户已经集成支付 ...

  6. 小程序云开发之消息推送功能

    小程序云开发之消息推送功能(图文) 一:新建项目 APPID获取方法:1.在微信公众平台上注册账号,选择小程序(也可以从服务号注册,前提你有一个服务号)注册后登录,登录时微信扫码验证一下 2.填写小程 ...

  7. 云开发实现小程序订阅消息推送功能

    步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...

  8. 微信公众号配置 Token 认证以及消息推送功能

    前言 公众号服务配置 Token认证 如何配置 Token 认证接口 公众号获取网页授权及用户信息 导向 网页授权 关注后消息触发授权 公众号推送模板消息 模板消息功能插件 推送模版消息接口介绍 获取 ...

  9. php 企业号文本消息推送,Python如何实现微信企业号文本消息推送功能的示例

    这篇文章主要介绍了Python编程实现微信企业号文本消息推送功能,结合实例形式分析了Python微信企业号文本消息推送接口的调用相关操作技巧,需要的朋友可以参考下 本文实例讲述了Python微信企业号 ...

最新文章

  1. java selenium验证元素是否存在
  2. Python中使用you-get库批量在线下载bilibili视频的教程
  3. UVA 1646 Edge Case
  4. 计算机科学和机器学习中的代数学、拓扑学、微积分以及最优化理论
  5. 在LINUX上配置oracle ASMLib的多路径磁盘
  6. 美汽车销售商使用RFID汽车,加快销售速度
  7. arcgis创建剖面线execl文件
  8. 10_Influxdb+Grafana监控Mysql
  9. TensorFlow学习记录1-一些比较好的学习资源
  10. 电子计算机之争的想法,模拟意识的通俗讲解
  11. 对长度为200的有序表进行二分查找_程序员常用的查找算法(顺序、二分、插值、分块、斐波那契)...
  12. 1. TensorFlow 2.8(2.5\2.6\2.x) GPU windows 安装教程
  13. Scut游戏server引擎Unity3d访问
  14. 线性表建立学生信息表
  15. 深入浅出mysql第三版pdf百度云,工作感悟
  16. MTK6589反向修改拼包法操作流程
  17. word||标题序号和标题内容间隔很大
  18. seems to be corrupted. Trying one more time
  19. project web architecture
  20. java排列和组合算法

热门文章

  1. 视觉无人机进行高速公路违章检测—高速公路交通法规之应急车道
  2. java ajax刷新,javaweb ajax刷新
  3. 来自于电报群对David Cao的在线访谈 !
  4. 3DMAX2020安装卸载教程
  5. 尴尬!买了几台华为路由器却不会配置~看完就会了
  6. 如何利用solidworks、CAD对平面图进行标号
  7. 财路网每日原创推送:区块链3.0时代:资产上链将助攻实体经济未来?
  8. 100天精通Python丨基础知识篇 —— 05、7大基础数据类型详解(变量、列表、集合、字典、元组)
  9. PyQt5GUI快速编程学习
  10. java狐狸游戏_Java继承