安卓开发4-MQTT环境搭建
1.搭建好安卓环境
略
2.打开一个已经创建好的工程,分别修改下面3个文件
2.1.AndroidManifest.xml 添加权限
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- Permissions the Application Requires --><uses-permission android:name="android.permission.WAKE_LOCK" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" />
2.2.build.gradle 添加依赖
// MQTT dependenciesimplementation("org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0")implementation("org.eclipse.paho:org.eclipse.paho.android.service:1.1.1")implementation("androidx.legacy:legacy-support-v4:1.0.0")
2.3.build.gradle 添加支持
android.enableJetifier=true
3.修改主程序 .java
package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;//MQTT需要导入的包
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;public class MainActivity extends AppCompatActivity implements View.OnClickListener {
//public class MainActivity extends AppCompatActivity {private String serverUri = "tcp://127.0.0.1:1883"; //这里可以填上各种云平台的物联网云平的域名+1883端口号,什么阿里云腾讯云百度云天工物接入都可以,// 这里我填的是我在我的阿里云服务器上搭建的EMQ平台的地址,// 注意:前缀“tcp://”不可少,之前我没写,怎么都连不上,折腾了好久private String userName = "android"; //然后是你的用户名,阿里云腾讯云百度云天工物接入这些平台你新建设备后就自动生成了private String passWord = "1234567"; //用户名对应的密码,同样各种云平台都会对应生成密码,这里我的EMQ平台没做限制,所以用户名和密码可以随便填写private String clientId = "app"+System.currentTimeMillis(); //clientId很重要,不能重复,否则就会连不上,所以我定义成 app+当前时间private String mqtt_sub_topic = "Android_Get"; //需要订阅的主题private String mqtt_pub_topic = "Android_Set"; //需要发布的主题private MqttClient mqtt_client; //创建一个mqtt_client对象MqttConnectOptions options;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button btn = findViewById(R.id.button);btn.setOnClickListener(this);//makeToast("clientID:" + clientId);mqtt_init_Connect();}public void mqtt_init_Connect() {try {//实例化mqtt_client,填入我们定义的serverUri和clientId,然后MemoryPersistence设置clientid的保存形式,默认为以内存保存mqtt_client = new MqttClient(serverUri, clientId, new MemoryPersistence());//创建并实例化一个MQTT的连接参数对象options = new MqttConnectOptions();//然后设置对应的参数options.setUserName(userName); //设置连接的用户名options.setPassword(passWord.toCharArray()); //设置连接的密码options.setConnectionTimeout(30); // 设置超时时间,单位为秒options.setKeepAliveInterval(50); //设置心跳,50soptions.setAutomaticReconnect(true); //是否重连//设置是否清空session,设置为false表示服务器会保留客户端的连接记录,设置为true表示每次连接到服务器都以新的身份连接options.setCleanSession(true);//设置回调mqtt_client.setCallback(new MqttCallback() {@Overridepublic void connectionLost(Throwable cause) {//连接丢失后,一般在这里面进行重连makeToast("connectionLost");}@Overridepublic void deliveryComplete(IMqttDeliveryToken token) {//publish后会执行到这里}@Overridepublic void messageArrived(String topicName, MqttMessage message) throws Exception {//subscribe后得到的消息会执行到这里面}});//连接mqtt服务器mqtt_client.connect(options);} catch (Exception e) {e.printStackTrace();makeToast(e.toString());}}public void onClick(View v){int id= R.id.button;if(v.getId() == id) {Toast.makeText(this, "按钮被点击了", Toast.LENGTH_SHORT).show();TextView textView = findViewById(R.id.textView);textView.setText("我已经按下了!!");}}private void makeToast(String toast_str) {Toast.makeText(MainActivity.this, toast_str, Toast.LENGTH_LONG).show();}
}