debug.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import {
  2. subscribe,
  3. unsubscribe,
  4. publish
  5. } from '@/utils/mqtt'
  6. import { parseTime } from '@/utils'
  7. import request from '@/utils/request'
  8. export let opend = false
  9. const deviceMap = {}
  10. export const deviceMessage = [
  11. { id: 'other', name: '其他', list: [] }
  12. ]
  13. export const devices = [
  14. { id: 'all', name: '全部' },
  15. { id: 'other', name: '其他' }
  16. ]
  17. export function start () {
  18. if (!opend) {
  19. opend = true
  20. subscribe('+/#', onMessage)
  21. }
  22. }
  23. export function stop () {
  24. if (opend) {
  25. opend = false
  26. unsubscribe('+/#', onMessage)
  27. }
  28. }
  29. export function clear () {
  30. deviceMessage.forEach(item => {
  31. item.list.splice(0, item.list.length)
  32. })
  33. }
  34. export function send (topic, message, encode) {
  35. return publish(topic, message, encode)
  36. }
  37. function onMessage (topic, message) {
  38. const result = /^\d+\/(\d+)(.+)$/.exec(topic)
  39. if (result) {
  40. const id = result[1]
  41. getDevice(id)
  42. deviceMessage[deviceMap[id].index].list.unshift({
  43. id: Math.random().toString(16).slice(2),
  44. time: parseTime(Date.now()),
  45. topic: result[2],
  46. desc: message
  47. })
  48. } else {
  49. deviceMessage[0].list.unshift({
  50. id: Math.random().toString(16).slice(2),
  51. time: parseTime(Date.now()),
  52. topic,
  53. desc: message
  54. })
  55. }
  56. }
  57. function getDevice (id) {
  58. if (deviceMap[id]?.loading || deviceMap[id]?.loaded) {
  59. return
  60. }
  61. if (!deviceMap[id]) {
  62. deviceMap[id] = { index: deviceMessage.length, loading: true, loaded: false }
  63. deviceMessage.push({ id, name: id, list: [] })
  64. devices.push({ id, name: id })
  65. }
  66. deviceMap[id].loading = true
  67. request({
  68. url: `/device/${id}`,
  69. method: 'get',
  70. custom: true,
  71. background: true
  72. }).then(({ data }) => {
  73. deviceMap[id].loaded = true
  74. if (data) {
  75. const { name, serialNumber, mac } = data
  76. const device = deviceMessage.find(item => item.id === id)
  77. device.name = name
  78. device.serialNumber = serialNumber
  79. device.mac = mac
  80. devices.find(item => item.id === id).name = name
  81. }
  82. }).finally(() => {
  83. deviceMap[id].loading = false
  84. })
  85. }