参考资料:http://blog.csdn.net/qq_17250009/article/details/52774472

MQTT官网:http://mqtt.org/

MQTT介绍:http://www.ibm.com

MQTT Android github:https://github.com/eclipse/paho.mqtt.android

MQTT API:http://www.eclipse.org/paho/files/javadoc/index.html

MQTT Android API: http://www.eclipse.org/paho/files/android-javadoc/index.html

1下载mqtt包,导入工程

新建一个空安卓工程

首先我们需要找到MQTT通信的java包,导入Android Studio

下载链接:https://pan.baidu.com/s/1nw39tYp

将包放在工程app/libs下面,然后右击 以包的形式导入。

切换工程菜单视图

右击加进来的mqtt包,选择 “as librriary import”

弹出来一个文本框,只有一个 “app”选择,直接点击"ok"。

2 工程代码

2.1 开启权限

切换工程菜单视图

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

  2.2 布局文件

添加两个按钮

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"/> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="connect"/> <Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="send"/> </LinearLayout>

  

2.3 主代码

package com.espressif.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle; import android.os.Handler;
import android.os.Message; import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import java.util.concurrent.ScheduledExecutorService; public class MainActivity extends AppCompatActivity {
public String TAG="MyTAG";
//private String host = "tcp://内网ip:服务器端口号";
private String host = "tcp://www.dongvdong.top:1883"; // ip:端口号www.dongvdong.top:1883http://www.dongvdong.top:1883/
private String userName = "dongdong";
private String passWord = "dongdong";
private String clientId="AndroidClient1";
private int i = 1;
private MqttClient client;
private String myTopic = "test/key1";
private MqttConnectOptions options;
private ScheduledExecutorService scheduler;
public Handler handler; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
Toast.makeText(MainActivity.this,"Success",Toast.LENGTH_SHORT).show();
try {
client.subscribe(myTopic, 1);
} catch (Exception e) {
e.printStackTrace();
}
}else if(msg.what==2){
Toast.makeText(MainActivity.this,"fail",Toast.LENGTH_SHORT).show();
}else if(msg.what==3){
Toast.makeText(MainActivity.this,(String)msg.obj,Toast.LENGTH_SHORT).show();
Log.d(TAG, "handleMessage");
}
}
};
Button button1=(Button)findViewById(R.id.button1);
Button button2=(Button)findViewById(R.id.button2);
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
class MyThread extends Thread{
@Override
public void run(){
init();
try {
client.connect(options);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);//连接成功 } catch (Exception e) {
e.printStackTrace();
Message msg = new Message();
msg.what = 2;
handler.sendMessage(msg);
//连接失败
}
}
}
new MyThread().start();
}
});
button2.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){ publish("on");
}
});
}
private void init() {
try {
//host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(host, clientId,
new MemoryPersistence());
//MQTT的连接设置
options = new MqttConnectOptions();
//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
//设置连接的用户名
options.setUserName(userName);
//设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//设置回调
client.setCallback(mqttCallback);
} catch (Exception e) {
e.printStackTrace();
}
}
private MqttCallback mqttCallback = new MqttCallback() { @Override
public void messageArrived(String topic, MqttMessage message) throws Exception {//This method is called when a message arrives from the server String str1 = new String(message.getPayload());
Log.d(TAG, "messageArrived: "+str1);
Message msg=new Message();
msg.what=3;
msg.obj=str1;
handler.sendMessage(msg);
} @Override
public void deliveryComplete(IMqttDeliveryToken arg0) {
//Called when delivery for a message has been completed
} @Override
public void connectionLost(Throwable arg0) {
// This method is called when the connection to the server is lost.
Log.d(TAG, "connectionLost: ");
}
};
public void publish(String msg){
String topic = myTopic;
Integer qos = 0;
Boolean retained = false;
try {
client.publish(topic, msg.getBytes(), qos.intValue(), retained.booleanValue());
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
try {
scheduler.shutdown();
client.disconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
}

  3 运行结果

自己发送话题,自己订阅自己

使用一个mqtt调试助手

4 说明

1 这个没有断掉重连机制

2 之只是一个最基础版的mqtt测试通信

3 未来加入 二维码扫描

动态控件添加

各种图标控制

(1) 安卓导入mqtt包基本通信的更多相关文章

  1. 安卓studio导入jra包和so包,百度地图so包加载

    导入so包 这个我只接受测试可用的一种方法 第一步:把so包放在libs目录下,可以是文件夹也可以是单独的一个个so文件 然后在src同级的目录下找到build.gradle文件下如下信息 sourc ...

  2. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  3. Android Studio项目导入aar包报错

    最近在试着接入TrPay的sdk,根据它家文档需要导入它们的aar包(paysdk-release-1.2.2.aar). 在AS中怎么给安卓项目导入aar包,网上搜一下就能看到无非也就下面三步: 1 ...

  4. Android Studio安卓导出aar包与Unity 3D交互

    Unity与安卓aar 包交互 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  5. Adroid我还是个菜鸟——导入jar包

    AndroidStudio怎样导入jar包 原文地址:http://jingyan.baidu.com/article/e6c8503c7190b7e54f1a1893.html AndroidStu ...

  6. maven向本地仓库导入jar包(处理官网没有的jar包)

    对于官网没有的jar包,maven向本地仓库导入jar包用如下命令 mvn install:install-file -DgroupId=包名 -DartifactId=项目名 -Dversion=版 ...

  7. 分析-eclipse已经导入jar包了,但还是出现classNotFound异常

    场景:分析-eclipse已经导入jar包了,但还是出现classNotFound异常 分析--eclipse已经导入jar包了,但还是出现classNotFound错误 最近在做一个web项目时,由 ...

  8. Spring环境搭建之:导入jar包、配置文件名称及放置位置

    Spring环境搭建之:导入jar包.配置文件名称及放置位置 现在项目开发中spring框架应用的还是比较多的,自己用的还不太熟练,每次用的时候总配置半天,总有些配置弄错,就找个时间总结以下,方便以后 ...

  9. ssh整合,导入structs包后报错 getAnnotation(AnnotatedElement ae,Class<T> annotatetype)找不到

    今天在整合ssh(spring-framework-3.2.5.RELEASE-dist+struts-2.3.15.3-all+hibernate-release-4.2.6.Final)环境的时候 ...

随机推荐

  1. angular ng-file-upload

    传送门:https://github.com/danialfarid/ng-file-upload#install <script src="angular(.min).js" ...

  2. CSS选择器:子选择符号

    <html> <head> <style type="text/css"> .class>h2{color:red} </style ...

  3. Javascript 对象 - 字符串对象

    字符串对象 字符串对象是JavaScript中比较常见的一种基本数据类型,他封装了一个字符串,并且提供了相应的方法.例如连接字符串.取字符串.分割字符串等.JavaScript中字符串是不可变的,原始 ...

  4. 算法:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    算法:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.<剑指offer> 利用栈来进行操作,代码注释写的比较清楚:首先判断两个栈是否是空的:其次当栈二 ...

  5. Ubuntu16.04下postgresql-10

      这里使用源码安装的方式进行: Linux版本:ubuntu16.04 PostgresSQL版本:postgresql-10.3 在PostgreSQL官网下载地址:https://www.pos ...

  6. gitlab汉化

    是上一片,我已经介绍了,如何安装gitlab 这篇文章讲解一下如何安装使用汉化gitlab 如需要查看如何安装gitlab,请访问:https://www.cnblogs.com/ws17345067 ...

  7. mysql之数据备份与恢复

    本文内容: 复制文件法 利用mysqldump 利用select into outfile 其它(列举但不介绍) 首发日期:2018-04-19 有些时候,在备份之前要先做flush tables , ...

  8. js验证码实现

    <script language="javascript"> var code; //在全局 定义验证码 function createCode() { //创建验证码 ...

  9. java应用系统运行速度慢的解决方法

    场景:我们在部署了TOMCAT应用,刚刚开始启动的一个段时间内.访问系统的速度比较快.但是过了一段时间,应用系统就慢慢的变慢起来了.服务的访问加载时间慢慢变长. 问题解决思路: 1,查看部署应用系统的 ...

  10. 关于C#List中FindAll用法的一些简单示例

    using System; using System.Collections.Generic; public partial class List : System.Web.UI.Page { pro ...