From 7de165ce3fc2318681ed66494fb6da9fd700417b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期五, 12 九月 2025 10:22:23 +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