mqttTool.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import mqtt from '@/uni_modules/mqtt/dist/mqtt.js'
  2. import { getToken } from "@/utils/auth";
  3. let mqttTool = {
  4. client: null,
  5. }
  6. /** 连接Mqtt */
  7. mqttTool.connect = function () {
  8. let options = {
  9. username: "wumei-smart",
  10. password: getToken(),
  11. cleanSession: true,
  12. keepAlive: 30,
  13. clientId: 'web-' + Math.random().toString(16).substr(2),
  14. connectTimeout: 10000
  15. }
  16. // 配置Mqtt地址
  17. let url = process.env.VUE_APP_EMQX_SERVER_URL;
  18. if (url == '') {
  19. url = "ws://" + window.location.hostname + ":8083/mqtt";
  20. console.log('自动获取地址');
  21. }
  22. url = "wss://emqx.cszcyl.cn/mqtt";
  23. // #ifdef MP-WEIXIN
  24. url = "wxs://emqx.cszcyl.cn/mqtt";
  25. // #endif
  26. console.log("mqtt地址:", url);
  27. mqttTool.client = mqtt.connect(url, options);
  28. mqttTool.client.on("connect", (e) => {
  29. console.log('mqtt连接成功');
  30. });
  31. // 重新连接
  32. mqttTool.client.on('reconnect', (error) => {
  33. console.log('正在重连:', error)
  34. });
  35. // 发生错误
  36. mqttTool.client.on('error', (error) => {
  37. console.log('Mqtt客户端连接失败:', error)
  38. mqttTool.client.end();
  39. })
  40. // 断开连接
  41. mqttTool.client.on('close', function (res) {
  42. console.log('已断开Mqtt连接');
  43. });
  44. }
  45. /** 断开连接 */
  46. mqttTool.end = function () {
  47. return new Promise((resolve, reject) => {
  48. if (mqttTool.client == null) {
  49. resolve('未连接')
  50. console.log("未连接")
  51. return;
  52. }
  53. mqttTool.client.end()
  54. mqttTool.client = null
  55. console.log('Mqtt服务器已断开连接!');
  56. resolve('连接终止')
  57. })
  58. }
  59. /** 重新连接 */
  60. mqttTool.reconnect = function () {
  61. return new Promise((resolve, reject) => {
  62. if (mqttTool.client == null) {
  63. // 调用resolve方法,Promise变为操作成功状态(fulfilled)
  64. resolve('未连接')
  65. console.log("未连接")
  66. return;
  67. }
  68. console.log('正在重连...', res);
  69. mqttTool.client.reconnect()
  70. })
  71. }
  72. /** 消息订阅 */
  73. mqttTool.subscribe = function (topics) {
  74. return new Promise((resolve, reject) => {
  75. if (mqttTool.client == null) {
  76. resolve('未连接')
  77. console.log("未连接")
  78. uni.showToast({
  79. icon: 'none',
  80. title: 'mqtt未连接',
  81. });
  82. return;
  83. }
  84. mqttTool.client.subscribe(topics, {
  85. qos: 1
  86. }, function (err, res) {
  87. console.log("订阅主题:", topics);
  88. if (!err) {
  89. console.log("订阅成功")
  90. resolve('订阅成功')
  91. } else {
  92. console.log("订阅失败,主题可能已经订阅")
  93. resolve('订阅失败')
  94. return;
  95. }
  96. })
  97. })
  98. }
  99. /** 取消订阅 */
  100. mqttTool.unsubscribe = function (topics) {
  101. return new Promise((resolve, reject) => {
  102. if (mqttTool.client == null) {
  103. resolve('未连接')
  104. console.log("未连接")
  105. return;
  106. }
  107. mqttTool.client.unsubscribe(topics, function (err) {
  108. if (!err) {
  109. resolve('取消订阅成功')
  110. console.log("取消订阅成功")
  111. } else {
  112. resolve('取消订阅失败')
  113. console.log("取消订阅失败")
  114. return;
  115. }
  116. })
  117. })
  118. }
  119. mqttTool.publish = function (topic, message, name) {
  120. return new Promise((resolve, reject) => {
  121. if (mqttTool.client == null) {
  122. resolve('Mqtt客户端未连接')
  123. console.log("Mqtt客户端未连接")
  124. return;
  125. }
  126. mqttTool.client.publish(topic, message, { qos: 1 }, function (err) {
  127. console.log('发送主题:', topic);
  128. console.log('发送内容:', message);
  129. if (!err) {
  130. if (topic.indexOf('offline') > 0) {
  131. console.log("[ " + name + " ] 影子指令发送成功");
  132. resolve("[ " + name + " ] 影子指令发送成功");
  133. } else {
  134. console.log("[ " + name + " ] 指令发送成功");
  135. resolve("[ " + name + " ] 指令发送成功");
  136. }
  137. } else {
  138. console.log("[ " + name + " ] 指令发送失败");
  139. reject("[ " + name + " ] 指令发送失败");
  140. return;
  141. }
  142. })
  143. })
  144. }
  145. export default mqttTool