安卓导入mqtt包基本通信

恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述 安卓导入mqtt包基本通信相关的知识,希望能为你提供帮助。
参考资料: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包基本通信

文章图片

 
首先我们需要找到MQTT通信的java包,导入Android Studio
  下载链接:https://pan.baidu.com/s/1nw39tYp
将包放在工程app/libs下面,然后右击 以包的形式导入。
安卓导入mqtt包基本通信

文章图片

切换工程菜单视图
安卓导入mqtt包基本通信

文章图片

右击加进来的mqtt包,选择 “ as librriary import”
安卓导入mqtt包基本通信

文章图片

弹出来一个文本框,只有一个 “ app” 选择,直接点击"ok"。
2 工程代码2.1 开启权限
切换工程菜单视图
安卓导入mqtt包基本通信

文章图片

 
安卓导入mqtt包基本通信

文章图片

 
< 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 布局文件
添加两个按钮
安卓导入mqtt包基本通信

文章图片

 
< ?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 主代码
安卓导入mqtt包基本通信

文章图片

 
 
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 serverString 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: "); } }; publicvoid 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包基本通信

文章图片

 
 
使用一个mqtt调试助手
安卓导入mqtt包基本通信

文章图片

 
  4 说明1 这个没有断掉重连机制
2 之只是一个最基础版的mqtt测试通信
3 未来加入 二维码扫描
                  动态控件添加
                  各种图标控制
【安卓导入mqtt包基本通信】 

    推荐阅读