¶Ô±ÈÐÂÎļþ |
| | |
| | | import { generateUUID } from "@/utils/geek"; |
| | | import * as mqtt from "mqtt/dist/mqtt"; |
| | | const enableJSONDecoding = true // å¼å¯JSONè§£ææ¶æ¯ï¼éè¦å¼å¯JSONè§£ææ¶æ¯æè½å¼å¯uuidåevent |
| | | const enableJSONEncoding = true // å¼å¯JSONæ¶æ¯ç¼ç |
| | | const enableUUID = true // éè¦æ¥æ¶ä¿¡æ¯ä¸å
å«uuidåæ®µï¼uuidä¼å
级é«äºevent |
| | | |
| | | 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ï¼flaseè¡¨ç¤ºè¯¥æ¶æ¯ä¸éè¦åç¬å¤ç |
| | | * @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 å
³éè¿æ¥çPromiseï¼åè°å½æ°åªä¼è¿è¡ä¸æ¬¡ |
| | | */ |
| | | 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) |
| | | } |
| | | } |