基于paho在android平台上实现MQTT Client间的简单通信

在之前的博文中,对MQTT和paho进行了简单的描述。paho为实现MQTT通信提供了接口。本篇将在android平台上,基于paho实现MQTT Client间的简单通信。broker选择公共的mosquitto broker.

(0)权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

没有权限,寸步难行!

(1)引入paho lib

这里写图片描述

(2)Connection Options

paho通过MqttConnectOptions类,对broker与client间的连接进行需求设置。
例如,UserName和Password(不是所有client都可以连接某一broker,但如果无登录配置,则不用设置),Timeout时间,断开后是否自动连接,是否保留客户端的连接记录等。

private MqttConnectOptions initMqttConnectionOptions(){
    MqttConnectOptions mOptions =new MqttConnectOptions();
    mOptions.setAutomaticReconnect(false);//断开后,是否自动连接
    mOptions.setCleanSession(true);//是否清空客户端的连接记录。若为true,则断开后,broker将自动清除该客户端连接信息
    mOptions.setConnectionTimeout(60);//设置超时时间,单位为秒
    mOptions.setUserName("Admin");//设置用户名。跟Client ID不同。用户名可以看做权限等级
    mOptions.setPassword("Admin");//设置登录密码
    mOptions.setKeepAliveInterval(60);//心跳时间,单位为秒。即多长时间确认一次Client端是否在线
    mOptions.setMaxInflight(10);//允许同时发送几条消息(未收到broker确认信息)
    mOptions.setMqttVersion(MqttConnectOptions.MQTT_VERSION_3_1_1);//选择MQTT版本
    return mOptions;
}

(3)设置回调函数

MqttCallbackExtended mqttCallback=new MqttCallbackExtended() {
    @Override
    public void connectComplete(boolean reconnect, String serverURI) {
        Log.i(TAG, "connect Complete" + Thread.currentThread().getId());
    }

    @Override
    public void connectionLost(Throwable cause) {
        Log.i(TAG, "connection Lost ");
    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        if(topic.equalsIgnoreCase("subscribe topic1")){
            Log.i(TAG, "messageArrived: "+new String(message.getPayload()));
            Message msg=new Message();
            Bundle bindle=new Bundle();
            bindle.putString("Content",new String(message.getPayload()));
            msg.what=MSG_TYPE_TO_B;
            msg.setData(bindle);
            mHandler.sendMessage(msg);
        }
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        Log.i(TAG, "delivery Complete ");//即服务器成功delivery消息
    }

};

注:需要说明的是,不能在四个回调函数中进行UI操作。该回调函数在子线程中被调用。若掺杂UI操作,会引起MQTT连接断开,触发connectionLost回调函数。

(4)MQTT Client

mClient=initClient("tcp://test.mosquitto.org:1883","ClientA",mqttCallback,mOptions,new String[]{"topic1","topic2","topic3"});
private MqttClient initClient(String serverURI, String clientId,MqttCallback callback, MqttConnectOptions options,String[] subscribeTopics){
    MqttClient client=null;
    try {
        MemoryPersistence persistence = new MemoryPersistence();
        client=new MqttClient(serverURI,clientId,persistence);
        client.setCallback(callback);//设置回调函数
        client.connect(options);//连接broker
        client.subscribe(subscribeTopics);//设置监听的topic
    } catch (MqttException e) {
        e.printStackTrace();
    }
    return client;
}

创建Client时,需要指明:
(a)broker的URL:tcp://test.mosquitto.org:1883,即消息的中转站在哪儿。
(b)Client的ID:ClientA,即告诉broker我是谁。
(c)MemoryPersistence:用于存储两种消息(可以设置为null,但与消息的发送质量有关。建议进行设置)。
(c.1)client尚未接收完毕的消息。
(c.2)client已发送完毕,但尚未得到broker确认的消息。
(d)Client的回调函数:mqttCallback,即如果连接成功,连接断开,消息发送成功,或接收到新的消息,该如何处理。
(e)Client的连接需求:mOptions,即对连接的设置。
(f)Client所监听的Topic:new String[]{“topic1”,”topic2”,”topic3”},即仅接收以上topic信息。

(6)发送消息

MqttMessage msg=new MqttMessage();
String msgStr="Hello World";
msg.setPayload(msgStr.getBytes());//设置消息内容
msg.setQos(2);//设置消息发送质量,可为0,1,2.
msg.setRetained(false);//服务器是否保存最后一条消息,若保存,client再次上线时,将再次受到上次发送的最后一条消息。
mClient.publish("my topic",msg);//设置消息的topic,并发送。

这里需要对发送质量进行再次说明。
(0)level0,最多一次的传输。不管消息是否到达broker,只要发出,client不再关心。
(1)level1,至少一次的传输。若消息到达broker,broker会回复client一个PUBACK消息,若未收到该回复消息,或超时,client将再次发送,直至收到broker响应。
(2)level2,这是最高级别的传输。在level1的基础上,保证重复消息不会被二次接收。

注:若想清空服务器保存的最后一条消息,可发送0字节的payload,对服务器进行清空。

(7)断开与broker的连接

try {
    if(mClient!=null){
        mClient.disconnect();
    }
} catch (MqttException e) {
    e.printStackTrace();
}

更多详情,可在paho官方文档中查找。
https://www.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/com.ibm.mq.javadoc.doc/WMQMQxrClasses/overview-summary.html

Demo实现效果
创建两个client,A和B,A监听TopicB,B监听TopicA,实现对话。效果如下:
这里写图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值