|
@@ -1,123 +1,164 @@
|
|
|
-import mqtt from './mqtt';
|
|
|
+// mqttService.js
|
|
|
+import mqtt from './mqtt'
|
|
|
|
|
|
-let mqttClientCmd = null; // 全局 CMD MQTT
|
|
|
-let mqttClientData = null; // 全局 DATA MQTT
|
|
|
+class MqttService {
|
|
|
+ constructor() {
|
|
|
+ if (!MqttService.instance) {
|
|
|
+ this.cmdClient = null
|
|
|
+ this.dataClient = null
|
|
|
+ this.cmdConnected = false
|
|
|
+ this.dataConnected = false
|
|
|
+ MqttService.instance = this
|
|
|
+ }
|
|
|
+ return MqttService.instance
|
|
|
+ }
|
|
|
+
|
|
|
+ // 连接 CMD
|
|
|
+ connectCmd(userId) {
|
|
|
+ if (this.cmdConnected && this.cmdClient) {
|
|
|
+ console.log("CMD MQTT 已连接,复用现有实例")
|
|
|
+ return this.cmdClient
|
|
|
+ }
|
|
|
+ console.log("CMD MQTT 连接中...")
|
|
|
+ const params = {
|
|
|
+ clientId: "xcx_mqtt_cmd1_" + userId + "_" + Math.random().toString(16).substring(2, 8),
|
|
|
+ username: "lnradar",
|
|
|
+ password: "lnradar",
|
|
|
+ wsOptions: {
|
|
|
+ WebSocket: function (url) {
|
|
|
+ return wx.connectSocket({
|
|
|
+ url,
|
|
|
+ header: { "content-type": "application/json" },
|
|
|
+ protocols: ["mqtt"],
|
|
|
+ })
|
|
|
+ },
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ this.cmdClient = mqtt.connect("wxs://cmd.radar-power.cn/mqtt/", params)
|
|
|
+
|
|
|
+ this.cmdClient.on("connect", () => {
|
|
|
+ this.cmdConnected = true
|
|
|
+ console.log("CMD MQTT 连接成功")
|
|
|
+ uni.$emit("mqtt-ready", mqttClient)
|
|
|
+ this.cmdClient.subscribe(`/mps/wx_${userId}/notice`, (err) => {
|
|
|
+ if (err) {
|
|
|
+ console.error("CMD 订阅失败", err)
|
|
|
+ } else {
|
|
|
+ console.log(`成功订阅设备主题: /mps/wx_${userId}/notice`)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ this.cmdClient.on("message", (topic, message) => {
|
|
|
+ console.log("CMD 接收到消息:", topic, JSON.parse(message.toString()))
|
|
|
+ })
|
|
|
|
|
|
-let mqttCmdConnected = false;
|
|
|
-let mqttDataConnected = false;
|
|
|
-let reconnectTimer = null; // 重连定时器
|
|
|
+ this.cmdClient.on("error", (err) => {
|
|
|
+ this.cmdConnected = false
|
|
|
+ console.error("CMD MQTT 连接错误:", err)
|
|
|
+ })
|
|
|
|
|
|
-export function createMqttClient() {
|
|
|
- if (mqttCmdConnected) {
|
|
|
- console.log("CMD MQTT 已连接");
|
|
|
- return mqttClientCmd;
|
|
|
+ this.cmdClient.on("disconnect", () => {
|
|
|
+ this.cmdConnected = false
|
|
|
+ console.log("CMD MQTT 断开")
|
|
|
+ })
|
|
|
+
|
|
|
+ return this.cmdClient
|
|
|
}
|
|
|
- const params = {
|
|
|
- // keepalive: 60,
|
|
|
- // clean: false,
|
|
|
- // connectTimeout: 30 * 1000,
|
|
|
- clientId:
|
|
|
- "xcx_mqtt_cmd1" +
|
|
|
- uni.getStorageSync("userId") +
|
|
|
- Math.random().toString(16).substring(2, 8),
|
|
|
- username: "lnradar",
|
|
|
- password: "lnradar",
|
|
|
- wsOptions: {
|
|
|
+
|
|
|
+ // 连接 DATA
|
|
|
+ connectData(userId) {
|
|
|
+ if (this.dataConnected && this.dataClient) {
|
|
|
+ console.log("DATA MQTT 已连接,复用现有实例")
|
|
|
+ return this.dataClient
|
|
|
+ }
|
|
|
+
|
|
|
+ const params = {
|
|
|
+ clientId: "xcx_mqtt_data1_" + userId + "_" + Date.now(),
|
|
|
+ username: "lnradar",
|
|
|
+ password: "lnradar",
|
|
|
WebSocket: function (url) {
|
|
|
return wx.connectSocket({
|
|
|
- url: url,
|
|
|
- header: {
|
|
|
- "content-type": "application/json",
|
|
|
- },
|
|
|
+ url,
|
|
|
+ header: { "content-type": "application/json" },
|
|
|
protocols: ["mqtt"],
|
|
|
- });
|
|
|
+ })
|
|
|
},
|
|
|
- },
|
|
|
- };
|
|
|
- let client = "";
|
|
|
-
|
|
|
- client = mqtt.connect("wxs://cmd.radar-power.cn/mqtt/", params);
|
|
|
- client.on("connect", () => {
|
|
|
- mqttCmdConnected = true;
|
|
|
- console.log("MQTTCMD连接成功");
|
|
|
- const userId = uni.getStorageSync("userId");
|
|
|
- client.subscribe(`/mps/wx_${userId}/notice`, (err) => {
|
|
|
- if (err) {
|
|
|
- console.error("订阅失败", err);
|
|
|
- } else {
|
|
|
- console.log(`成功订阅设备主题: /mps/wx_${userId}/notice`);
|
|
|
- }
|
|
|
- });
|
|
|
- });
|
|
|
- client.on("message", (topic, message) => {
|
|
|
- console.log("topic", topic, message);
|
|
|
- console.log("接收到消息:", JSON.parse(message.toString()));
|
|
|
- const noticeMatch = /^\/mps\/wx_(.+)\/notice$/;
|
|
|
- const match = topic.match(noticeMatch);
|
|
|
- if (!match) return;
|
|
|
- });
|
|
|
- client.on("error", (err) => {
|
|
|
- mqttCmdConnected = false;
|
|
|
- console.error("MQTTCMD连接错误:", err);
|
|
|
- });
|
|
|
-
|
|
|
- client.on("disconnect", () => {
|
|
|
- mqttCmdConnected = false;
|
|
|
- console.log("MQTT断开连接");
|
|
|
- });
|
|
|
- return client;
|
|
|
-}
|
|
|
+ }
|
|
|
+
|
|
|
+ this.dataClient = mqtt.connect("wxs://data.radar-power.cn/mqtt/", params)
|
|
|
+
|
|
|
+ this.dataClient.on("connect", () => {
|
|
|
+ this.dataConnected = true
|
|
|
+ uni.$emit("mqttData-ready", mqttClientData)
|
|
|
+ console.log("DATA MQTT 连接成功")
|
|
|
+ })
|
|
|
|
|
|
-// 创建data连接
|
|
|
-export function createMqttData() {
|
|
|
- if (!uni.getStorageSync("userId")) {
|
|
|
- console.warn("DATA MQTT 创建失败:缺少 userId");
|
|
|
- return null;
|
|
|
+ this.dataClient.on("message", (topic, message) => {
|
|
|
+ console.log("DATA 接收到消息:", topic, JSON.parse(message.toString()))
|
|
|
+ })
|
|
|
+
|
|
|
+ this.dataClient.on("error", (err) => {
|
|
|
+ this.dataConnected = false
|
|
|
+ console.error("DATA MQTT 连接错误:", err)
|
|
|
+ })
|
|
|
+
|
|
|
+ this.dataClient.on("disconnect", () => {
|
|
|
+ this.dataConnected = false
|
|
|
+ console.log("DATA MQTT 断开")
|
|
|
+ })
|
|
|
+
|
|
|
+ // 给 DATA 加一个关闭方法
|
|
|
+ this.dataClient.close = (force = true) => {
|
|
|
+ this.dataClient.end(force, () => {
|
|
|
+ this.dataConnected = false
|
|
|
+ this.dataClient = null
|
|
|
+ console.log("DATA MQTT 已关闭")
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ return this.dataClient
|
|
|
}
|
|
|
|
|
|
- if (mqttDataConnected) return mqttClientData;
|
|
|
-
|
|
|
- const params = {
|
|
|
- // keepalive: 15,
|
|
|
- // clean: false,
|
|
|
- // connectTimeout: 1500,
|
|
|
- // reconnectPeriod: 2000
|
|
|
- clientId: "xcx_mqtt_data1_" + uni.getStorageSync("userId") + "_" + Date.now(),
|
|
|
- username: "lnradar",
|
|
|
- password: "lnradar",
|
|
|
- WebSocket: function (url) {
|
|
|
- return wx.connectSocket({
|
|
|
- url: url,
|
|
|
- header: {
|
|
|
- "content-type": "application/json",
|
|
|
- },
|
|
|
- protocols: ["mqtt"],
|
|
|
- });
|
|
|
- },
|
|
|
- };
|
|
|
-
|
|
|
- mqttClientData = mqtt.connect("wxs://data.radar-power.cn/mqtt/", params);
|
|
|
-
|
|
|
- mqttClientData.on("connect", () => {
|
|
|
- console.log("DATA MQTT 连接成功Global页面打印");
|
|
|
- mqttDataConnected = true;
|
|
|
- // uni.$emit("mqttData-ready", mqttClientData)
|
|
|
- });
|
|
|
-
|
|
|
- mqttClientData.on("message", (topic, message) => {
|
|
|
- console.log("topic", topic, message);
|
|
|
- console.log("接收到消息:", JSON.parse(message.toString()));
|
|
|
-
|
|
|
- });
|
|
|
-
|
|
|
- mqttClientData.on("error", (err) => { mqttDataConnected = false; console.error("MQTTDATA连接错误:", err); });
|
|
|
- mqttClientData.on("disconnect", () => { mqttDataConnected = false; console.log("DATA MQTT 断开"); });
|
|
|
- mqttClientData.close = function (force = true) {
|
|
|
- mqttClientData.end(force, () => {
|
|
|
- mqttDataConnected = false;
|
|
|
- console.log("DATA MQTT 已关闭");
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- return mqttClientData;
|
|
|
-}
|
|
|
+ // 发布
|
|
|
+ publish(clientType, topic, message) {
|
|
|
+ const client = clientType === "CMD" ? this.cmdClient : this.dataClient
|
|
|
+ if (client) {
|
|
|
+ client.publish(topic, message)
|
|
|
+ } else {
|
|
|
+ console.warn(`${clientType} MQTT 未连接,无法 publish`)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 订阅
|
|
|
+ subscribe(clientType, topic) {
|
|
|
+ const client = clientType === "CMD" ? this.cmdClient : this.dataClient
|
|
|
+ if (client) {
|
|
|
+ client.subscribe(topic)
|
|
|
+ } else {
|
|
|
+ console.warn(`${clientType} MQTT 未连接,无法 subscribe`)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 断开所有连接
|
|
|
+ disconnectAll() {
|
|
|
+ if (this.cmdClient) {
|
|
|
+ this.cmdClient.end(true)
|
|
|
+ this.cmdClient = null
|
|
|
+ this.cmdConnected = false
|
|
|
+ console.log("CMD MQTT 已关闭")
|
|
|
+ }
|
|
|
+ if (this.dataClient) {
|
|
|
+ this.dataClient.end(true)
|
|
|
+ this.dataClient = null
|
|
|
+ this.dataConnected = false
|
|
|
+ console.log("DATA MQTT 已关闭")
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const instance = new MqttService()
|
|
|
+// Object.freeze(instance)
|
|
|
+
|
|
|
+export default instance
|