MQTT协议实现Android消息推送

来源:互联网 发布:linux系统自启动脚本 编辑:程序博客网 时间:2024/05/21 19:30

MQTT协议是订阅/发布协议,使用中间件将消息转发,中间件服务器有很多,这里我们使用mosquitto

1、下载安装mosquitto

双击安装程序,安装一般安装过程安装即可,安装完成后可以测试服务。

2、测试服务   简单使用mosquitto

2.1启动服务       打开命令行窗口,进入到mosquitto的安装目录,执行mosquitto.exe启动服务

2.2订阅主题    执行 mosquitto_sub -v -t test
    【-t】指定主题,此处为test
    【-v】打印更多的调试信息
2.3发布内容  另外打开一个命令行窗口 执行 mosquitto_pub -ttest  -m helloworld
    【-t】指定主题            test
    【-m】指定消息内容   helloworld
在发布窗口回车之后就会在订阅窗口接收到消息,sensor 12  这就是mosquitto的简单使用

3.代码实现消息推送

在Android Studio中创建测试Module

导入jar包org.eclipse.paho.client.mqttv3-1.0.1.jar

创建布局文件,有两个按钮,一个发布一个接受,一个文本框填写发布内容

主要代码:

    private EditText content;    private MqttClient  sampleClient = null;    private  String[] topicFilters = {"test1", "test2"};//发布或订阅主题,(我要发布或订阅什么消息)    private String broker = "tcp://172.19.137.140:1883";//服务器地址及端口 就是自己的IP(我要去哪里订阅消息)    private  String clientId = "paho1352798577649702";//客户端ID  就是用这个来标识客户端在服务器上的唯一(是谁在服务器上发布或订阅消息)    private  MemoryPersistence persistence = new MemoryPersistence();    private  MqttConnectOptions connOpts = new MqttConnectOptions();//连接配置    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button publish = (Button) findViewById(R.id.publish);        Button receive = (Button) findViewById(R.id.receive);        content = (EditText) findViewById(R.id.content);        try {            //创建客户端            sampleClient = new MqttClient(broker, clientId, persistence);            connOpts.setCleanSession(false);            //连接服务器            sampleClient.connect(connOpts);        } catch (MqttException e) {            e.printStackTrace();        }        publish.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try {                    //创建要发布的消息                    MqttMessage message = new MqttMessage(content.getText().toString().trim().getBytes());                    message.setQos(1);                    //发布消息                    sampleClient.publish("test1", message);                } catch (MqttException me) {                    System.out.println("reason " + me.getReasonCode());                    System.out.println("msg " + me.getMessage());                    System.out.println("loc " + me.getLocalizedMessage());                    System.out.println("cause " + me.getCause());                    System.out.println("excep " + me);                    me.printStackTrace();                }            }        });        receive.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try {                    //获取消息回调                    sampleClient.setCallback(new MyCallBack());                    //订阅消息                    sampleClient.subscribe(topicFilters, new int[]{1, 1});                } catch (MqttException me) {                    System.out.println("reason " + me.getReasonCode());                    System.out.println("msg " + me.getMessage());                    System.out.println("loc " + me.getLocalizedMessage());                    System.out.println("cause " + me.getCause());                    System.out.println("excep " + me);                    me.printStackTrace();                }            }        });    }
回调消息的处理:

 class  MyCallBack implements MqttCallback{        @Override        public void messageArrived(String arg0, MqttMessage arg1) throws Exception {            System.out.println("MqttMessage:" + arg1.toString());            Message message = new Message();            Bundle bundle = new Bundle();            bundle.putString("content", arg1.toString());            message.setData(bundle);            handler.sendMessage(message);        }        @Override        public void deliveryComplete(IMqttDeliveryToken arg0) {        }        @Override        public void connectionLost(Throwable arg0) {        }    }

详细代码







0 0
原创粉丝点击