From fe75cffbf3bae6777aa2794fd89fa5dc37f5df8d Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期二, 15 七月 2025 10:11: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