RabbitMQApi.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package com.zy.bms.utils;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.http.HttpHeaders;
  7. import java.util.*;
  8. /**
  9. * RabbitMQ HTTP API接口请求
  10. *
  11. * @author yang xiao kun
  12. * create on 2021/5/14
  13. */
  14. @Slf4j
  15. public class RabbitMQApi {
  16. private final static String authorization = "Basic bHEyMDE5OkxpUXVhblJhYmJpdA==";
  17. /**
  18. * 向 MQTT 服务器申请用户,供设备进行登录
  19. * <p>
  20. * 因为存在先后问题,需要先注册用户,在开通虚拟机权限,
  21. * 所以逻辑为
  22. * 发送注册用户请求
  23. * 尝试申请权限
  24. * 如果失败,则间隔一秒再次请求
  25. * 如果申请次数超过3次,则尝试重新注册
  26. * 重新注册后再次尝试申请
  27. * 如果申请五次都失败,则结束方法,记录日志
  28. *
  29. * @param username 设备登录ID
  30. * @param password 设备登录密码
  31. */
  32. public static void register(String username, String password) {
  33. addRabbitMqUser(username, password);
  34. int count = 0;
  35. while (!setPermission(username)) {
  36. try {
  37. Thread.sleep(1000);
  38. if (count == 2) {
  39. addRabbitMqUser(username, password);
  40. }
  41. if (count > 4) {
  42. break;
  43. }
  44. count++;
  45. } catch (InterruptedException e) {
  46. log.error("向 MQTT 服务器申请用户失败", e);
  47. break;
  48. }
  49. }
  50. }
  51. /**
  52. * 注册 RabbitMQ 用户
  53. *
  54. * @param username 用户名
  55. * @param password 用户密码
  56. */
  57. private static void addRabbitMqUser(String username, String password) {
  58. String url = "http://view.ailishi.org:15672/api/users/" + username;
  59. //请求头
  60. HttpHeaders headers = new HttpHeaders();
  61. headers.add("authorization", authorization);
  62. //请求参数
  63. Map<String, String> params = new HashMap<>();
  64. params.put("username", username);
  65. params.put("password", password);
  66. params.put("tags", "");
  67. HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
  68. }
  69. /**
  70. * 申请虚拟机权限
  71. *
  72. * @param clientId 用户ID
  73. */
  74. private static boolean setPermission(String clientId) {
  75. String url = "http://view.ailishi.org:15672/api/permissions/%2F/" + clientId;
  76. //请求头
  77. HttpHeaders headers = new HttpHeaders();
  78. headers.add("authorization", authorization);
  79. //请求参数
  80. Map<String, String> params = new HashMap<>();
  81. params.put("username", clientId);
  82. params.put("vhost", "/");
  83. params.put("configure", ".*");
  84. params.put("write", ".*");
  85. params.put("read", ".*");
  86. try {
  87. HttpUtil.putForJSONEntity(url, headers, JSON.toJSONString(params));
  88. } catch (Exception e) {
  89. return false;
  90. }
  91. return true;
  92. }
  93. /**
  94. * 查询MQTT服务器链接状态
  95. */
  96. public static List<String> connections() {
  97. String url = "http://view.ailishi.org:15672/api/connections";
  98. List<String> result = new LinkedList<>();
  99. HttpHeaders headers = new HttpHeaders();
  100. headers.add("authorization", authorization);
  101. try {
  102. String response = HttpUtil.getForEntity(url, headers);
  103. //返回结果不为空
  104. if (!response.equals("")) {
  105. JSONArray jsonArray = JSON.parseArray(response);
  106. for (int i = 0; i < jsonArray.size(); i++) {
  107. JSONObject jsonObject = jsonArray.getJSONObject(i);
  108. result.add(jsonObject.getString("user"));
  109. }
  110. }
  111. } catch (Exception e) {
  112. log.error("查询MQTT服务器Connections错误", e);
  113. }
  114. return result;
  115. }
  116. /**
  117. * 查询MQTT服务器注册的用户
  118. */
  119. public static List<String> users() {
  120. String url = "http://view.ailishi.org:15672/api/users";
  121. List<String> result = new LinkedList<>();
  122. HttpHeaders headers = new HttpHeaders();
  123. headers.add("authorization", authorization);
  124. try {
  125. String response = HttpUtil.getForEntity(url, headers);
  126. //返回结果不为空
  127. if (!response.equals("")) {
  128. JSONArray jsonArray = JSON.parseArray(response);
  129. for (int i = 0; i < jsonArray.size(); i++) {
  130. JSONObject jsonObject = jsonArray.getJSONObject(i);
  131. result.add(jsonObject.getString("name"));
  132. }
  133. }
  134. } catch (Exception e) {
  135. log.error("查询MQTT服务器users错误", e);
  136. }
  137. return result;
  138. }
  139. }