MqttClient.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import mqtt from 'mqtt';
  2. class MqttClient {
  3. constructor(topics, onMessageCallback) {
  4. // 固定参数
  5. this.MQTT_MQTTIP = 'wss://ws.emqx.sysuimars.cn/mqtt';
  6. this.MQTT_USERNAME = 'admin';
  7. this.MQTT_PASSWORD = 'admin';
  8. this.topics = topics; // 订阅的主题数组
  9. this.onMessageCallback = onMessageCallback; // 接收数据的回调函数
  10. this.client = null;
  11. }
  12. connect() {
  13. const options = {
  14. connectTimeout: 40000,
  15. clientId: `clientid-${this.generateClientId()}`, // 生成唯一的客户端 ID
  16. username: this.MQTT_USERNAME,
  17. password: this.MQTT_PASSWORD,
  18. clean: false
  19. };
  20. // 连接 MQTT
  21. this.client = mqtt.connect(this.MQTT_MQTTIP, options);
  22. // 监听连接成功事件
  23. this.client.on('connect', () => {
  24. console.log('连接成功');
  25. this.subscribeToTopics(); // 订阅主题
  26. });
  27. // 监听消息事件
  28. this.client.on('message', (topic, message) => {
  29. this.onMessageCallback(topic, message.toString()); // 调用回调函数处理消息
  30. });
  31. // 监听重连事件
  32. this.client.on('reconnect', (error) => {
  33. console.log('正在重连...', error);
  34. });
  35. // 监听错误事件
  36. this.client.on('error', (error) => {
  37. console.log('连接失败...', error);
  38. });
  39. }
  40. // 订阅主题
  41. subscribeToTopics() {
  42. if (this.topics && this.topics.length > 0) {
  43. this.topics.forEach((topic) => {
  44. this.client.subscribe(topic, (err) => {
  45. if (!err) {
  46. console.log(`订阅成功: ${topic}`);
  47. } else {
  48. console.log(`订阅失败: ${topic}`, err);
  49. }
  50. });
  51. });
  52. } else {
  53. console.log('未提供订阅主题');
  54. }
  55. }
  56. // 生成唯一的客户端 ID
  57. generateClientId() {
  58. const S4 = () => (((1 + Math.random()) * 0x10000) | 0).toString(32).substring(1);
  59. return `${S4()}${S4()}-${S4()}-${S4()}-${S4()}-${S4()}${S4()}${S4()}`;
  60. }
  61. }
  62. export default MqttClient;