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

标签: | 发表时间:2018-09-15 11:21 | 作者:
出处:https://blog.csdn.net

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

(0)权限

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

没有权限,寸步难行!

(1)引入paho lib

这里写图片描述

(2)Connection Options

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

      privateMqttConnectOptionsinitMqttConnectionOptions(){
    MqttConnectOptions mOptions =newMqttConnectOptions();
    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版本returnmOptions;
}

(3)设置回调函数

      MqttCallbackExtended mqttCallback=newMqttCallbackExtended() {@OverridepublicvoidconnectComplete(booleanreconnect, String serverURI) {
        Log.i(TAG,"connect Complete"+ Thread.currentThread().getId());
    }@OverridepublicvoidconnectionLost(Throwable cause) {
        Log.i(TAG,"connection Lost ");
    }@OverridepublicvoidmessageArrived(String topic, MqttMessage message)throwsException {if(topic.equalsIgnoreCase("subscribe topic1")){
            Log.i(TAG,"messageArrived: "+newString(message.getPayload()));
            Message msg=newMessage();
            Bundle bindle=newBundle();
            bindle.putString("Content",newString(message.getPayload()));
            msg.what=MSG_TYPE_TO_B;
            msg.setData(bindle);
            mHandler.sendMessage(msg);
        }
    }@OverridepublicvoiddeliveryComplete(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,newString[]{"topic1","topic2","topic3"});
      privateMqttClient initClient(String serverURI, String clientId,MqttCallback callback, MqttConnectOptions options,String[] subscribeTopics){
    MqttClientclient=null;try{
        MemoryPersistence persistence =newMemoryPersistence();client=newMqttClient(serverURI,clientId,persistence);client.setCallback(callback);//设置回调函数client.connect(options);//连接brokerclient.subscribe(subscribeTopics);//设置监听的topic}catch(MqttException e) {
        e.printStackTrace();
    }returnclient;
}

创建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=newMqttMessage();StringmsgStr="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,实现对话。效果如下:
这里写图片描述

相关 [paho android 平台] 推荐:

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

- -
在之前的博文中,对MQTT和paho进行了简单的描述. paho为实现MQTT通信提供了接口. 本篇将在android平台上,基于paho实现MQTT Client间的简单通信. broker选择公共的mosquitto broker.. paho通过MqttConnectOptions类,对broker与client间的连接进行需求设置.

Android平台遗弃史

- fyits0 - Solidot
Google上周宣布了Android 4.0 Ice Cream Sandwich和Galaxy Nexus. 对第一代Nexus One用户来说,坏消息是他们的手机不能升级到ICS. 然而相比其它Android用户,他们则要幸运得多. Michael Degusta制作了一幅示意图,显示大部分Android手机运行的系统都较陈旧,远落后于最新版本,而且一到二年之后就不再有官方更新了.

Android 4.0平台交互简析

- Shark - 互联网的那点事
Android4.0继承了3.0的设计多任务、丰富的通知、可定制的主界面、可调整大小的控件、用于交互和分享的互动性元素. 应用程序的结构日趋成熟,几乎没有发生变化,看看系统主要界面是如何体现其设计目标:简洁、美观和更为智能. 从解锁界面可以看出,4.0使用视觉化元素引导用户进行简单直观的手势操作,精致的动画和反馈增加了系统的互动参与感和趣味性,全新的字体提高了高分辨率界面的可读性,显得更为优雅和现代.

DroidVPN-Android平台的VPN应用软件

- - 无名小卒
       DroidVPN是一款在Android平台的VPN应用,可以解除封锁地区的互联网限制和匿名浏览网页,用户可以实现在手机和平板电脑上玩穿越,使用DroidVPN高级服务可能需要付费. 需要注意的是这个程序的apk文件只运行在有root的安卓设备上. 1、给你无限制的速度,但是有流量限制.

Mifare Classic Tool (MCT),Android平台RFID工具

- - FreebuF.COM
最近逛国外坛子的时候发现一新RFID神器,把介绍翻一下. Mifare Classic Tool (MCT) - 一款用来读取/编辑/分析Mifare Classic卡片的安卓软件. 大家好, 这几个月我开发了一款安卓NFC工具, 希望大家用的高兴, 同时希望大家能在github 上一同完善这款工具.

android平台消息推送机制

- - ITeye博客
方案1、使用GCM服务(Google Cloud Messaging). 简介:Google推出的云消息服务,即第二代的G2DM. 优点:Google提供的服务、原生、简单,无需实现和部署服务端. 缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google.

Android平台漏洞挖掘与利用

- - 外刊IT评论
由于Android平台特殊的生态,每一个Android设备中存在着Google、手机开发商、芯片厂商等多种来源的软件. 每个软件模块没有统一的安全审计制度和测试流程,导致质量良莠不齐,对于安全研究者乃至于恶意攻击者来说,一直是一个比较好的目标. 从安全的角度考虑, Android平台利用Linux的uid特性把权限做了很好的区隔,使得在App层级,权限比较受限,一方面阻隔了许多恶意软件可能造成的破坏,另一方面也限缩了用户能够掌控自己设备的能力.

开发者应如何看待iOS平台和Android平台

- Xiujun Ma - 36氪
随着智能手机和应用的发展,通过开发App变成百万富翁的新闻已经屡见不鲜,那么对于还没有加入进来的开发者或创业者,应如何看待iOS平台和Android平台呢. Dan Frommer给出了以下建议:. 1、如果你做免费的手机应用,那么2个平台一起开发. 至少目前应该如此,Android市场太大以致于你不可能忽略掉它,但同时它又没大到你可以作为你唯一的平台,你可能要考虑到支持多个Android应用商店,比如亚马逊的.

研究称Android是最不开放的开源移动平台

- geek2live - Solidot
市场研究公司VisionMobile受欧盟资助,根据开放式管理、包容性、透明度和源代码易于访问等量化和评估八大开源项目的开放程度. 研究报告(需要输入电邮)称,Google的Android是最不开放的开源移动平台. 八个项目从低到高的排名是Android(23%)、Qt(58%)、Symbian(58%,基于闭源前的管理模式)、MeeGo(61%)、Mozilla(65%)、WebKit(68%)、Linux(71%)和Eclipse(84%).

Qik 升级:让 Android 和 iOS 跨平台视频聊天

- zeng - 爱范儿 · Beats of Bits
Qik 原本是一个视频分享服务,最大的特点是可以一边拍摄一边上传,玩现场直播. 后来这个团队被 Skype 收购,想把它做成一个跟 Skype 略微不同的聊天服务. 今天,基于 Android 版本的 Qik 终于升级到新版,获得了跟 iOS 版本一样的功能. 最低安装要求是 Android 2.1 ,它能利用手机的摄像头(前置后置皆可),实时拍摄和分享,或者进行跨平台视频聊天.