From 92230c9a97dc9ce9df3313d11d26999c04bb6b26 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期二, 15 七月 2025 13:12:48 +0800
Subject: [PATCH] 项目初始化

---
 src/plugins/mqttclient.ts |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/src/plugins/mqttclient.ts b/src/plugins/mqttclient.ts
new file mode 100644
index 0000000..dacf79a
--- /dev/null
+++ b/src/plugins/mqttclient.ts
@@ -0,0 +1,165 @@
+import { generateUUID } from "@/utils/geek";
+import * as mqtt from "mqtt/dist/mqtt";
+const enableJSONDecoding = true // 寮�鍚疛SON瑙f瀽娑堟伅锛岄渶瑕佸紑鍚疛SON瑙f瀽娑堟伅鎵嶈兘寮�鍚痷uid鍜宔vent
+const enableJSONEncoding = true // 寮�鍚疛SON娑堟伅缂栫爜
+const enableUUID = true // 闇�瑕佹帴鏀朵俊鎭腑鍖呭惈uuid瀛楁锛寀uid浼樺厛绾ч珮浜巈vent
+
+type MqttConnectOptions = {
+    clean: boolean,
+    connectTimeout: number,
+    clientId: string, // 璁よ瘉淇℃伅
+    keepalive: number,
+    protocolId?: string, // 榛樿 'MQTT'
+    protocolVersion?: number, // 榛樿4
+    username?: string,
+    password?: string,
+}
+type MqttConnectConfig = {
+    url?: string,
+    options: MqttConnectOptions
+}
+interface MqttClient {
+    connected:boolean,
+    on: {
+        (event: "connect", fun: () => void): void;
+        (event: "reconnect", fun: () => void): void;
+        (event: "disconnect", fun: () => void): void;
+        (event: "offline", fun: () => void): void;
+        (event: "message", fun: (topic: string, message: any, packet?: any) => void): void;
+        (event: "packetsend", fun: (packet: any) => void): void;
+        (event: "packetreceive", fun: (packet: any) => void): void;
+        (event: "error", fun: (err: any) => void): void;
+    };
+    publish: {
+        (topic: string, message: any, options?: any, callback?: (err: any) => void): void;
+    }
+    subscribe: {
+        (topic: string, options?: any, callback?: (err: any, granted: { topic: string, qos: any }) => void): void
+    }
+    unsubscribe: {
+        (topic: string, callback?: (err: any) => void): void
+    }
+    end(force?:boolean, options?:any, callback?: (err: any) => void): void
+}
+
+let _client: MqttClient;
+let _callback: { [key: string]: (data: any) => void } = {}
+let onmassage = (topic:string,message:string)=>{}
+export default {
+    /**
+     * 杩炴帴websocket
+     * 鏈�绠�鍗曠殑鐢ㄦ硶灏辨槸浼犲叆{url:"ws://demo"}
+     * 褰撹繛鎺ユ垚鍔熷悗瑙﹀彂鍥炶皟鍑芥暟
+     */
+    connect(config: MqttConnectConfig) {
+        return new Promise<void>((resolve, reject) => {
+            if(!_client || !_client.connected){
+                _client = mqtt.connect(config.url, config.options);
+                _client.on('connect', resolve);
+                _client.on('error', reject);
+                _client.on('message', (topic,message) => {
+                    if (enableJSONDecoding) {
+                        let data = JSON.parse(message)
+                        if (enableUUID && (data || {}).uuid !== undefined) {
+                            _callback[data.uuid](data)
+                            delete _callback[data.uuid]
+                        }
+                    }
+                    onmassage(topic,message)
+                })
+            }
+        })
+    },
+    /**
+     * 鍙戦�佷俊鎭�
+     * @param msg 娑堟伅锛屼細琚鐞嗘垚json瀛楃涓�
+     * @param uuid 鍞竴鏍囪瘑,鍙互浼犲叆uuid锛屼篃鍙互浼犲叆true鑷姩鐢熸垚uuid锛宖lase琛ㄧず璇ユ秷鎭笉闇�瑕佸崟鐙鐞�
+     * @returns
+     */
+    send(topic: string, msg: any, uuid: string | boolean = false, options: any = undefined) {
+        return new Promise((resolve, reject) => {
+            const useUUID = enableUUID && uuid != undefined && uuid != "" && uuid != false
+            if (useUUID) {
+                if (uuid === true) {
+                    msg.uuid = generateUUID()
+                    _callback[msg.uuid] = resolve
+                } else {
+                    _callback[uuid] = resolve
+                }
+            }
+            if(enableJSONEncoding){
+                msg = JSON.stringify(msg)
+            }
+            _client.publish(topic, msg, options, err => {
+                if (err) {
+                    reject(err)
+                } else if (uuid === false) {
+                    resolve(err)
+                }
+            })
+        })
+    },
+    /**
+     * 鍏抽棴杩炴帴
+     * @returns 鍏抽棴杩炴帴鐨凱romise锛屽洖璋冨嚱鏁板彧浼氳繍琛屼竴娆�
+     */
+    close(force?: boolean, options?: any, callback?: (err: any) => void) {
+        return new Promise<void>((resolve, reject) => {
+            _client.end(force,options,()=>{
+                resolve()
+            })
+        })
+    },
+    /**
+     * 璁㈤槄浜嬩欢
+     * @param event 瑕佺洃鍚殑浜嬩欢
+     * @returns 鍦ㄥ洖璋冨嚱鏁颁腑澶勭悊浜嬩欢
+     */
+    subscribe(topic: string, options: string | undefined = undefined) {
+        return new Promise<void>((resolve, reject) => {
+            _client.subscribe(topic, options, err => {
+                if (err) {
+                    reject(err)
+                } else {
+                    resolve()
+                }
+            })
+        })
+    },
+    /**
+     * 鍙栨秷璁㈤槄浜嬩欢
+     * @param event 瑕佸彇娑堢洃鍚殑浜嬩欢
+     */
+    unsubscribe(topic: string) {
+        return new Promise<void>((resolve, reject) => {
+            _client.unsubscribe(topic, err => {
+                if (err) {
+                    reject(err)
+                } else {
+                    resolve()
+                }
+            })
+        })
+    },
+    /**
+     * 瀹氫箟榛樿鐩戝惉浜嬩欢
+     * @param callback 榛樿鐩戝惉浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onMessage(callback: (topic:string,message:string) => void) {
+        onmassage = callback
+    },
+    /**
+     * 瀹氫箟寮傚父浜嬩欢
+     * @param callback 榛樿寮傚父浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onError(callback: (data: any) => void) {
+        _client.on('error', callback)
+    },
+    /**
+     * 瀹氫箟鍏抽棴浜嬩欢
+     * @param callback 榛樿鍏抽棴浜嬩欢鐨勫鐞嗗嚱鏁�
+     */
+    onClose(callback: () => void) {
+        _client.on('disconnect', callback)
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3