一、认识下 Android MQTT
首先你得知道这是什么吧,稀里糊涂抄一大堆完事就忘了可不行。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。
MQTT有三个角色:
- 服务端
- 客户端(简单理解为手机端)
- 主题(是接收呢,还是发送)
MQTT服务质量等级
- QoS = 0 – 最多发一次
- QoS = 1 – 最少发一次
- QoS = 2 – 保证收一次
基本就是这些,本文默认你已经有一个MQTT的服务地址了,接下来就负责Andriod连接。
我的使用场景是打开在线调试,一对一看到对方发来的数据
二、使用
1.导入库
//MQTT implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2' implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.0'
2.添加maven
maven { url 'https://repo.eclipse.org/content/repositories/paho-releases/'} maven { url 'https://jitpack.io' }
3. AndroidManifest.xml 中添加
<service android:name="org.eclipse.paho.android.service.MqttService" />
4.接下来就是 使用代码了
public class MainActivity extends AppCompatActivity {
private ScheduledExecutorService scheduler;
private MqttClient client;
private Handler handler;
//这些都写你自己的或者找个测试的地址
private String host = "tcp://139.xxx.xxx.xx:xxxx"; // TCP协议
private String userName = "well2021"; //mqtt用户名称
private String passWord = "public";//mqtt用户密码
private String mqtt_id = "clientId_mqtt_well_android";//mqtt id
private String mqtt_sub_topic = "well";//mqtt订阅的主题的标识
private String mqtt_pub_topic = "well/1123/0";//mqtt你发布的主题的标识
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
publishmessageplus(mqtt_pub_topic, "我是测试发送的数据给mqtt服务端");
}
});
//初始化mqtt配置
Mqtt_init();
}
// MQTT初始化
private void mqttInit() {
try {
//host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(host, mqtt_id,
new MemoryPersistence());
//MQTT的连接设置
MqttConnectOptions options = new MqttConnectOptions();
//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
//设置连接的用户名
options.setUserName(userName);
//设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
startReconnect(options);
//设置回调
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
//连接丢失后,一般在这里面进行重连
Logger.e(TAG, "连接丢失后connectionLost----------");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
//publish后会执行到这里
Logger.d(TAG, "publish后会执行到这里deliveryComplete---------"
+ token.isComplete());
}
@Override
public void messageArrived(String topicName, MqttMessage message)
throws Exception {
//subscribe后得到的消息会执行到这里面
Logger.d(TAG, "subscribe后得到的消息会执行到这里面messageArrived----------" + message);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
// MQTT重新连接函数
private void startReconnect(MqttConnectOptions options) {
scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
if (!client.isConnected()) {
mqttConnect(options);
}
}
}, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
}
// 订阅函数 (下发任务/命令)
public void publishmessageplus(String topic, String message2) {
if (client == null || !client.isConnected()) {
return;
}
MqttMessage message = new MqttMessage();
message.setPayload(message2.getBytes());
try {
client.publish(topic, message);
} catch (MqttException e) {
e.printStackTrace();
}
}
// MQTT连接函数
private void mqttConnect(MqttConnectOptions options) {
new Thread(() -> {
try {
if (!(client.isConnected())) //如果还未连接
{
client.connect(options);
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
}
}
这是布局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/test" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="test"/> </LinearLayout>
问题:
到这里就结束了 ,基本写法是没有问题的,如果连接不上多半是因为配置问题,不是你android代码的问题,很有可能是配置问题。
主要问题点就在于,你的订阅和发送的标识不一致,或者后台没有配置好 就可能导致连接不上
我个人服务端用的是:MQTTX
文章来源:https://www.toymoban.com/news/detail-608540.html
文章来源地址https://www.toymoban.com/news/detail-608540.html
到了这里,关于Android - 对接MQTT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!