如何在Angular项目中使用MQTT

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文将介绍如何在Angular项目中使用MQTT协议,实现MQTT客户端与服务器的连接、订阅、收发消息等功能。

前言

Angular 是一个基于 TypeScript 构建的开发平台。它包括一个基于组件的框架,用于构建可伸缩的 Web 应用;一组完美集成的库,涵盖路由、表单管理、客户端-服务器通信等各种功能;一套开发工具,可帮助用户开发、构建、测试和更新代码。

MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议。该协议提供了一对多的消息分发和应用程序的解耦,传输消耗小,可最大限度减少网络流量,同时具有三种不同消息服务质量等级,满足不同投递需求的优势。

本文将介绍如何在 Angular 项目中使用 MQTT 协议,实现客户端与 MQTT 服务器的连接、订阅、收发消息、取消订阅等功能。

项目初始化

新建项目

示例:

ng new my-app

安装 MQTT 客户端库

本次使用的是库为 ngx-mqtt,这个库不仅仅是 MQTT.js 的包装器,用于 angular >= 2。它使用 observables 并负责订阅处理和消息路由, ngx-mqtt 非常适合具有许多组件和许多订阅者的应用程序。

通过命令行安装 ngx-mqtt,可以使用 npm 或 yarn 命令(二者选一)

 npm install ngx-mqtt --save
 yarn add ngx-mqtt

MQTT 的使用

连接 MQTT 服务器

本文将使用 EMQX 提供的免费公共 MQTT 服务器,该服务基于 MQTT 云服务器 - EMQX Cloud 创建。EMQX 是一款大规模分布式物联网 MQTT 消息服务器,可高效可靠连接海量物联网设备,实时处理分发消息与事件流数据,助力构建关键业务的物联网平台与应用。

服务器接入信息如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • WebSocket Port: 8083

连接关键代码:

import {
  IMqttMessage,
  IMqttServiceOptions,
  MqttService,
  IPublishOptions,
} from 'ngx-mqtt';
import { IClientSubscribeOptions } from 'mqtt-browser';
import { Subscription } from 'rxjs';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent {
  constructor(private _mqttService: MqttService) {
    this.client = this._mqttService;
  }
  private curSubscription: Subscription | undefined;
  connection = {
    hostname: 'broker.emqx.io',
    port: 8083,
    path: '/mqtt',
    clean: true, // 保留会话
    connectTimeout: 4000, // 超时时间
    reconnectPeriod: 4000, // 重连时间间隔
    // 认证信息
    clientId: 'mqttx_597046f4',
    username: 'emqx_test',
    password: 'emqx_test',
    protocol: 'ws',
    }
  subscription = {
    topic: 'topic/mqttx',
    qos: 0,
  };
  publish = {
    topic: 'topic/browser',
    qos: 0,
    payload: '{ "msg": "Hello, I am browser." }',
  };
  receiveNews = '';
  qosList = [
    { label: 0, value: 0 },
    { label: 1, value: 1 },
    { label: 2, value: 2 },
  ];
  client: MqttService | undefined;
  isConnection = false;
  subscribeSuccess = false;

  // 创建连接
  createConnection() {
    // 连接字符串, 通过协议指定使用的连接方式
    // ws 未加密 WebSocket 连接
    // wss 加密 WebSocket 连接
    // mqtt 未加密 TCP 连接
    // mqtts 加密 TCP 连接
    try {
      this.client?.connect(this.connection as IMqttServiceOptions)
    } catch (error) {
      console.log('mqtt.connect error', error);
    }
    this.client?.onConnect.subscribe(() => {
      this.isConnection = true
      console.log('Connection succeeded!');
    });
    this.client?.onError.subscribe((error: any) => {
      this.isConnection = false
      console.log('Connection failed', error);
    });
    this.client?.onMessage.subscribe((packet: any) => {
      this.receiveNews = this.receiveNews.concat(packet.payload.toString())
      console.log(`Received message ${packet.payload.toString()} from topic ${packet.topic}`)
    })
  }
}

订阅主题

连接 MQTT 服务器成功之后,调用当前 MQTT 实例的 subscribe 方法,传入 Topic 和 QoS 参数,即可订阅成功。

doSubscribe() {
  const { topic, qos } = this.subscription
  this.curSubscription = this.client?.observe(topic, { qos } as IClientSubscribeOptions).subscribe((message: IMqttMessage) => {
    this.subscribeSuccess = true
    console.log('Subscribe to topics res', message.payload.toString())
  })
}

取消订阅

unsubscribe 方法可以释放订阅持有的资源。

doUnSubscribe() {
  this.curSubscription?.unsubscribe()
  this.subscribeSuccess = false
}

消息发布

unsafePublish发布带有可选选项的主题的消息,如 QoS、Retain 等选项,如下所示。

doPublish() {
  const { topic, qos, payload } = this.publish
  console.log(this.publish)
  this.client?.unsafePublish(topic, payload, { qos } as IPublishOptions)
}

断开连接

disconnect 断开与 MQTT 客户端的连接,传入参数 True 表示强制断开与 MQTT 客户端的连接。

destroyConnection() {
  try {
    this.client?.disconnect(true)
    this.isConnection = false
    console.log('Successfully disconnected!')
  } catch (error: any) {
    console.log('Disconnect failed', error.toString())
  }
}

测试

我们使用 Angular 编写了如下简单的浏览器应用,该应用具备:创建连接、订阅主题、收发消息、取消订阅、断开连接等功能。
Angular MQTT Demo 图1.png

使用 MQTT 5.0 客户端工具 - MQTT X 作为另一个客户端进行消息收发测试。
MQTT 5.0 客户端工具 图2.png

在 MQTT X 发送第二条消息之前,在浏览器端进行取消订阅操作,浏览器端将不会收到 MQTT X 发送的后续消息。

总结

综上所述,我们实现了在 Angular 项目中创建 MQTT 连接,模拟了客户端与 MQTT 服务器进行订阅、收发消息、取消订阅以及断开连接的场景。

Angular 作为三大主流的前端框架之一,既能够在浏览器端使用,也能够在移动端使用,结合 MQTT 协议及 MQTT 物联网云服务 可以开发出很多有趣的应用,比如客服聊天系统或实时监控物联网设备信息的管理系统等。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.com/zh/blog/how-to-use-mqtt-in-angular

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
消息中间件 存储 传感器
RabbitMQ 在物联网 (IoT) 项目中的应用案例
【8月更文第28天】随着物联网技术的发展,越来越多的设备被连接到互联网上以收集和传输数据。这些设备可以是传感器、执行器或其他类型的硬件。为了有效地管理这些设备并处理它们产生的大量数据,需要一个可靠的消息传递系统。RabbitMQ 是一个流行的开源消息中间件,它提供了一种灵活的方式来处理和转发消息,非常适合用于物联网环境。
169 1
|
3月前
|
API 开发者 UED
PrimeFaces:JSF的魔法衣橱,解锁UI设计的无限可能!
【8月更文挑战第31天】本文介绍如何结合 JSF(JavaServer Faces)和 PrimeFaces 构建美观且功能强大的现代用户界面。PrimeFaces 提供丰富的 UI 组件库,包括按钮、输入框、数据网格等,支持现代 Web 标准,简化界面开发。文章通过具体示例展示如何使用 `<p:inputText>` 和 `<p:calendar>` 等组件创建用户表单,并用 `<p:dataTable>` 展示数据集合,提升 JSF 应用的易用性和开发效率。
60 0
|
3月前
|
开发者 安全 SQL
JSF安全卫士:打造铜墙铁壁,抵御Web攻击的钢铁防线!
【8月更文挑战第31天】在构建Web应用时,安全性至关重要。JavaServer Faces (JSF)作为流行的Java Web框架,需防范如XSS、CSRF及SQL注入等攻击。本文详细介绍了如何在JSF应用中实施安全措施,包括严格验证用户输入、使用安全编码实践、实施内容安全策略(CSP)及使用CSRF tokens等。通过示例代码和最佳实践,帮助开发者构建更安全的应用,保护用户数据和系统资源。
54 0
|
3月前
|
开发者 C# C++
揭秘:如何轻松驾驭Uno Platform,用C#和XAML打造跨平台神器——一步步打造你的高性能WebAssembly应用!
【8月更文挑战第31天】Uno Platform 是一个跨平台应用程序框架,支持使用 C# 和 XAML 创建多平台应用,包括 Web。通过编译为 WebAssembly,Uno Platform 可实现在 Web 上运行高性能、接近原生体验的应用。本文介绍如何构建高效的 WebAssembly 应用:首先确保安装最新版本的 Visual Studio 或 VS Code 并配置 Uno Platform 开发环境;接着创建新的 Uno Platform 项目;然后通过安装工具链并使用 Uno WebAssembly CLI 编译应用;最后添加示例代码并测试应用。
107 0
|
3月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
47 0
|
3月前
|
开发者 前端开发 开发框架
JSF与移动应用,开启全新交互体验!让你的Web应用轻松征服移动设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,移动设备的普及使得构建移动友好的应用变得至关重要。尽管JSF(JavaServer Faces)主要用于Web应用开发,但结合Bootstrap等前端框架,也能实现优秀的移动交互体验。本文探讨如何在JSF应用中实现移动友好性,并通过示例代码展示具体实现方法。使用Bootstrap的响应式布局和组件可以确保JSF页面在移动设备上自适应,并提供友好的表单输入和提交体验。尽管JSF存在组件库较小和学习成本较高等局限性,但合理利用其特性仍能显著提升用户体验。通过不断学习和实践,开发者可以更好地掌握JSF应用的移动友好性,为Web应用开发贡献力量。
53 0
|
3月前
|
JavaScript 开发者
从零基础到实战应用:Angular入门指南带你一步步构建你的第一个Web应用——全面介绍环境搭建、项目创建、组件开发与应用集成
【8月更文挑战第31天】本文档是针对初学者的Angular入门指南。通过详细步骤与示例代码,教你如何使用Angular CLI搭建开发环境、创建新项目、添加及配置组件,并运行首个应用。Angular是由Google开发的强大Web框架,专为高效构建复杂单页应用设计。按照本指南操作,你将能够快速上手Angular,开启Web应用开发之旅。
103 0
|
3月前
|
前端开发 JavaScript 测试技术
Angular CLI 快速入门超棒!这个提高开发效率的必备工具,带你轻松开启 Angular 项目之旅!
【8月更文挑战第31天】作为一名前端开发者,我发现Angular CLI是提升Angular项目开发效率的强大工具。它是Angular团队提供的命令行工具,能快捷创建、开发及维护项目。通过简单命令即可创建项目、生成组件、服务、模块等,并支持构建、测试与部署,大幅简化开发流程,使开发者更专注业务逻辑。项目结构清晰,便于理解和维护,极大地提高了开发效率。如果你还未尝试Angular CLI,强烈推荐一试,其便捷性定会让你爱不释手。
42 0
|
3月前
|
前端开发 JavaScript 编译器
【性能革命】Angular Ivy编译器:一场前端开发者的极速盛宴,揭秘应用瘦身与提速的黑科技,让你的Angular项目焕发新生的终极指南
【8月更文挑战第31天】Angular Ivy编译器是Angular团队推出的更新,旨在改善应用性能,减少构建时间和代码量。自Angular 9起,Ivy成为默认编译器。本文通过案例分析,介绍Ivy的工作原理及其优势。以一个复杂应用为例,展示了Ivy如何通过减少生成的JavaScript代码量、优化模板表达式解析等方式提升性能。通过创建示例项目并比较启用与未启用Ivy的构建结果,证明了Ivy在构建速度和文件大小上的显著改进,同时提高了运行时性能。这对于追求高性能和快速开发的应用至关重要。
36 0
|
3月前
|
自然语言处理 前端开发 开发者
Angular国际化的秘密武器:手把手教你打造全球化应用,从多语言支持到日期格式化,让您的Web项目无国界畅通无阻的终极指南
【8月更文挑战第31天】在全球化背景下,软件需跨越语言与文化界限。本文探讨如何在Angular应用中实现国际化(i18n)与本地化,通过具体示例介绍多语言支持的实现过程。从创建项目、生成翻译文件到配置`TranslateModule`,详细讲解如何动态切换语言及处理日期、货币等区域特定格式。通过注册特定语言数据,提升应用的全球适应性,使开发者能轻松打造高质量、多语言支持的应用。
48 0
下一篇
无影云桌面