赞
踩
首先你得知道这是什么吧,稀里糊涂抄一大堆完事就忘了可不行。
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输),MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。
MQTT有三个角色:
MQTT服务质量等级
基本就是这些,本文默认你已经有一个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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。