From 1c62d1c7d32ce719111039a61ab8160c3e7f5ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BE=9A=E7=A5=96=E6=9C=9B?= <573413756@qq.com> Date: Thu, 30 Nov 2023 15:18:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=BD=91=E5=85=B3=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xiuosiot-frontend/package-lock.json | 715 +++++++++++++++++- xiuosiot-frontend/package.json | 1 + xiuosiot-frontend/src/App.vue | 221 +++++- .../src/api/gateway/dashboard.js | 17 + xiuosiot-frontend/src/api/gateway/device.js | 25 + xiuosiot-frontend/src/api/gateway/manage.js | 65 ++ .../src/assets/images/device_appkey.png | Bin 0 -> 529 bytes .../src/assets/images/device_classc.png | Bin 0 -> 557 bytes .../src/assets/images/device_devEUI.png | Bin 0 -> 156 bytes .../src/assets/images/device_joinEUI.png | Bin 0 -> 228 bytes .../src/assets/images/device_name.png | Bin 0 -> 380 bytes .../src/assets/images/device_otaa.png | Bin 0 -> 468 bytes .../images/gateway_device_data_type.png | Bin 0 -> 355 bytes .../assets/images/gateway_device_humidity.png | Bin 0 -> 10236 bytes .../src/assets/images/gateway_device_pm1.png | Bin 0 -> 9176 bytes .../src/assets/images/gateway_device_pm10.png | Bin 0 -> 9275 bytes .../assets/images/gateway_device_pm2_5.png | Bin 0 -> 9580 bytes .../assets/images/gateway_device_status.png | Bin 0 -> 591 bytes .../images/gateway_device_temperature.png | Bin 0 -> 10161 bytes .../src/assets/images/gateway_never_seen.png | Bin 0 -> 733 bytes .../src/assets/images/gateway_offline.png | Bin 0 -> 732 bytes .../src/assets/images/gateway_online.png | Bin 0 -> 733 bytes .../src/assets/images/geteway_device.png | Bin 0 -> 739 bytes xiuosiot-frontend/src/layout/index.vue | 17 +- xiuosiot-frontend/src/router/index.js | 28 +- xiuosiot-frontend/src/store/getters.js | 2 + xiuosiot-frontend/src/store/modules/app.js | 18 +- xiuosiot-frontend/src/store/modules/user.js | 10 +- .../src/views/gateway/dashboard/index.vue | 255 +++++++ .../src/views/gateway/device/index.vue | 632 ++++++++++++++++ .../src/views/gateway/manage/index.vue | 553 ++++++++++++++ xiuosiot-frontend/src/views/login/index.vue | 25 +- .../src/views/terminal/OTA/index.vue | 1 + 33 files changed, 2542 insertions(+), 43 deletions(-) create mode 100644 xiuosiot-frontend/src/api/gateway/dashboard.js create mode 100644 xiuosiot-frontend/src/api/gateway/device.js create mode 100644 xiuosiot-frontend/src/api/gateway/manage.js create mode 100644 xiuosiot-frontend/src/assets/images/device_appkey.png create mode 100644 xiuosiot-frontend/src/assets/images/device_classc.png create mode 100644 xiuosiot-frontend/src/assets/images/device_devEUI.png create mode 100644 xiuosiot-frontend/src/assets/images/device_joinEUI.png create mode 100644 xiuosiot-frontend/src/assets/images/device_name.png create mode 100644 xiuosiot-frontend/src/assets/images/device_otaa.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_data_type.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_humidity.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_pm1.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_pm10.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_pm2_5.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_status.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_device_temperature.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_never_seen.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_offline.png create mode 100644 xiuosiot-frontend/src/assets/images/gateway_online.png create mode 100644 xiuosiot-frontend/src/assets/images/geteway_device.png create mode 100644 xiuosiot-frontend/src/views/gateway/dashboard/index.vue create mode 100644 xiuosiot-frontend/src/views/gateway/device/index.vue create mode 100644 xiuosiot-frontend/src/views/gateway/manage/index.vue diff --git a/xiuosiot-frontend/package-lock.json b/xiuosiot-frontend/package-lock.json index 601ed4f..218779c 100644 --- a/xiuosiot-frontend/package-lock.json +++ b/xiuosiot-frontend/package-lock.json @@ -17,6 +17,7 @@ "html-loader": "^4.2.0", "js-cookie": "2.2.0", "markdown-loader": "^8.0.0", + "mqtt": "^2.18.9", "normalize.css": "7.0.0", "nprogress": "0.2.0", "path-to-regexp": "2.4.0", @@ -3882,8 +3883,7 @@ "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/async-validator": { "version": "1.8.5", @@ -4440,6 +4440,15 @@ "file-uri-to-path": "1.0.0" } }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", @@ -4934,6 +4943,15 @@ "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, + "node_modules/callback-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/callback-stream/-/callback-stream-1.1.0.tgz", + "integrity": "sha512-sAZ9kODla+mGACBZ1IpTCAisKoGnv6PykW7fPk1LrM+mMepE18Yz0515yoVcrZy7dQsTUp3uZLQ/9Sx1RnLoHw==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "> 1.0.0 < 3.0.0" + } + }, "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -5557,6 +5575,23 @@ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, + "node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, + "node_modules/commist/node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", @@ -6467,6 +6502,15 @@ "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", @@ -7385,6 +7429,73 @@ "node": ">= 0.4" } }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "node_modules/es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/es6-set/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", @@ -7746,6 +7857,15 @@ "node": ">= 0.6" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/event-pubsub": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", @@ -8255,11 +8375,23 @@ "node": ">= 0.8" } }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extend-shallow": { "version": "3.0.2", @@ -8998,7 +9130,6 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "devOptional": true, "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -9008,7 +9139,6 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "devOptional": true, "dependencies": { "is-extglob": "^2.1.0" }, @@ -9016,6 +9146,26 @@ "node": ">=0.10.0" } }, + "node_modules/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "dependencies": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", @@ -9277,6 +9427,17 @@ "he": "bin/he" } }, + "node_modules/help-me": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/help-me/-/help-me-1.1.0.tgz", + "integrity": "sha512-P/IZ8yOMne3SCTHbVY429NZ67B/2bVQlcYGZh2iPPbdLrEQ/qY5aGChn0YTDmt7Sb4IKRI51fypItav+lNl76w==", + "dependencies": { + "callback-stream": "^1.0.2", + "glob-stream": "^6.1.0", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, "node_modules/hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -10060,6 +10221,18 @@ "node": ">= 0.10" } }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -10278,7 +10451,6 @@ "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -10322,6 +10494,14 @@ "node": ">=0.10.0" } }, + "node_modules/is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -10463,6 +10643,17 @@ "node": ">= 0.4" } }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -10517,6 +10708,17 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", @@ -12143,8 +12345,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -12887,9 +13088,9 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "node_modules/minipass": { "version": "3.3.4", @@ -13013,6 +13214,46 @@ "run-queue": "^1.0.3" } }, + "node_modules/mqtt": { + "version": "2.18.9", + "resolved": "https://registry.npmmirror.com/mqtt/-/mqtt-2.18.9.tgz", + "integrity": "sha512-ufywki8VAQ8YAERiunbj77TnXgaeVYVlyebnj4o9vhPUQFRjo+d3oUf0rft8kWi7YPYf4O8rkwPkeFc7ndWESg==", + "dependencies": { + "commist": "^1.0.0", + "concat-stream": "^1.6.2", + "end-of-stream": "^1.4.1", + "es6-map": "^0.1.5", + "help-me": "^1.0.1", + "inherits": "^2.0.3", + "minimist": "^1.2.0", + "mqtt-packet": "^5.6.0", + "pump": "^3.0.0", + "readable-stream": "^2.3.6", + "reinterval": "^1.1.0", + "split2": "^2.1.1", + "websocket-stream": "~5.2.0", + "xtend": "^4.0.1" + }, + "bin": { + "mqtt": "mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-5.6.1.tgz", + "integrity": "sha512-eaF9rO2uFrIYEHomJxziuKTDkbWW5psLBaIGCazQSKqYsTaB3n4SpvJ1PexKaDBiPnMLPIFWBIiTYT3IfEJfww==", + "dependencies": { + "bl": "^1.2.1", + "inherits": "^2.0.3", + "process-nextick-args": "^2.0.0", + "safe-buffer": "^5.1.0" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", @@ -13102,6 +13343,11 @@ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", @@ -13774,6 +14020,14 @@ "node": ">=6" } }, + "node_modules/ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "dependencies": { + "readable-stream": "^2.0.1" + } + }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", @@ -14069,8 +14323,7 @@ "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "devOptional": true + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" }, "node_modules/path-exists": { "version": "3.0.0", @@ -15765,6 +16018,11 @@ "jsesc": "bin/jsesc" } }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", @@ -15776,8 +16034,7 @@ "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "devOptional": true + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "node_modules/renderkid": { "version": "2.0.7", @@ -16982,6 +17239,14 @@ "node": ">=0.10.0" } }, + "node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dependencies": { + "through2": "^2.0.2" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -18248,6 +18513,15 @@ "xtend": "~4.0.1" } }, + "node_modules/through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dependencies": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", @@ -18289,6 +18563,18 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, + "node_modules/to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "dependencies": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -18518,6 +18804,11 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", @@ -18597,6 +18888,14 @@ "which-boxed-primitive": "^1.0.2" } }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -18696,6 +18995,15 @@ "imurmurhash": "^0.1.4" } }, + "node_modules/unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dependencies": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", @@ -20033,6 +20341,40 @@ "node": ">=0.8.0" } }, + "node_modules/websocket-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/websocket-stream/-/websocket-stream-5.2.0.tgz", + "integrity": "sha512-2ZfiWuEK/bTi8AhXdYh/lFEUwXtGVcbO4vWUy5XJhf7F6nCMAC8hbXXTarxrmv2BFSwdk3P3bhvgiA9wzT+GFQ==", + "dependencies": { + "duplexify": "^3.6.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.0", + "safe-buffer": "^5.1.2", + "ws": "^6.1.2", + "xtend": "^4.0.0" + } + }, + "node_modules/websocket-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/websocket-stream/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, "node_modules/whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -23382,8 +23724,7 @@ "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "async-validator": { "version": "1.8.5", @@ -23861,6 +24202,15 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "requires": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", @@ -24307,6 +24657,15 @@ "integrity": "sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==", "dev": true }, + "callback-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/callback-stream/-/callback-stream-1.1.0.tgz", + "integrity": "sha512-sAZ9kODla+mGACBZ1IpTCAisKoGnv6PykW7fPk1LrM+mMepE18Yz0515yoVcrZy7dQsTUp3uZLQ/9Sx1RnLoHw==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "> 1.0.0 < 3.0.0" + } + }, "caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/caller-callsite/-/caller-callsite-2.0.0.tgz", @@ -24803,6 +25162,22 @@ "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true }, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "requires": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + }, + "dependencies": { + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==" + } + } + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz", @@ -25569,6 +25944,15 @@ "resolved": "https://registry.npmmirror.com/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", @@ -26359,6 +26743,68 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmmirror.com/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha512-mz3UqCh0uPCIqsw1SSAkB/p0rOzF/M0V++vyN7JqlPtSW/VsYgQBvVvqMLmfBuyMzTpLnNqi6JmcSizs4jy19A==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/es6-set/-/es6-set-0.1.6.tgz", + "integrity": "sha512-TE3LgGLDIBX332jq3ypv6bcOpkLO0AslAQo7p2VqX/1N46YNsvIWgvjojjSEnWEGWMhr1qUbYeTSir5J6mFHOw==", + "requires": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "es6-iterator": "~2.0.3", + "es6-symbol": "^3.1.3", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", @@ -26631,6 +27077,15 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "event-pubsub": { "version": "4.3.0", "resolved": "https://registry.npmmirror.com/event-pubsub/-/event-pubsub-4.3.0.tgz", @@ -27052,11 +27507,25 @@ } } }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -27658,7 +28127,6 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "devOptional": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" @@ -27668,13 +28136,29 @@ "version": "3.1.0", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "devOptional": true, "requires": { "is-extglob": "^2.1.0" } } } }, + "glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", + "requires": { + "extend": "^3.0.0", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", + "unique-stream": "^2.0.2" + } + }, "glob-to-regexp": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", @@ -27890,6 +28374,17 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "help-me": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/help-me/-/help-me-1.1.0.tgz", + "integrity": "sha512-P/IZ8yOMne3SCTHbVY429NZ67B/2bVQlcYGZh2iPPbdLrEQ/qY5aGChn0YTDmt7Sb4IKRI51fypItav+lNl76w==", + "requires": { + "callback-stream": "^1.0.2", + "glob-stream": "^6.1.0", + "through2": "^2.0.1", + "xtend": "^4.0.0" + } + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -28522,6 +29017,15 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -28688,8 +29192,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "devOptional": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-finite": { "version": "1.1.0", @@ -28718,6 +29221,11 @@ "is-extglob": "^2.1.1" } }, + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==" + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -28822,6 +29330,14 @@ "has-tostringtag": "^1.0.0" } }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, "is-resolvable": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/is-resolvable/-/is-resolvable-1.1.0.tgz", @@ -28867,6 +29383,14 @@ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz", @@ -30202,8 +30726,7 @@ "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "json-stringify-safe": { "version": "5.0.1", @@ -30819,9 +31342,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "3.3.4", @@ -30923,6 +31446,38 @@ "run-queue": "^1.0.3" } }, + "mqtt": { + "version": "2.18.9", + "resolved": "https://registry.npmmirror.com/mqtt/-/mqtt-2.18.9.tgz", + "integrity": "sha512-ufywki8VAQ8YAERiunbj77TnXgaeVYVlyebnj4o9vhPUQFRjo+d3oUf0rft8kWi7YPYf4O8rkwPkeFc7ndWESg==", + "requires": { + "commist": "^1.0.0", + "concat-stream": "^1.6.2", + "end-of-stream": "^1.4.1", + "es6-map": "^0.1.5", + "help-me": "^1.0.1", + "inherits": "^2.0.3", + "minimist": "^1.2.0", + "mqtt-packet": "^5.6.0", + "pump": "^3.0.0", + "readable-stream": "^2.3.6", + "reinterval": "^1.1.0", + "split2": "^2.1.1", + "websocket-stream": "~5.2.0", + "xtend": "^4.0.1" + } + }, + "mqtt-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-5.6.1.tgz", + "integrity": "sha512-eaF9rO2uFrIYEHomJxziuKTDkbWW5psLBaIGCazQSKqYsTaB3n4SpvJ1PexKaDBiPnMLPIFWBIiTYT3IfEJfww==", + "requires": { + "bl": "^1.2.1", + "inherits": "^2.0.3", + "process-nextick-args": "^2.0.0", + "safe-buffer": "^5.1.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", @@ -31003,6 +31558,11 @@ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz", @@ -31555,6 +32115,14 @@ } } }, + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", + "requires": { + "readable-stream": "^2.0.1" + } + }, "os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmmirror.com/os-browserify/-/os-browserify-0.3.0.tgz", @@ -31803,8 +32371,7 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "devOptional": true + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" }, "path-exists": { "version": "3.0.0", @@ -33205,6 +33772,11 @@ } } }, + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz", @@ -33213,8 +33785,7 @@ "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "devOptional": true + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" }, "renderkid": { "version": "2.0.7", @@ -34207,6 +34778,14 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -35246,6 +35825,15 @@ "xtend": "~4.0.1" } }, + "through2-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "requires": { + "through2": "~2.0.0", + "xtend": "~4.0.0" + } + }, "thunky": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz", @@ -35281,6 +35869,15 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, + "to-absolute-glob": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", + "requires": { + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -35466,6 +36063,11 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", @@ -35532,6 +36134,11 @@ "which-boxed-primitive": "^1.0.2" } }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -35612,6 +36219,15 @@ "imurmurhash": "^0.1.4" } }, + "unique-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", @@ -36707,6 +37323,39 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "websocket-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/websocket-stream/-/websocket-stream-5.2.0.tgz", + "integrity": "sha512-2ZfiWuEK/bTi8AhXdYh/lFEUwXtGVcbO4vWUy5XJhf7F6nCMAC8hbXXTarxrmv2BFSwdk3P3bhvgiA9wzT+GFQ==", + "requires": { + "duplexify": "^3.6.1", + "inherits": "^2.0.1", + "readable-stream": "^3.0.0", + "safe-buffer": "^5.1.2", + "ws": "^6.1.2", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", diff --git a/xiuosiot-frontend/package.json b/xiuosiot-frontend/package.json index 64beef3..8b99e08 100644 --- a/xiuosiot-frontend/package.json +++ b/xiuosiot-frontend/package.json @@ -22,6 +22,7 @@ "html-loader": "^4.2.0", "js-cookie": "2.2.0", "markdown-loader": "^8.0.0", + "mqtt": "^2.18.9", "normalize.css": "7.0.0", "nprogress": "0.2.0", "path-to-regexp": "2.4.0", diff --git a/xiuosiot-frontend/src/App.vue b/xiuosiot-frontend/src/App.vue index ec9032c..660a636 100644 --- a/xiuosiot-frontend/src/App.vue +++ b/xiuosiot-frontend/src/App.vue @@ -5,7 +5,226 @@ diff --git a/xiuosiot-frontend/src/api/gateway/dashboard.js b/xiuosiot-frontend/src/api/gateway/dashboard.js new file mode 100644 index 0000000..58d29ac --- /dev/null +++ b/xiuosiot-frontend/src/api/gateway/dashboard.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function getDeviceStatus(data) { + return request({ + url: '/loraDevice/getStatus', + method: 'get', + params: data || {} + }) +} + +export function getGatewayStatus(data) { + return request({ + url: '/loraGateway/getStatus', + method: 'get', + params: data || {} + }) +} diff --git a/xiuosiot-frontend/src/api/gateway/device.js b/xiuosiot-frontend/src/api/gateway/device.js new file mode 100644 index 0000000..77371fe --- /dev/null +++ b/xiuosiot-frontend/src/api/gateway/device.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function getList(data) { + return request({ + url: '/loraDevice/select', + method: 'get', + params: data || {} + }) +} + +export function add(data) { + return request({ + url: '/loraDevice/add', + method: 'post', + data + }) +} + +export function remove(data) { + return request({ + url: '/loraDevice/delete', + method: 'post', + data + }) +} diff --git a/xiuosiot-frontend/src/api/gateway/manage.js b/xiuosiot-frontend/src/api/gateway/manage.js new file mode 100644 index 0000000..38c4f2c --- /dev/null +++ b/xiuosiot-frontend/src/api/gateway/manage.js @@ -0,0 +1,65 @@ +import request from '@/utils/request' + +export function getGatewayList(data) { + return request({ + url: '/loraGateway/select', + method: 'get', + params: data || {} + }) +} + +export function getDeviceList(data) { + return request({ + url: '/loraDevice/select', + method: 'get', + params: data || {} + }) +} + +export function add(data) { + return request({ + url: '/loraGateway/add', + method: 'post', + data + }) +} + +export function updateGateway(data) { + return request({ + url: '/loraGateway/update', + method: 'post', + data + }) +} + +export function updateDevice(data) { + return request({ + url: '/loraDevice/update', + method: 'post', + data + }) +} + +export function remove(data) { + return request({ + url: '/loraGateway/delete', + method: 'post', + data + }) +} + +export function deviceOffline(data) { + return request({ + url: '/loraDevice/offline', + method: 'post', + data + }) +} + +export function gatewayOffline(data) { + return request({ + url: '/loraGateway/offline', + method: 'post', + data + }) +} diff --git a/xiuosiot-frontend/src/assets/images/device_appkey.png b/xiuosiot-frontend/src/assets/images/device_appkey.png new file mode 100644 index 0000000000000000000000000000000000000000..68046d09886ccbfad2ae219a35ec8ac7edea0701 GIT binary patch literal 529 zcmV+s0`C2ZP)Px$%Sl8*R5(w~lRan@K@`V-Z|+dR?CoKph)7gaP_fERDs5s)#l}Lh(8fX$!r7z| zL`1MjBUp(agj80k6>V&k-9!*9M35jUB8igQTZnSmc`|$C^ter~bzq8lA3xszy*EPH zNwP_B*MKUp9hF&ZaJ?*4`iybwC8DQ+9bKOYIM+sMJBg(IZ%!{DZob0EILb2c36amJ z9tVyBdw`6n7L)_tuZ~fzOryFBctcb>+YL;z32=82t&%gvXn1GC_qT#1odg~rWaQ=u zqeDwQ@{;BP$S|t&*l?r_Fa_K~-6FQWzppn*It!c!T_6e%mI0mtS5a+a!)+yix4 zTiCGH3y7N+5xEB(23ElR?jM;kz+TW5)XZRmhK~{A)&)c#19ku0{CJ;suCj*6bE4pe zFqbZ(>;t}{`eO@1$7Kr8F;sqm855E;_hyiXM8U*Bz+8F`$I~K5%q0)-b%E+5YQt0^gcGcJy61Yc7}B~gAt`7SG@W@+iDFqh+6dgCu$nlq3KRaym|Px$=Sf6CR5(wq)W2(!Q544U@3}V}G|8JFY8@1cgLCuawL=GSbE)_jh-gu8(?tr! zsZNTWoCI}smC`{G9Ymo`lPoSSR*+gnN)qFu$vN^Sn&u^Kjlp-j@SYFPz4x3eL|>`? z2=S*do#?Db`NXXwJSU%;71kOL5qAOAQK)#0c%c0tLf>OdAX39DJF@(zURW1O4eLS0 zKt@LU9HI2B0yYU!rI^nBM^ukvQbD9j+a5C&y!mH5p0scKkz{-X`wEGRgvrX#_`vo} zPhir-ad;b%O`O~&pSn8~97CgumF5vlj^gz^W>Vdm!gG^C=H6f7!K5~hleefY z5@wcJsm$`pecR_hChTmcROpHX*)ld0;ii3eLsk3nY~ zy3KF)nlLj>sWAsO53(PmOfg*;4vqd=`(8i@(e@o6`MYqbo4D~4ApvaQ{W)^U)g9p- zl72zQW-&d0*H=KQgNR+i+zfOsFKV|%!r=N4Xs=H{p@}Jc`z&S)-J`H)*w{R@p5Pcq zc}WC3+Wwj}8z84uB{00000NkvXXu0mjfos0jv literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/device_devEUI.png b/xiuosiot-frontend/src/assets/images/device_devEUI.png new file mode 100644 index 0000000000000000000000000000000000000000..4859b4f33ca6ac10c8dd882567c522b0b9f63d9b GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^B0wy_!VDyzm^ops+A7p@BhMT%6ra vfl;KvnD>BB2rC!IGR6s+ObZK`v!WOo)}0jHSpRs+Tad|~u6{1-oD!M2F`WAhBBAIr!|6|8^pW8V5PjlTjGYVAB~TLN7tFxJFCwXC zYwwdAkBv@Yq#a+*o?UnmhJBw>h|Ln+h^PF7$Nub6Mw< G&;$UF(Nf3& literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/device_name.png b/xiuosiot-frontend/src/assets/images/device_name.png new file mode 100644 index 0000000000000000000000000000000000000000..3116e87e5e84d0489d43751928f0c6968fbb7f6a GIT binary patch literal 380 zcmV-?0fYXDP)Px$Hc3Q5R5(xFl)XwrK@f$%*_%Sh%}u}*LBS%mjX#kTifC_RA-0+a@D;@8P_VGK z6a*2H@)}I9Wdy+>7 zaj!uj>!^|*Z;5lZv9crFB~QQ{Ds9AeJed(HWklbx)Py)00S2^1CfZ`yKf^FP23Il+ z<%DW@J@wN#sUe)EZBf*)Z{>as-O5z9g8Ps1#%2n#4Noe;4p$OuV_29zHsk= zQQamIEW0Q`nqN<)d*hiAyMk&!v){tn@T+1^39nc^WUX-XU0SO%&tS&w0Y5Eddz9qO anLh!TTcjfO7Fj|70000f)-+%Pv$x|SB_Uy%rw;w-!{_C}Y>lV<6K2I0N5Q)oE`;QA9G7xZfRsSMp z)shwE;Uxa&e|w?fHgUffTRyv8%4n=ATE6%zgTu>DORk7S6e-V9{2r>&_i)vW4ZL>G zn5xWw)jJ&RY-km>j@a|$obqK&z_JESFX;t!e?mvv4FO#r&Y;!*$r literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_device_data_type.png b/xiuosiot-frontend/src/assets/images/gateway_device_data_type.png new file mode 100644 index 0000000000000000000000000000000000000000..249bb7b786836b16c3b691e44b645bd43624930b GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mi|!3-q1ibVN<6k~CayA#8@b22Z19Pa?15LY10 zaQ;8T`R@$pzc8Hp%y9ZM!g_iaUOnlKXi?!)-r_H`^aea0Mi;|}o?R~Q2Xy>EI=JY8qzFfKUc!%&}tE_!x zU*wK#?n(X7zwb(FO3xD>+07SHYn!ZJ?fhHvY0jpnANn`woVxS+%A_?S`*L^8xW&S2 Z!>Deo%KPKi+SQ-{@^tlcS?83{1OT>fp1lA7 literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_device_humidity.png b/xiuosiot-frontend/src/assets/images/gateway_device_humidity.png new file mode 100644 index 0000000000000000000000000000000000000000..e93c5748ab8462c75dd601fa4fbf04c1bd14b136 GIT binary patch literal 10236 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 literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_device_pm1.png b/xiuosiot-frontend/src/assets/images/gateway_device_pm1.png new file mode 100644 index 0000000000000000000000000000000000000000..a50978def137421cc64998a12bb97171056f44ec GIT binary patch literal 9176 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 b-hm{#EMvt1d0NP8AV5-7PNYIeKj8lWrWPE~ literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_device_pm2_5.png b/xiuosiot-frontend/src/assets/images/gateway_device_pm2_5.png new file mode 100644 index 0000000000000000000000000000000000000000..467fc7aef2774e15c9db1fd5f606585c06bf0c08 GIT binary patch literal 9580 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 literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_device_temperature.png b/xiuosiot-frontend/src/assets/images/gateway_device_temperature.png new file mode 100644 index 0000000000000000000000000000000000000000..389fe067ae9f9539bfcbb2043b1cc7c8928d07e8 GIT binary patch literal 10161 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 literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/gateway_never_seen.png b/xiuosiot-frontend/src/assets/images/gateway_never_seen.png new file mode 100644 index 0000000000000000000000000000000000000000..498f6606428cef20192abdfe41ff3325e263622b GIT binary patch literal 733 zcmV<30wVp1P)Px#v`|b`MF0Q*b(-{doAP#<@^+c@c$@Qhne%v>^LU!`cbfBene%s=@^_i?c$)Ko zp!12Q^pUOgnzQzvxAvmB_p8A7tikuK!S}Mp__N0NyUh8#&H2F4`NPus#MAo4)cVZX z`_0+=&f5Fb-}}|z``zaJ-sb$@=ltL3{NU*P(A?EU8K{pare=;C_L^%6is z2*!gB_w<19tLi#SB zzb1Gl2B{s&Y{KlUhxZ-!z*wYat3eqXx=+9>`5`8m+2t%{IOXlw@mWpJL-H zIfqMFb@R_&z%E=H8^1x)V5w`P`y%Vdabfn53Ix35**GpjS?JApk8f&9o$b>bq?yfG zR|^E{gSP`~#s%-@az_Qir%-I5x-_3VM*7~x{Z5a*%;G}NGsjHd5UREwFXSX^n{$+> zX{+U`ZOe7;e*H>r&2`K7!dBI?k4q^^GTLXzc18OdI`w9^gzGlzP6GV__6n28GyG>} P00000NkvXXu0mjf4|Px#v`|b`MF0Q*|4IP=O#uH*0RK$@|4sn^P5}Q+0RK$@|4sn^O#uH+0RK(^|4sn^ zSrGqZApdVL|9U|GflB{{Q2&r%|C40@n{WS{aQ~)%|EGZetcd@ykN>ie|Fo0;yr2KQ zp#Q(5|HrTY$guy?zyH&~|JB3)*2MqY%>Uib|K8C5;M4!%)c@ht|K;2N=G_13-~Z|0 z|LWoY?BoCJ(tr!%T=LamjKQ##B}7%`UfBw^^^UQ&rmhe6=eXTIZLmo}i7w55Y_n=4wiSIV(3n zC%~)pQ_rTPw+0+u3OgK-Lo0C*jmEC4?f zvITb8`ASmVFS0u?5#n=6|1FQt0I$H(Znt+zNNh)#m`zI`Ei5N(`1BHwN154k5!zTj zBzPf4sU6B}!tAVvmjk|msYuOMgEBUB*T4h$A!eD`3bdbJ3aa)iwix^95a1GsM>qHkdv%q&QYGG zt(L2fE!VmG{w29J*Dc=*Th+=wE~O~R=v*K>742*2G+Mn9uGeZf3G@pOe3K2_LEdHn O0000Px#v`|b`MF0Q*AioPBz6v0}3Lw1+AioMAy$T?{3n0D=AifG9z6v0|3n0A$Au2!N~8z%J9X@@W#^e&eikK)$`HT^U~P#)YVuB{8G_y7OPmjG=D zq51*78D>Iyl3sFo7shn$_@jO9uKkg}!!|Y8oHd_z+*gU=g9>@=I(U{%O()EpEVw$~;y_u41!|ZLW zx~g;d3#)Jb**~!J*u|59vU_ZJSkbk;_hRsy*JRDNXi}-XOzl z&LSfa?ttetYsUqTTDhYG;Z0~Z(_Pxm9V>lLRKL@sFPgY8^USl;H;1lO!aF(1LVJ$# zv~IOlg|1xZ@!O~5&RlnVFI=_T_i^b(Nk;e!84irEp*IYo9xe)oUIqOCi>;F?Q}ObH P00000NkvXXu0mjf02_04 literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/assets/images/geteway_device.png b/xiuosiot-frontend/src/assets/images/geteway_device.png new file mode 100644 index 0000000000000000000000000000000000000000..080458d66aa07ef9126eec9bf6713b762b2c929d GIT binary patch literal 739 zcmV<90v!E`P)Px#x=>71MF0Q*0MGOQ%klus@&L{80L}9N%kcor@&L>70L$?J%<=%t@c_*60L=0b z&+;JB^Dx!)K-u+5+VxP}_F&)lWZ(B>;P-Fh_;BL*f93dq=J|-{`H$)Okm>o8>H44S z`k?Ikr0x2z@B6Ut`@i!1!1MgW^Zdl~{LJ_x;=W{oMHe z-}(OF`TpVg{^R=oR`u^(s{_p(%@cjSu{r~&_|NQ^||NsAlp?)<0000eiQchC< zFi%i$e}KQh&(QDi&2z$yl&o~fBJr#j;=fk^OhjpWRLovKkjK_ zcR_-6RNkzCkzaRzJeV-12d7Y!6*kr z1iYP^EP$X8@&GK0^OdA}SZ9}hCM4jJ{#%yM0Kdl4Zr3+TNNPu%nN3TdEG#E&`0_K4 z!@}%|h;1xCA$Tgn+zw?nVRqKX>l#16rO3@zgC;iiZh=SgLyQZvn_0Skk&JY+x3RYq zlC7D&jZLrY9QI+=%|E*bJNImC`UXjZrLIk`>THn4h1o+Y5O7yz)3}IbtvAy>KB*~n z_L$xv&1}vFS|Hp5FC}Zn1s_y$M+L&WP;8{Sw3<6c`ktr#PLIAQ;zG|e$4uWCs#ZR) zIm*+#)hgxMa-Dl0-;!H%-SWM#)nU`er4c0=?hevzXqUpg;UA Vm91l}zfJ%E002ovPDHLkV1gbAl9K=c literal 0 HcmV?d00001 diff --git a/xiuosiot-frontend/src/layout/index.vue b/xiuosiot-frontend/src/layout/index.vue index 17f90f8..e603546 100644 --- a/xiuosiot-frontend/src/layout/index.vue +++ b/xiuosiot-frontend/src/layout/index.vue @@ -48,7 +48,22 @@ export default { } }, showBreadcrumb() { - const whiteList = ['overview', 'terminal/add', 'terminal/plc', 'terminal/stock', 'terminal/ota', 'data/value', 'configuration/development', 'dashboard', 'log/accessLog', 'log/systemLog', 'rule/manage', 'rule/dataTransfer'] + const whiteList = [ + 'overview', + 'terminal/add', + 'terminal/plc', + 'terminal/stock', + 'terminal/ota', + 'data/value', + 'configuration/development', + 'dashboard', + 'log/accessLog', + 'log/systemLog', + 'rule/manage', + 'rule/dataTransfer', + 'gateway/device', + 'gateway/manage' + ] return whiteList.every((item) => this.$route.path.indexOf(item) === -1) } }, diff --git a/xiuosiot-frontend/src/router/index.js b/xiuosiot-frontend/src/router/index.js index ace420c..d966a9b 100644 --- a/xiuosiot-frontend/src/router/index.js +++ b/xiuosiot-frontend/src/router/index.js @@ -157,7 +157,7 @@ export const asyncRouter = [ path: '', name: 'Dashboard', component: () => import('@/views/dashboard/index'), - meta: { title: '设备看板', icon: 'dashboard', permission: ['dashengda', 'hangxiao', 'qianjiangdianqi'] } + meta: { title: '看板', icon: 'dashboard', permission: ['dashengda', 'hangxiao', 'qianjiangdianqi'] } }] }, { @@ -229,6 +229,32 @@ export const asyncRouter = [ } ] }, + { + path: '/gateway', + component: Layout, + name: 'Gateway', + meta: { title: '网关管理', icon: 'rule', permission: ['dashengda', 'hangxiao', 'qianjiangdianqi'] }, + children: [ + { + path: 'dashboard', + name: 'GatewayDashboard', + component: () => import('@/views/gateway/dashboard/index'), + meta: { title: '看板' } + }, + { + path: 'device', + name: 'GatewayDevice', + component: () => import('@/views/gateway/device/index'), + meta: { title: '设备节点' } + }, + { + path: 'manage', + name: 'GatewayManage', + component: () => import('@/views/gateway/manage/index'), + meta: { title: '网关' } + } + ] + }, { path: '/rule', component: Layout, diff --git a/xiuosiot-frontend/src/store/getters.js b/xiuosiot-frontend/src/store/getters.js index bb8cbea..f27f85e 100644 --- a/xiuosiot-frontend/src/store/getters.js +++ b/xiuosiot-frontend/src/store/getters.js @@ -1,6 +1,8 @@ const getters = { sidebar: state => state.app.sidebar, device: state => state.app.device, + client: state => state.app.client, + gatewayList: state => state.app.gatewayList, token: state => state.user.token, avatar: state => state.user.avatar, name: state => state.user.name, diff --git a/xiuosiot-frontend/src/store/modules/app.js b/xiuosiot-frontend/src/store/modules/app.js index 24d29cd..7d3717e 100644 --- a/xiuosiot-frontend/src/store/modules/app.js +++ b/xiuosiot-frontend/src/store/modules/app.js @@ -5,7 +5,11 @@ const state = { opened: true, withoutAnimation: false }, - device: 'desktop' + device: 'desktop', + client: { + connected: false + }, + gatewayList: [] } const mutations = { @@ -25,6 +29,12 @@ const mutations = { }, TOGGLE_DEVICE: (state, device) => { state.device = device + }, + SET_CLIENT: (state, client) => { + state.client = client + }, + SET_GATEWAY_LIST: (state, gatewayList) => { + state.gatewayList = gatewayList } } @@ -37,6 +47,12 @@ const actions = { }, toggleDevice({ commit }, device) { commit('TOGGLE_DEVICE', device) + }, + setClient({ commit }, client) { + commit('SET_CLIENT', client) + }, + setGatewayList({ commit }, gatewayList) { + commit('SET_GATEWAY_LIST', gatewayList) } } diff --git a/xiuosiot-frontend/src/store/modules/user.js b/xiuosiot-frontend/src/store/modules/user.js index e5f4ce5..f06f5d4 100644 --- a/xiuosiot-frontend/src/store/modules/user.js +++ b/xiuosiot-frontend/src/store/modules/user.js @@ -2,7 +2,7 @@ * @Author: 龚祖望 573413756@qq.com * @Date: 2022-05-16 09:16:41 * @LastEditors: 龚祖望 573413756@qq.com - * @LastEditTime: 2022-11-17 11:15:19 + * @LastEditTime: 2023-11-23 15:07:17 * @FilePath: \dashengda\src\store\modules\user.js * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ @@ -56,12 +56,12 @@ const mutations = { RESET_STATE: (state) => { Object.assign(state, getDefaultState()) }, - SET_TOKEN: (state, name) => { - state.name = name - }, - SET_NAME: (state, token) => { + SET_TOKEN: (state, token) => { state.token = token }, + SET_NAME: (state, name) => { + state.name = name + }, SET_AVATAR: (state, avatar) => { state.avatar = avatar }, diff --git a/xiuosiot-frontend/src/views/gateway/dashboard/index.vue b/xiuosiot-frontend/src/views/gateway/dashboard/index.vue new file mode 100644 index 0000000..4db975f --- /dev/null +++ b/xiuosiot-frontend/src/views/gateway/dashboard/index.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/xiuosiot-frontend/src/views/gateway/device/index.vue b/xiuosiot-frontend/src/views/gateway/device/index.vue new file mode 100644 index 0000000..f347e53 --- /dev/null +++ b/xiuosiot-frontend/src/views/gateway/device/index.vue @@ -0,0 +1,632 @@ + + + + diff --git a/xiuosiot-frontend/src/views/gateway/manage/index.vue b/xiuosiot-frontend/src/views/gateway/manage/index.vue new file mode 100644 index 0000000..eed4070 --- /dev/null +++ b/xiuosiot-frontend/src/views/gateway/manage/index.vue @@ -0,0 +1,553 @@ + + + + diff --git a/xiuosiot-frontend/src/views/login/index.vue b/xiuosiot-frontend/src/views/login/index.vue index 51fbac3..5e3d1dc 100644 --- a/xiuosiot-frontend/src/views/login/index.vue +++ b/xiuosiot-frontend/src/views/login/index.vue @@ -91,7 +91,12 @@