当前位置:   article > 正文

Android - 对接MQTT_android mqtt

android mqtt

一、认识下 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.接下来就是 使用代码了

  1. public class MainActivity extends AppCompatActivity {
  2. private ScheduledExecutorService scheduler;
  3. private MqttClient client;
  4. private Handler handler;
  5. //这些都写你自己的或者找个测试的地址
  6. private String host = "tcp://139.xxx.xxx.xx:xxxx"; // TCP协议
  7. private String userName = "well2021"; //mqtt用户名称
  8. private String passWord = "public";//mqtt用户密码
  9. private String mqtt_id = "clientId_mqtt_well_android";//mqtt id
  10. private String mqtt_sub_topic = "well";//mqtt订阅的主题的标识
  11. private String mqtt_pub_topic = "well/1123/0";//mqtt你发布的主题的标识
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
  17. @Override
  18. public void onClick(View view) {
  19. publishmessageplus(mqtt_pub_topic, "我是测试发送的数据给mqtt服务端");
  20. }
  21. });
  22. //初始化mqtt配置
  23. Mqtt_init();
  24. }
  25. // MQTT初始化
  26. private void mqttInit() {
  27. try {
  28. //host为主机名,test为clientid即连接MQTT的客户端ID,一般以客户端唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
  29. client = new MqttClient(host, mqtt_id,
  30. new MemoryPersistence());
  31. //MQTT的连接设置
  32. MqttConnectOptions options = new MqttConnectOptions();
  33. //设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
  34. options.setCleanSession(false);
  35. //设置连接的用户名
  36. options.setUserName(userName);
  37. //设置连接的密码
  38. options.setPassword(passWord.toCharArray());
  39. // 设置超时时间 单位为秒
  40. options.setConnectionTimeout(10);
  41. // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
  42. options.setKeepAliveInterval(20);
  43. startReconnect(options);
  44. //设置回调
  45. client.setCallback(new MqttCallback() {
  46. @Override
  47. public void connectionLost(Throwable cause) {
  48. //连接丢失后,一般在这里面进行重连
  49. Logger.e(TAG, "连接丢失后connectionLost----------");
  50. }
  51. @Override
  52. public void deliveryComplete(IMqttDeliveryToken token) {
  53. //publish后会执行到这里
  54. Logger.d(TAG, "publish后会执行到这里deliveryComplete---------"
  55. + token.isComplete());
  56. }
  57. @Override
  58. public void messageArrived(String topicName, MqttMessage message)
  59. throws Exception {
  60. //subscribe后得到的消息会执行到这里面
  61. Logger.d(TAG, "subscribe后得到的消息会执行到这里面messageArrived----------" + message);
  62. }
  63. });
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. // MQTT重新连接函数
  69. private void startReconnect(MqttConnectOptions options) {
  70. scheduler = Executors.newSingleThreadScheduledExecutor();
  71. scheduler.scheduleAtFixedRate(new Runnable() {
  72. @Override
  73. public void run() {
  74. if (!client.isConnected()) {
  75. mqttConnect(options);
  76. }
  77. }
  78. }, 0 * 1000, 10 * 1000, TimeUnit.MILLISECONDS);
  79. }
  80. // 订阅函数 (下发任务/命令)
  81. public void publishmessageplus(String topic, String message2) {
  82. if (client == null || !client.isConnected()) {
  83. return;
  84. }
  85. MqttMessage message = new MqttMessage();
  86. message.setPayload(message2.getBytes());
  87. try {
  88. client.publish(topic, message);
  89. } catch (MqttException e) {
  90. e.printStackTrace();
  91. }
  92. }
  93. // MQTT连接函数
  94. private void mqttConnect(MqttConnectOptions options) {
  95. new Thread(() -> {
  96. try {
  97. if (!(client.isConnected())) //如果还未连接
  98. {
  99. client.connect(options);
  100. }
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. }).start();
  105. }
  106. }

这是布局 

<?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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/386492?site=
推荐阅读
相关标签
  

闽ICP备14008679号