制作一个基于MQTT协议简易的网络调试助手(AndroidStudio编译)
MQTT库在GitHub的地址:https://github.com/eclipse/paho.mqtt.android.git
添加MQTT库
第一步:找到项目目录下的gradle文件,添加以下代码
repositories {
maven {
url "https://repo.eclipse.org/content/repositories/paho-snapshots/"
}
}
第二步:在APP模块下的gradle文件下添加以下代码
dependencies {
implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'
}
第三步:在AndroidManifest.xml文件加上MQTT所依赖的服务和权限: 添加服务
<service android:name="org.eclipse.paho.android.service.MqttService"/>
添加权限
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
第四步,将MQTT库源文件中的org.eclipse.paho.android.service文件夹复制进你的项目文件夹根目录
开始你的代码
一、建立布局
1、在layout文件夹下建立名为mqtttest的布局文件,将各个控件拖入并命名如下:
需要注意的是,布局中除了启动客户端的Button以外,其余控件都设可视性设为不可视(在每个控件的代码处加上android:visibility=“invisible”)
2、在layout文件夹下新建xml文件,命名为dialog,布局如下(注意,必须使用LinearLayout布局):
二、编写java文件
本文章将按照实现单击按钮事件的顺序来编写,流程图如下
1、启动客户端的单击事件
public void start1(){
if(num == 0) {
// 创建对话框构建器
AlertDialog.Builder builder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT);
// 获取布局
View view1 = View.inflate(MQTTtest.this, R.layout.dialog, null);
// 获取布局中的控件
final EditText editText_ip = (EditText) view1.findViewById(R.id.ip);
final EditText editText_port = (EditText) view1.findViewById(R.id.port);
final Button cancel = (Button) view1.findViewById(R.id.cancel);
final EditText username = (EditText) view1.findViewById(R.id.user);
final EditText password = (EditText) view1.findViewById(R.id.password);
final Button login = (Button) view1.findViewById(R.id.login);
// 设置参数
builder.setTitle("LOGIN").setView(view1);
// 创建对话框
final AlertDialog alertDialog = builder.create();
alertDialog.show();
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
alertDialog.dismiss();
Toast.makeText(MQTTtest.this, "取消连接服务器", Toast.LENGTH_SHORT).show();
}
});
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ip = editText_ip.getText().toString().trim();
port = editText_port.getText().toString().trim();
uname = username.getText().toString().trim();
psd = password.getText().toString().trim();
connect();
alertDialog.dismiss();
Toast.makeText(MQTTtest.this, "尝试连接", Toast.LENGTH_SHORT).show();
num = num + 1;
start.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.VISIBLE);
}
});
}else {
connectServer();
start.setVisibility(View.INVISIBLE);
progressBar.setVisibility(View.VISIBLE);
}
}
2、dialog界面login按钮对应的单击事件
private void connect() {
//第一个参数上下文,第二个服务器地址,注意下面的格式!!!! 第三个是 客户端ID,注意 必须唯一,如果存在此ID连接了服务器。那么连接失败!
client = new MqttAndroidClient(this, "tcp://"+ip+":"+port,AndroidID);
//配置连接信息
mqttConnectOptions=new MqttConnectOptions();
//是否清除缓存
mqttConnectOptions.setCleanSession(true);
//是否重连
mqttConnectOptions.setAutomaticReconnect(true);
//设置心跳,30s
mqttConnectOptions.setKeepAliveInterval(30);
if(!uname.equals("")&&!psd.equals("")){
//登陆的名字,根据服务器要求,一般不用写
mqttConnectOptions.setUserName(uname);
//登陆的密码,
mqttConnectOptions.setPassword(psd.toCharArray());
}
//超时时间
mqttConnectOptions.setConnectionTimeout