mqttTool.js 3.8 KB

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